【问题标题】:java.lang.RuntimeException: start failed at android.media.MediaRecorder.start(Native Method)java.lang.RuntimeException:在 android.media.MediaRecorder.start(本机方法)处启动失败
【发布时间】:2016-11-23 13:25:17
【问题描述】:

我正在记录一个电话。当我开始记录电话时,不幸的是它停止了。 & 它给出了错误 MediaRecorder 启动失败 -2147483648。我请告诉我我的代码有什么问题?这是我的代码。

public class incomingcall extends BroadcastReceiver {
Context c;
MediaRecorder recorder;
public incomingcall() {
}
@Override
public void onReceive(Context context, Intent intent) {
    c = context;
    try {
        PhoneStateChangeListener pscl = new PhoneStateChangeListener();
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        tm.listen(pscl, PhoneStateListener.LISTEN_CALL_STATE);
    } catch (Exception e) {
        Log.e("", "", e);
    }
}

private class PhoneStateChangeListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                Toast.makeText(c, "ring", Toast.LENGTH_SHORT).show();
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                startRecording();
                Toast.makeText(c, "offhook", Toast.LENGTH_SHORT).show();
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                stopRecording();
                Toast.makeText(c, "idle", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}
private void startRecording() {
    try {
        recorder = new MediaRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        String file=c.getFilesDir().getAbsolutePath();
        file+="/sound.3gp";
        recorder.setOutputFile(file);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.prepare();
        recorder.start();
    } catch (IOException e) {
        Log.e("", "prepare() failed", e);
    }
}
private void stopRecording() {
    try {
        recorder.stop();
        recorder.release();
        recorder = null;
    } catch (Exception e) {
        Log.e("", "", e);
    }
 }
}

日志

    07-20 15:33:47.867 18525-18525/in.pounkumar.callblocker E/MediaRecorder: start failed: -2147483648
07-20 15:33:47.868 18525-18525/in.pounkumar.callblocker E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: in.pounkumar.callblocker, PID: 18525
                                                                          java.lang.RuntimeException: start failed.
                                                                              at android.media.MediaRecorder.start(Native Method)
                                                                              at in.pounkumar.callblocker.incomingcall.startRecording(incomingcall.java:73)
                                                                              at in.pounkumar.callblocker.incomingcall.access$100(incomingcall.java:20)
                                                                              at in.pounkumar.callblocker.incomingcall$PhoneStateChangeListener.onCallStateChanged(incomingcall.java:53)
                                                                              at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:295)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                              at android.os.Looper.loop(Looper.java:148)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

  • 您是否有权在清单文件中录制音频?
  • ya, 我已经添加了这个
  • @PounKumarPurushothaman 你的安卓操作系统版本是6.0?
  • 您必须从用户那里获得运行时权限,否则无法做到。看这里stackoverflow.com/questions/38141523/…
  • 已经添加了兄弟@SohailZahid

标签: android android-studio mediarecorder android-mediarecorder


【解决方案1】:

MediaRecorder.AudioSource.VOICE_CALL 源需要 CAPTURE_AUDIO_OUTPUT 权限。 See Android Docs

您是否在清单中添加了此权限

 <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />

【讨论】:

  • @PounKumarPurushothaman 您在清单中添加了哪些权限?
  • 可以在这里使用粘贴所有权限。以及添加此权限后 logcat 的任何更改。
  • 我的应用程序运行了几个月,突然它意识到没有这个权限它不应该工作,我不得不添加它并开始工作。我是认真的。随着时间的流逝,我开始相信,如果您有一段时间不碰它,代码就会腐烂。 :(
【解决方案2】:

MediaRecorder.start 方法在您的情况下失败,原因是:

recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);

MediaRecorder.AudioSource.VOICE_CALL 源不起作用的原因取决于您的设备制造商/国家等。

因此,这会引发异常,因为您的设备支持MediaRecorder.AudioSource.VOICE_CALL

尝试将其更改为MediaRecorder.AudioSource.MIC,它将起作用:

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

阅读this了解更多详情。

【讨论】:

  • 尝试使用MediaRecorder.AudioSource.CAMCORDER
  • 由于隐私暴力问题,Android 7 阻止了录制通话对方的能力。
【解决方案3】:

我有同样的问题,我通过对三星和 LG 设备使用不同的初始化解决了这个问题。

        String manufacturer = Build.MANUFACTURER;
    if (manufacturer.toLowerCase().contains("samsung")) {
        recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
    } else {
        recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
    }

希望对你有帮助。

【讨论】:

  • 谢谢!我会对在三星手机上运行我的应用程序感到失望。你是怎么找到这个的?您能否提供任何指向此文档的链接?
  • 通过反复试验。请注意,Android 7 会阻止这些选项。
  • 您指的是哪个选项?我在使用 Android 7 的三星 Note 6 上进行了尝试,它成功了!
  • 但它不录制第二人称声音。在运行 Android 7.0 的 Galaxy S8+ 中尝试过
  • 由于隐私暴力问题,Android 7 阻止了录制通话对方的能力。
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2016-01-19
  • 2013-03-17
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多