我正在尝试播放声音并通过手机麦克风录制,然后将其写入文件(3gp格式)。
我使用了一些测试用途的线程。问题是我得到了像
> caused by libcore.io.ErrnoException: open failed: EROFS (read only file system)
虽然我不想尝试任何系统文件。 我环顾四周,发现this:
我添加了写入/读取权限,但仍无效。
以下是生成错误的代码:
public void startRecording(){
MediaRecorder mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"xfile.3gp");
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mRecorder.prepare();
mRecorder.start();
} catch (Exception e) {
e.printStackTrace();
}
}
和线程阻止:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread thread=new Thread(new Runnable()
{
public void run()
{
try
{
genTone();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.post(new Runnable()
{
public void run()
{
playSound();
} });
}
});
thread.start();
播放声音方法
void playSound(){
AudioTrack audioTrack= null;
try{
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length, AudioTrack.MODE_STATIC);
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
Thread thr=new Thread(new Runnable(){
public void run(){
startRecording();
}
});
thr.start();
}
catch(Exception e)
{
System.out.print(e);
}
}
答案 0 :(得分:3)
尝试
Environment.getExternalStorageDirectory().getAbsolutePath()+"/xfile.3gp"
而不是
Environment.getExternalStorageDirectory().getAbsolutePath()+"xfile.3gp"
请注意,您的版本最终可能
/sdcardxfile.3gp
而不是
/sdcard/xfile.3gp
因此read only file system
错误
答案 1 :(得分:0)
我很晚才对这个问题发表评论,但我相信我可以帮助别人。
我正在开发一个呼叫记录器应用程序并且有同样的错误。我在android 4.4.2上检测到了这个bug。我通过卸载SD卡解决了这个问题。我知道这不是解决方案。但你也可以使用它。