[英]How to record voice on browser using applet in java
我正在创建一个通过applet进行录制的Web应用程序。 当我使用eclipse在applet viewer上运行程序时,它会记录我的声音并将其保存到我的计算机中,但是当我在浏览器中使用html文件运行该程序时,它会打开applet但不会记录我的声音。
即使我已经签署了我的项目jar文件,但这没有任何区别。 它总是抛出类似java.security.AccessControlException的异常:访问被拒绝(javax.sound.sampled.AudioPermission记录) 。
这是示例代码:
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 Page源代码:
<HTML>
<HEAD>
</HEAD>
<BODY>
<div>
<APPLET CODE="AudioRecorder.class" WIDTH="800" HEIGHT="500">
<param name="permissions" value="sandbox">
</APPLET>
</div>
</BODY>
</HTML>
请帮我解决实际问题所在。 提前致谢。
谢谢大家,我从这里得到了一些想法,今天晚上已解决了该问题,现在一切正常。
我:我提到了录制的声音路径,将其保存到“我的电脑”的D驱动器中[注意:这是硬编码的位置,仅供测试]。
II:我已经完成了使用Java docs http://docs.oracle.com/javase/tutorial/security/toolsign/签署该项目的过程并授予了必需的权限[此过程对于解决此AudioPermission问题最重要]。
III:要使用策略工具和密钥库别名为我的项目专门创建一个单独的策略文件,我为所有文件和所有操作(即read,write,execute,delete)添加了FilePermission。 再次,我添加了javax.sound.sampled.AudioPermission记录,两个记录均已添加,并带有我的项目的密钥库别名。 [有关更多详细信息,请执行上面给出的链接中提供的最后几个步骤]
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文件,签名的jar和新创建的策略文件保存在同一文件夹中。 您可以根据需要更改目录或将这些文件放置在其他位置,但就我而言,我正在解决此问题,这就是我这样做的原因。]
V:我从Java控制面板中存在的Internet临时文件选项中删除了缓存文件[转到控制面板> Java>从Internet临时文件中,单击设置>删除文件]
VI:我再次在浏览器上运行html文件,然后单击“记录”按钮,终于按预期运行。
我希望它可以帮助仍然面临此问题的其他人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.