我正在创建一个通过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>
请帮我解决实际问题所在。提前致谢。
答案 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文件,然后单击“记录”按钮,最后按预期工作。
我希望它能帮助那些仍然面临这个问题的人。