open Failed:EROFS只读文件系统android

时间:2014-04-17 13:56:19

标签: android multithreading file audio io

我正在尝试播放声音并通过手机麦克风录制,然后将其写入文件(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);
        }
}

2 个答案:

答案 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卡解决了这个问题。我知道这不是解决方案。但你也可以使用它。