2014-05-23 3 views
0

Я создаю веб-приложение, в котором запись выполняется с помощью апплета. Когда я запускаю свою программу на просмотрщике апплета с помощью eclipse, он записывает мой голос и сохраняет его на моем компьютере, но когда я запускаю то же самое с помощью html-файла в браузере, он открывает апплет, но не записывает мой голос.Как записать голос в браузере с помощью апплета в java

Даже я подписал файл проекта jar, но это не имело никакого значения. Это всегда вызывает исключение, подобное этому java.security.AccessControlException: доступ запрещен (javax.sound.sampled.AudioPermission record).

Вот пример кода:

public class AudioRecorder extends JApplet { 

private static final long serialVersionUID = 1L; 
AudioFormat audioFormat; 
TargetDataLine targetDataLine; 
final JButton captureBtn = new JButton("Capture"); 
final JButton stopBtn = new JButton("Stop");  
final JPanel btnPanel = new JPanel(); 
AudioFileFormat.Type[] fileTypes; 

@Override 
public void init() { 
    // TODO Auto-generated method stub 
    super.init(); 
    new AudioRecorder();   
} 

public AudioRecorder() { 
    captureBtn.setEnabled(true); 
    stopBtn.setEnabled(false); 

    captureBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      captureBtn.setEnabled(false); 
      stopBtn.setEnabled(true);    
      captureAudio(); 
      } 
     } 
    ); 

    stopBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      captureBtn.setEnabled(true); 
      stopBtn.setEnabled(false);        
      stopAudio();     
      }   
     } 
    ); 

    getContentPane().add(captureBtn); 
    getContentPane().add(stopBtn); 
    getContentPane().setLayout(new FlowLayout());  
    setSize(300, 120); 
    setVisible(true); 
} 

private void captureAudio() {  
    try {   
     audioFormat = getAudioFormat(); 
     DataLine.Info dataLineInfo = new DataLine.Info(
       TargetDataLine.class, audioFormat); 
     targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo); 
     new CaptureThread().start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.exit(0); 
    } 
} 

private void stopAudio() {  
     targetDataLine.stop(); 
     targetDataLine.close();      
} 

private AudioFormat getAudioFormat() { 
    float sampleRate = 8000.0F; 
    // 8000,11025,16000,22050,44100 
    int sampleSizeInBits = 16; 
    // 8,16 
    int channels = 1; 
    // 1,2 
    boolean signed = true; 
    // true,false 
    boolean bigEndian = false; 
    // true,false 
    return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, 
      bigEndian); 
} 

class CaptureThread extends Thread { 
    public void run() {   
     AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;    
     File audioFile = new File("audio." + fileType.getExtension());   
     try { 
      targetDataLine.open(audioFormat); 
      targetDataLine.start(); 
      AudioSystem.write(new AudioInputStream(targetDataLine), 
        fileType, audioFile); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}

Вот HTML коде страницы:

<HTML> 
<HEAD> 
</HEAD> 
<BODY> 
<div> 
<APPLET CODE="AudioRecorder.class" WIDTH="800" HEIGHT="500"> 
<param name="permissions" value="sandbox"> 
</APPLET> 
</div> 
</BODY> 
</HTML> 

Пожалуйста, помогите мне, где актуальна проблема. Заранее спасибо.

+0

Нужно указать, где ваш апплет должен сохранять файлы? Вы создали этот каталог? Является ли он доступным для записи?Я замечаю, что ваш HTML говорит, что он использует изолированные разрешения, может ли это быть возможной причиной? Я не программист на Java, но всегда есть некоторые сходства в том, как все происходит, скажем, на серверах. – Kinnectus

+0

Возможный дубликат [Security Exception в самописном звукозаписывающем устройстве Applet] (http://stackoverflow.com/questions/7709377/security-exception-in-self-signed-sound-recorder-applet) –

+2

* «Даже я подписал мой файл проекта jar .. "* Не так много смысла в том, что HTML не использует файл Jar, а файл класса free (не в Jar). –

ответ

0

Спасибо, ребята, я получил некоторые идеи отсюда и сегодня решил проблему, и теперь она работает отлично.

I: Я упомянул записанный путь звука, чтобы сохранить его на диске D моего компьютера [Примечание: это жестко закодированное местоположение только для целей тестирования].

II: Я прошел процедуру регистрации моего проекта и предоставил требуемые разрешения с использованием java-документов. http://docs.oracle.com/javase/tutorial/security/toolsign/ [Эта процедура наиболее важна для устранения этой проблемы AudioPermission].

III. Чтобы создать отдельный файл политики специально для моего проекта с помощью инструмента политики и псевдонима хранилища ключей, я добавил FilePermission для всех файлов и для всех операций, то есть для чтения, записи, выполнения, удаления. Еще раз, я добавил запись javax.sound.sampled.AudioPermission, оба были добавлены с именем псевдонима kiystore signedBy. [Подробнее см. Последние шаги, приведенные в приведенной выше ссылке]

IV: Я создал новый HTML-файл, удалил метку параметра разрешения песочницы из html-файла и включил ARCHIVE = "signedjar.jar" в качестве атрибута в Тег APPLET. Итак, новый код HTML файла -

<HTML> 
<HEAD> 
</HEAD> 
<BODY> 
<div> 
<APPLET CODE="AudioRecorder.class" ARCHIVE="signedjar.jar" WIDTH="800" HEIGHT="500"> 
</APPLET> 
</div> 
</BODY> 
</HTML> 

[Это один был использован для загрузки HTML непосредственно в браузере после того, как все было сделано успешно, поэтому я сохранил его безопасным для использования в будущем и перешел к следующему шагу. Снова важная вещь, я сохранил html-файл, подписанную банку и новый файл политики в той же папке. Вы можете изменить каталог или поместить эти файлы в другое место, если хотите, но в моем случае я исправлял проблему, поэтому я сделал это.]

V: Я удалил файлы кеша из временных файлов интернет-файлов, присутствующих в панели управления Java [Перейдите в Панель управления> Java> Из временных интернет-файлов, щелкните по настройкам> Удалить файлы]

VI: Я снова запустил html-файл в браузере, а затем нажал кнопку записи, и, наконец, он работал, как ожидалось.

Я надеюсь, что это поможет другим, которые все еще сталкиваются с этой проблемой.