如何使用java中的applet在浏览器上录制语音

时间:2014-05-23 06:41:16

标签: java swing applet awt japplet

我正在创建一个通过applet完成录制的Web应用程序。当我使用eclipse在applet viewer上运行我的程序时,它会记录我的声音并将其保存到我的计算机中,但是当我在浏览器上使用html文件运行时,它会打开applet但不记录我的声音。

即使我已经签署了我的项目jar文件,但这没有任何区别。它总是会抛出一个异常,例如 java.security.AccessControlException:access denied(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>

请帮我解决实际问题所在。提前致谢。

1 个答案:

答案 0 :(得分:0)

谢谢大家,我从这里得到了一些想法,并在今天晚上解决了这个问题,现在它的工作非常完美。

我:我提到录制的声音路径将其保存到我的电脑的D驱动器[注意:这是硬编码的位置仅用于测试目的]。

II:我已经完成了签署项目的过程,并使用java docs http://docs.oracle.com/javase/tutorial/security/toolsign/授予了所需的权限[此过程对于修复此AudioPermission问题非常重要]。

III:要使用策略工具和密钥库别名专门为我的项目创建单独的策略文件,我为所有文件和所有操作(即读取,写入,执行,删除)添加了FilePermission。再次,我添加了javax.sound.sampled.AudioPermission记录,两者都添加了signedBy我的项目的密钥库别名。 [有关详细信息,请查看上面给出的链接中提供的最后几个步骤]

IV:我创建了一个新的HTML文件,从html文件中删除了sandbox权限参数标记,并在ARCHET标记中包含ARCHIVE =“signedjar.jar”作为属性。因此,新的HTML文件代码是 -

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

[这个用于在所有内容成功完成后直接在浏览器上加载html,因此我保持安全以备将来使用并继续下一步。同样重要的是,我将html文件,签名jar和新创建的策略文件保存到同一文件夹中。如果您愿意,您可以更改目录或将这些文件放在不同的位置,但在我的情况下,我正在修复问题,这就是我这样做的原因。]

V:我从Java控制面板中的临时Internet文件选项中删除了缓存文件[转到控制面板&gt; Java&gt;从临时互联网文件,点击设置&gt;删除文件]

VI:我在浏览器上再次运行html文件,然后单击“记录”按钮,最后按预期工作。

我希望它能帮助那些仍然面临这个问题的人。