Error MediaRecorder -2147483648

I intend to record calls with this application. But when I set the audioSource to MediaRecorder.AudioSource.VOICE_CALL, it gives an error message, but when the audio source is set to MediaRecorder.AudioSource.MIC, it works fine. I am not sure where the problem is. The problem locator is shown below. Any form of help is appreciated. Thanks.

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) 
+2
source share
1 answer

Perhaps the device on which your application is running either does not support voice call recording at all, or that it does not like one or more of the parameters that you tried to set. For example, you can try to use the sampling frequency of 8000 Hz instead of 44100 Hz (44100 Hz does not make sense for AMR-NB anyway) and completely get rid of the call to setAudioEncodingBitRate .

Another potential problem with your code is that you have an instance of MediaRecorder in your BroadcastReceiver object and have not declared it static. Here's what the Android documentation has to say about BroadcastReceivers:

The BroadcastReceiver object is valid only for the duration of the onReceive call (Context, Intent). As soon as your code returns from this function, the system considers the object finished and no longer active.

In other words, the MediaRecorder instance that you expect to be present when you receive a broadcast containing EXTRA_STATE_IDLE may not actually exist anymore since you are in a different BroadcastReceiver instance than the one that MediaRecorder created.

+3
source

All Articles