3

我正在学习如何使用http://developer.android.com/guide/topics/media/audio-capture.html#example录制音频

一切正常,但我想切换:

mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mFileName += "/audiorecordtest.3gp";

mFileName = getFilesDir().getAbsolutePath();
mFileName += "/audiorecordtest.3gp";

但我得到这个错误

08-19 15:51:44.212: E/MediaPlayer(6654): error (1, -2147483648)
08-19 15:51:44.212: E/AudioRecordTest(6654): prepare() failed

我试图记录我的新代码(以确保我使用的是有效路径)。

笔记:

适用于我的三星 Galaxy,但不适用于我的 Nexus One。我希望它适用于 2.x、3.x 和 4.x

更新: 我在 startRecording() 中添加了一个日志:

mRecorder.setOutputFile(mFileName);
        Log.e("LOG", mFileName);

该日志的输出是:

08-22 12:28:40.112: E/LOG(9666): /data/data/com.example.testrecorder/files/audiorecordtest.3gp

尝试记录异常:

  private void startPlaying() {
        mPlayer = new MediaPlayer();
        try {
            mPlayer.setDataSource(mFileName);
            mPlayer.prepare();
            mPlayer.start();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed", e);
        }
    }

08-22 13:08:03.158: E/MediaPlayer(10093): error (1, -2147483648)
08-22 13:08:03.168: E/AudioRecordTest(10093): prepare() failed
08-22 13:08:03.168: E/AudioRecordTest(10093): java.io.IOException: Prepare failed.: status=0x1
08-22 13:08:03.168: E/AudioRecordTest(10093):   at android.media.MediaPlayer.prepare(Native Method)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at com.example.testrecorder.MainActivity.startPlaying(MainActivity.java:51)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at com.example.testrecorder.MainActivity.onPlay(MainActivity.java:41)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at com.example.testrecorder.MainActivity.access$1(MainActivity.java:39)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at com.example.testrecorder.MainActivity$PlayButton$1.onClick(MainActivity.java:113)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at android.view.View.performClick(View.java:2532)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at android.view.View$PerformClick.run(View.java:9308)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at android.os.Handler.handleCallback(Handler.java:587)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at android.os.Handler.dispatchMessage(Handler.java:92)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at android.os.Looper.loop(Looper.java:150)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at android.app.ActivityThread.main(ActivityThread.java:4333)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at java.lang.reflect.Method.invokeNative(Native Method)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at java.lang.reflect.Method.invoke(Method.java:507)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-22 13:08:03.168: E/AudioRecordTest(10093):   at dalvik.system.NativeStart.main(Native Method)
4

2 回答 2

10

当您创建一个新MediaPlayer对象时,它实际上并不是您的应用程序的一部分,而是系统的一部分。因为这是真的,所以它无法读取应用程序私有目录中的文件,除非它们是WORLD_READABLE. 这就是为什么它适用于外部目录而不是您的内部目录。是的,这听起来很荒谬,我同意。

您应该能够通过创建 aFileDescriptor并将其传递给MediaPlayer该方式来解决此问题:

FileInputStream fis = new FileInputStream(mFileName);
mPlayer.setDataSource(fis.getFD());

注意:gtkandroid给出了更详尽的解释,这是我通过bug tracker找到的。如果这对你有用,我建议你也支持他对另一个问题的回答。

于 2013-08-22T17:31:00.150 回答
0

因此,使用该代码,我不得不将文件名的创建移到构造函数之外并进入onCreate(). Context还不是有效的,所以你应该得到一个错误getFilesDir().getAbsolutePath()

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    LinearLayout ll = new LinearLayout(this);
    mRecordButton = new RecordButton(this);
    ll.addView(mRecordButton,
        new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            0));
    mPlayButton = new PlayButton(this);
    ll.addView(mPlayButton,
        new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            0));
    setContentView(ll);

    mFileName = getFilesDir().getAbsolutePath();
    mFileName += "/audiorecordtest.3gp";
}
于 2013-08-20T21:49:48.643 回答