Odd RuntimeException при использовании MediaRecorder

Мой код выглядит следующим образом:

private void startRecording() {
            try {

                mFileName = getActivity().getDir("testDir", MODE_PRIVATE).getAbsolutePath();
                mFileName += "/audiorecordtest.3gp";
                Log.i(LOG_TAG, mFileName);
                //FileOutputStream fos = getActivity().getApplicationContext().openFileOutput(mFileName, Context.MODE_PRIVATE);

                mRecorder = new MediaRecorder();
                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                mRecorder.setOutputFile(mFileName);
                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
                mRecorder.setAudioEncodingBitRate(16);
                mRecorder.setAudioSamplingRate(44100);
                mRecorder.prepare();
            } catch (IOException e) {
                Log.e(LOG_TAG, "prepare() failed" + e.getLocalizedMessage());
            } catch(RuntimeException re){
                Log.e(LOG_TAG, "runtime exception" + re.getLocalizedMessage());
            }
            mRecorder.start();
        }

Когда я пытаюсь запустить приложение на эмуляторе (или на своем телефоне), приложение падает, и я получаю следующий журнал LogCat:

03-05 12:14:46.770: I/AudioRecordTest(5035): /data/data/com.example.test/app_testDir/audiorecordtest.3gp
03-05 12:14:46.890: E/MediaRecorder(5035): start failed: -2147483648
03-05 12:14:46.890: D/AndroidRuntime(5035): Shutting down VM
03-05 12:14:46.900: W/dalvikvm(5035): threadid=1: thread exiting with uncaught exception (group=0xb1a2aba8)
03-05 12:14:46.960: E/AndroidRuntime(5035): FATAL EXCEPTION: main
03-05 12:14:46.960: E/AndroidRuntime(5035): Process: com.example.test, PID: 5035
03-05 12:14:46.960: E/AndroidRuntime(5035): java.lang.RuntimeException: start failed.
03-05 12:14:46.960: E/AndroidRuntime(5035):     at android.media.MediaRecorder.start(Native Method)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at com.example.test.MainActivity$RecordPlayFragment.startRecording(MainActivity.java:331)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at com.example.test.MainActivity$RecordPlayFragment.onRecord(MainActivity.java:277)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at com.example.test.MainActivity$RecordPlayFragment.access$0(MainActivity.java:275)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at com.example.test.MainActivity$RecordPlayFragment$RecordButton$1.onClick(MainActivity.java:345)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at android.view.View.performClick(View.java:4438)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at android.view.View$PerformClick.run(View.java:18422)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at android.os.Handler.handleCallback(Handler.java:733)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at android.os.Handler.dispatchMessage(Handler.java:95)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at android.os.Looper.loop(Looper.java:136)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at android.app.ActivityThread.main(ActivityThread.java:5017)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at java.lang.reflect.Method.invokeNative(Native Method)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at java.lang.reflect.Method.invoke(Method.java:515)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-05 12:14:46.960: E/AndroidRuntime(5035):     at dalvik.system.NativeStart.main(Native Method)

Мне просто интересно, знает ли кто-нибудь, что здесь происходит, так как после поиска в Google я не нашел ничего похожего на ту же ошибку.


person user1799107    schedule 05.03.2014    source источник
comment
Вы уверены, что файл создается в папке, в которой у вас есть права на запись?   -  person Merlevede    schedule 05.03.2014
comment
Да, я уверен, что смогу. Только что сделал несколько быстрых тестов для проверки File testFile = new File(getActivity().getDir("testDir", MODE_PRIVATE).getAbsolutePath()); Log.i("LOG_TAG", "testFile can write: " + testFile.canWrite()); Log.i("LOG_TAG", "testFile path: " + testFile.getAbsolutePath()); Также этот каталог должен быть просто каталогом данных приложения, поэтому я должен иметь доступ к нему и писать в него.   -  person user1799107    schedule 05.03.2014
comment
Вы добавили разрешение android.permission.RECORD_AUDIO в манифест?   -  person Mario    schedule 05.03.2014
comment
Да, все разрешения есть.   -  person user1799107    schedule 05.03.2014
comment
что, если вы поместите mRecorder.start(); в блок try, чтобы посмотреть, поймает ли он что-нибудь там! К сожалению, java.lang.RuntimeException: start failed. не очень помогает :/   -  person Mario    schedule 05.03.2014
comment
Улавливание .start() на самом деле ничего не добавляет к отладке, к сожалению. Я просто переписываю код, чтобы посмотреть, не пропустил ли я что-то.   -  person user1799107    schedule 05.03.2014


Ответы (1)


Добавлено в:

File tempFile = new File(mFileName);

И изменил mediaRecorder.setOutputFile на:

mRecorder.setOutputFile(tempFile.getPath());

Даже не уверен, почему это не работает с файловыми потоками, но так оно и работает.

person user1799107    schedule 05.03.2014