Ошибка при остановке записи звука

Я хочу записать звук с микрофона и сохранить аудиофайл. Начать запись работает нормально, но когда я пытаюсь остановить запись, эмулятор дает силовую ошибку. Трассировки стека:

01-09 18:16:59.075: E/AndroidRuntime(831): FATAL EXCEPTION: main
01-09 18:16:59.075: E/AndroidRuntime(831): java.lang.IllegalStateException
01-09 18:16:59.075: E/AndroidRuntime(831):  at android.media.MediaRecorder.stop(Native Method)
01-09 18:16:59.075: E/AndroidRuntime(831):  at com.example.voice.recorder.MainActivity.StopRecording(MainActivity.java:45)
01-09 18:16:59.075: E/AndroidRuntime(831):  at com.example.voice.recorder.MainActivity$1.onClick(MainActivity.java:76)
01-09 18:16:59.075: E/AndroidRuntime(831):  at android.view.View.performClick(View.java:3511)
01-09 18:16:59.075: E/AndroidRuntime(831):  at android.view.View$PerformClick.run(View.java:14105)
01-09 18:16:59.075: E/AndroidRuntime(831):  at android.os.Handler.handleCallback(Handler.java:605)
01-09 18:16:59.075: E/AndroidRuntime(831):  at android.os.Handler.dispatchMessage(Handler.java:92)
01-09 18:16:59.075: E/AndroidRuntime(831):  at android.os.Looper.loop(Looper.java:137)
01-09 18:16:59.075: E/AndroidRuntime(831):  at android.app.ActivityThread.main(ActivityThread.java:4424)
01-09 18:16:59.075: E/AndroidRuntime(831):  at java.lang.reflect.Method.invokeNative(Native Method)
01-09 18:16:59.075: E/AndroidRuntime(831):  at java.lang.reflect.Method.invoke(Method.java:511)
01-09 18:16:59.075: E/AndroidRuntime(831):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-09 18:16:59.075: E/AndroidRuntime(831):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-09 18:16:59.075: E/AndroidRuntime(831):  at dalvik.system.NativeStart.main(Native Method)

Это дает ошибку в MediaRecorder.stop (); Вот как я пытаюсь остановить запись:

public void StopRecording() throws IOException{
    recorder.stop();
    recorder.reset();
    recorder.release();
    recorder = null;
}

Как начать запись:

public class MainActivity extends Activity {
    MediaRecorder recorder;
public void StartRecording(){
    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile("/sdcard/sample.3gp");
    try {
        recorder.prepare();
        recorder.start();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}   

И как я называю метод:

            if (!tv.getText().equals("Recording...")){
                tv.setText("Recording...");
                tv.setTextColor(Color.RED);
                record.setImageResource(R.drawable.microphone_icon_pressed);
                StartRecording();

            }else{
                tv.setText("Click the button to start recording");
                record.setImageResource(R.drawable.microphone_icon);
                tv.setTextColor(Color.BLACK);
                try {
                    StopRecording();
                } catch (IOException e) {
                   //TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

У меня есть два разрешения в моем манифесте:



Так что начало записи работает нормально, но прекратить запись нет. Кто-нибудь знает, что не так с кодом?

Заранее спасибо, Саймон

4
nl ja de
Я редактировал свой вопрос с кодом того, как я начинаю запись
добавлено автор Simon, источник
Я снова редактировал вопрос
добавлено автор Simon, источник
Не могли бы вы добавить немного больше контекста для вашего кода, например. как/где вы объявляете recorder ? (если это нестатический член BroadcastReceiver ), вы можете столкнуться с такими проблемами, например).
добавлено автор Michael, источник
Я не имел в виду, как вы начинаете записывающее устройство, но также как и где вы его объявляете. Каким типом объектов являются эти переменные и методы?
добавлено автор Michael, источник
Не повторяйте тег в вопросе. Я отредактировал его.
добавлено автор Simon, источник

1 ответы

Очевидно, что ваш рекордер не находится в состоянии записи. вы должны убедиться, что он успешно запущен. Потому что IllegalStateException возникает при вызове stop() перед запуском (). И добавьте RuntimeException в ваш блок stop (), если он будет удален, а затем удалите выходной файл.

See MediaRecorder.java

  /**
     * Stops recording. Call this after start(). Once recording is stopped,
     * you will have to configure it again as if it has just been constructed.
     * Note that a RuntimeException is intentionally thrown to the
     * application, if no valid audio/video data has been received when stop()
     * is called. This happens if stop() is called immediately after
     * start(). The failure lets the application take action accordingly to
     * clean up the output file (delete the output file, for instance), since
     * the output file is not properly constructed when this happens.
     *
     * @throws IllegalStateException if it is called before start()
     */
    public native void stop() throws IllegalStateException;

Я также рекомендую не выпускать рекордер, пока ваше приложение не будет закрыто, если вам нужно начать и остановить его последовательно. В соответствии со следующим потоком создайте рекордер onCreate ()/onResume() и отпустите onPause/onDestroy ().

enter image description here

0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)