android - MediaRecorder启动失败-2147483648

标签 android mediarecorder

我打算使用此应用程序录制通话。但是当我将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)

最佳答案

您运行应用的设备可能根本不支持语音通话录音,或者不喜欢您尝试设置的一个或多个参数。
例如,您可以尝试使用 8000 Hz 采样率而不是 44100 Hz(无论如何,44100 Hz 对于 AMR-NB 来说毫无意义),并完全取消对 setAudioEncodingBitRate 的调用。

您的代码的另一个潜在问题是您的 BroadcastReceiver 对象中有 MediaRecorder 实例,但尚未将其声明为静态。以下是 Android 文档中有关 BroadcastReceiver 的说明:

A BroadcastReceiver object is only valid for the duration of the call to onReceive(Context, Intent). Once your code returns from this function, the system considers the object to be finished and no longer active.

换句话说,当您收到包含 EXTRA_STATE_IDLE 的广播时,您期望存在的 MediaRecorder 实例实际上可能不再存在,因为您位于不同的 BroadcastReceiver 实例而不是创建 MediaRecorder 的实例。

关于android - MediaRecorder启动失败-2147483648,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13933065/

相关文章:

android - 我什么时候应该删除临时图像文件?

android - 如何从 EditText 正确触发 datePicker 和验证?

android - mediacontroller 在 nexus 7 选项卡上不起作用

android - 为什么 MediaRecorder 的 start() 方法会抛出 IllegalStateException?

Android MediaRecorder 设置音量

java - 致命异常 : Unable to start activity ComponentInfo{. ..} : java. lang.NullPointerException

Android Kotlin - 捕获异常仍然使程序崩溃

android - 预期的 Android GPS 准确度

android - 运行flutter应用程序时如何解决 'dart:ui'错误?

java - 为什么 MediaRecorder 延迟开始录制?