Android Media Recording: java.ленг.RuntimeException: ошибка запуска

Я работаю над записями телефонных звонков. Когда я начинаю запись телефонного звонка, то, к сожалению, останавливаюсь. и это дает ошибку ошибка запуска MediaRecorder -2147483648. Я ссылаюсь на этот ответ ссылке. Но я не понимаю. Пожалуйста, скажите в чем проблема в моем коде? Вот мой код.

public class IncomingCall extends BroadcastReceiver {

Context pcontext;
private static MediaRecorder recorder;
private boolean recordedStart = false;

@SuppressWarnings("unchecked")
public void onReceive(Context context, Intent intent) {
    pcontext = context;
    recorder = new MediaRecorder();

try {
            TelephonyManager tmgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            MyPhoneStateListener PhoneListener = new MyPhoneStateListener();
            tmgr.listen(PhoneListener, PhoneStateListener.LISTEN_CALL_STATE);

    } catch (Exception e) {
        Log.e("Phone Receive Error", " " + e);
    }

}

private class MyPhoneStateListener extends PhoneStateListener {
    public void onCallStateChanged(int state, String incomingNumber) {



        switch (state) {
        case TelephonyManager.CALL_STATE_RINGING:
            Log.e("MyPhoneListener",state+"   incoming no:"+incomingNumber);
            Log.e("CALL_STATE_RINGING", "CALL_STATE_RINGING");

            break;

        case TelephonyManager.CALL_STATE_OFFHOOK:

            recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            recorder.setOutputFile(Environment.getExternalStorageDirectory()+"/MyRecorder.mp3");
            Log.e("Path", ""+Environment.getExternalStorageDirectory()+"/MyRecorder.mp3");
            try {
                recorder.prepare();
                recorder.start();
                recordedStart = true;
                Log.e("Start", "Recorder Start");
            } catch (IllegalStateException | IOException e) {
                // TODO Auto-generated catch block
                Log.e("Error", ""+e);
            }

            break;
        case TelephonyManager.CALL_STATE_IDLE:
            Log.e("CALL_STATE_IDLE", "CALL_STATE_IDLE");
            if (recordedStart == true) {
                recorder.stop();
                recorder.release();
                recordedStart = false;
                Log.e("Stop", "Recorder Stop");
            }
            break;
        }
    }
}

}

Чтение Logcat Ошибки

05-05 10:57:23.771: E/MediaRecorder(12812): start failed: -2147483648
05-05 10:57:23.771: D/AndroidRuntime(12812): Shutting down VM
05-05 10:57:23.771: W/dalvikvm(12812): threadid=1: thread exiting with uncaught exception (group=0x416bdd40)
05-05 10:57:23.774: E/AndroidRuntime(12812): FATAL EXCEPTION: main
05-05 10:57:23.774: E/AndroidRuntime(12812): Process: web.revolution.autocallanswer, PID: 12812
05-05 10:57:23.774: E/AndroidRuntime(12812): java.lang.RuntimeException: start failed.
05-05 10:57:23.774: E/AndroidRuntime(12812):    at android.media.MediaRecorder.start(Native Method)
05-05 10:57:23.774: E/AndroidRuntime(12812):    at web.revolution.autocallanswer.IncomingCall$MyPhoneStateListener.onCallStateChanged(IncomingCall.java:98)
05-05 10:57:23.774: E/AndroidRuntime(12812):    at android.telephony.PhoneStateListener.handleMessage(PhoneStateListener.java:389)
05-05 10:57:23.774: E/AndroidRuntime(12812):    at android.os.Handler.dispatchMessage(Handler.java:102)
05-05 10:57:23.774: E/AndroidRuntime(12812):    at android.os.Looper.loop(Looper.java:136)
05-05 10:57:23.774: E/AndroidRuntime(12812):    at android.app.ActivityThread.main(ActivityThread.java:5102)
05-05 10:57:23.774: E/AndroidRuntime(12812):    at java.lang.reflect.Method.invokeNative(Native Method)
05-05 10:57:23.774: E/AndroidRuntime(12812):    at java.lang.reflect.Method.invoke(Method.java:515)
05-05 10:57:23.774: E/AndroidRuntime(12812):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
05-05 10:57:23.774: E/AndroidRuntime(12812):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
05-05 10:57:23.774: E/AndroidRuntime(12812):    at dalvik.system.NativeStart.main(Native Method)
05-05 10:57:25.586: I/Process(12812): Sending signal. PID: 12812 SIG: 9
05-05 10:57:27.052: E/CALL_STATE_IDLE(13255): CALL_STATE_IDLE

3 ответов


эта проблема, вызванная этим источником звука

   recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);

не работает на вашем устройстве и Android! измените это на

   recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

или других источников.

также вы можете удалить FC путем изменения recorderstart (), чтобы попробовать/поймать с IllegalStateException, исключение же, как это

        try {
        recorder.prepare();

    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        Log.d("ERROR ","IllegalStateException");
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.d("ERROR ","IOException");
        e.printStackTrace();
    } 
    try {
    recorder.start();
    } catch (Exception e) {

    }

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


я столкнулся с той же проблемой, когда попытался записать VOICE_CALL/VOICE_DOWNLINK/VOICE_UPLINK на моем Nexus5. Я не хочу долго говорить, эта проблема нерешительна на многих смартфонах под Android. Но есть несколько устройств, которые обычно работают с этим источником звука. Одним из них является Samsung Note3 (Android 4.3). Я попробовал это устройство и все было в порядке. Как я слышал, эта проблема появится снова, когда обновление 4.4.2 / 3 достигнет Note3, вероятно, из-за коллизии с законодательством США. Но теперь вы можете использовать эту функцию на Note3 без каких-либо условий.

Если вы используете этот источник звука на другом устройстве, вам придется предотвратить сбой приложения с помощью этого кода:

try {
    mRecorder.start();
    } catch (Throwable t) {
        t.printStackTrace();
        Log.w(LOG_TAG, t);
    }

тогда у вас не будет никаких проблем с этим вопросом...

какое другое устройство, которое будет работать нормально с этим источником, я не знаю. Я тестировал только на Note3. Интересно, как это работает на Galaxy3 / 4 / 5.


Я знаю, что поздно отвечать, но для других, у которых такая же проблема, мое решение-установить источник звука в MediaRecorder.AudioSource.VOICE_COMMUNICATION, поэтому качество голоса приемника не уменьшается.