安卓媒体记录器启动在安卓上失败>=6



我正在尝试在我的应用中记录传出和传入的呼叫。我使用本教程中的方法。在呼叫或发出呼叫开始时,Mediarecorder start()方法是从Broadcastreceiver调用的。

我使用AudioSource -recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);用于录制双方的声音。

我还将此参数设置为默认:

 recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

这在Android 5上正常工作,但是我在Android 8:

上获得下一个错误
                                                                          Process: myseolife.ru.androidcrm:remote, PID: 6305
                                                                          java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.PHONE_STATE flg=0x1000010 (has extras) } in myseolife.ru.androidcrm.broadcastreceivers.PhoneCallReceiver@f23996c
                                                                              at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_51267(LoadedApk.java:1305)
                                                                              at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.$m$0(Unknown Source:4)
                                                                              at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.run(Unknown Source:0)
                                                                              at android.os.Handler.handleCallback(Handler.java:789)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:98)
                                                                              at android.os.Looper.loop(Looper.java:164)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
                                                                           Caused by: java.lang.RuntimeException: start failed.
                                                                              at android.media.MediaRecorder.start(Native Method)
                                                                              at myseolife.ru.androidcrm.utils.AudioRecorder.start(AudioRecorder.java:58)
                                                                              at myseolife.ru.androidcrm.broadcastreceivers.PhoneCallReceiver.onOutgoingCallStarted(PhoneCallReceiver.java:82)
                                                                              at myseolife.ru.androidcrm.broadcastreceivers.CallReceiver.onCallStateChanged(CallReceiver.java:88)
                                                                              at myseolife.ru.androidcrm.broadcastreceivers.CallReceiver.onReceive(CallReceiver.java:45)
                                                                              at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_51267(LoadedApk.java:1295)
                                                                              at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.$m$0(Unknown Source:4) 
                                                                              at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.run(Unknown Source:0) 
                                                                              at android.os.Handler.handleCallback(Handler.java:789) 
                                                                              at android.os.Handler.dispatchMessage(Handler.java:98) 
                                                                              at android.os.Looper.loop(Looper.java:164) 
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6541) 
                                                                              at java.lang.reflect.Method.invoke(Native Method)

我想,这是权限问题,但我认为我都需要权限(这是我清单的所有权限):

    <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.QUICKBOOT_POWERON" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />

和运行时请求的权限列表:

  String[] permissions= new String[]{
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.PROCESS_OUTGOING_CALLS,
            Manifest.permission.READ_CALL_LOG,
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_CALENDAR,
            Manifest.permission.WRITE_CALENDAR,
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS,
            Manifest.permission.READ_EXTERNAL_STORAGE,};

现在我不知道,在哪里可以找到解决此问题的解决方案。这里有什么问题?

更新:如果更改recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);recorder.setAudioSource(MediaRecorder.AudioSource.MIC);错误消失了,但麦克风只能记录我的声音。

尝试以下:

recorder.setOutputFormat(OutputFormat.MPEG_4);
recorder.setAudioEncoder(AudioEncoder.AAC);

而不是

recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

问题在:recorder.setaudiosource(Mediarecorder.audiosource.voice_call)

它在某些设备上不起作用,因为某些国家不允许呼叫记录。因此,我选择使用麦克风,并以最大音量打开扬声器,以记录扬声器的电话。我的代码:

     try {
                    while(true) {
                        sleep(2000);
                        if (!audioManager.isSpeakerphoneOn())
                            audioManager.setSpeakerphoneOn(true);
                        int sb2value = audioManager.getStreamMaxVolume(audioManager.STREAM_VOICE_CALL);
                        audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,sb2value,0);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

最新更新