Ошибка запуска MediaRecorder -2147483648

Я намерен записывать звонки с помощью этого приложения. Но когда я устанавливаю для audioSource значение MediaRecorder.AudioSource.VOICE_CALL, выдается ошибка, но когда для audioSource установлено значение MediaRecorder.AudioSource.MIC, все работает отлично. Я не уверен, где проблема. Логкэт проблемы ниже. Любая форма помощи приветствуется. Спасибо.

public class IncomingCallReceiver extends BroadcastReceiver {
private MediaRecorder mRecorder;
@Override
public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if(null == bundle)
                return;
        String state = bundle.getString(TelephonyManager.EXTRA_STATE);
        if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING))
        {
        }
        else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){
            Log.i("TelephonyManager", "Call picked up");
            mRecorder = new MediaRecorder();
            mRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mRecorder.setAudioEncodingBitRate(16);
            mRecorder.setAudioSamplingRate(44100);
            mRecorder.setOutputFile("/sdcard/Recording/callrecord.mp4");
            try{
                mRecorder.prepare();
            }
            catch(IOException e){
            }
            mRecorder.start();
            Log.i("StartRecordingCall", "Recording Call end");
        }
        else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){
            Log.i("TelephonyManager", "Call hunged up");
            mRecorder.stop();
            mRecorder.release();
            mRecorder=null;
        }
}

/

    12-18 20:15:56.755: E/MediaRecorder(1577): start failed: -2147483648
    12-18 20:15:56.755: D/AndroidRuntime(1577): Shutting down VM
    12-18 20:15:56.755: W/dalvikvm(1577): threadid=1: thread exiting with uncaught exception (group=0x2b542210)
    12-18 20:15:56.765: E/AndroidRuntime(1577): FATAL EXCEPTION: main
    12-18 20:15:56.765: E/AndroidRuntime(1577): java.lang.RuntimeException: start failed.
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at android.media.MediaRecorder.start(Native Method)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at com.example.callrecorder.MainActivity.startRecording(MainActivity.java:447)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at com.example.callrecorder.MainActivity.onClick(MainActivity.java:279)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at android.view.View.performClick(View.java:3534)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at android.view.View$PerformClick.run(View.java:14263)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at android.os.Handler.handleCallback(Handler.java:605)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at android.os.Handler.dispatchMessage(Handler.java:92)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at android.os.Looper.loop(Looper.java:137)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at android.app.ActivityThread.main(ActivityThread.java:4441)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at java.lang.reflect.Method.invokeNative(Native Method)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at java.lang.reflect.Method.invoke(Method.java:511)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    12-18 20:15:56.765: E/AndroidRuntime(1577):     at dalvik.system.NativeStart.main(Native Method)

person Chewy    schedule 18.12.2012    source источник


Ответы (1)


Возможно, устройство, на котором запущено ваше приложение, либо вообще не поддерживает запись голосовых вызовов, либо ему не нравятся один или несколько параметров, которые вы пытались установить.
Например, вы можно попробовать использовать частоту дискретизации 8000 Гц вместо 44100 Гц (в любом случае 44100 Гц не имеет смысла для AMR-NB) и вообще избавиться от вызова setAudioEncodingBitRate.

Другая потенциальная проблема с вашим кодом заключается в том, что у вас есть экземпляр MediaRecorder в вашем объекте BroadcastReceiver, и вы не объявили его статическим. Вот что говорится в документации Android о BroadcastReceivers:

Объект BroadcastReceiver действителен только на время вызова onReceive(Context, Intent). Как только ваш код возвращается из этой функции, система считает, что объект завершен и больше не активен.

Другими словами, экземпляр MediaRecorder, который, как вы ожидаете, будет там, когда вы получите широковещательную передачу, содержащую EXTRA_STATE_IDLE, на самом деле может больше не существовать, поскольку вы находитесь в другом экземпляре BroadcastReceiver, отличном от того, который создал MediaRecorder.

person Michael    schedule 18.12.2012
comment
Я пробовал с другим устройством, которым является мой Samsung s3, и он работает, но когда я пробовал с моим xperia arc s, он, похоже, не работает. Вы правы, говоря, что это на самом деле зависит от устройства. - person Chewy; 20.12.2012