How to record voice call using AudioSource.VOICE_CALL

烈酒焚心 提交于 2019-12-22 08:25:13

问题


trying to record call, I am using MediaRecorder class when using AudioSource.MIC or AudioSource.VOICE_COMMUNICATION its recording only my voice not from recevier and when I use AudioSource.VOICE_CALL it gives exception on attending call.. here is code

if(intent.getAction().equals("android.intent.action.PHONE_STATE")){
            if((bundle = intent.getExtras()) != null){
                state = bundle.getString(TelephonyManager.EXTRA_STATE);
                if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
                    inCall = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
                    wasRinging = true;
                    Toast.makeText(context, inCall + " is calling", Toast.LENGTH_SHORT).show();
                }
                else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
                    if(wasRinging){
                        Toast.makeText(context, "Call Answered", Toast.LENGTH_SHORT).show();
                        Date date = new Date();
                        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy_HH-mm-ss");

                        String filename = "rec_" + format.format(date) + ".mp3";
                        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath();
                        String fileUri = path + "/" + filename;
                        Log.v("testing uri", fileUri);
                        File file = new File(fileUri);

                        recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
                        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
                        recorder.setOutputFile(file.getAbsolutePath());

                        try {
                            recorder.prepare();
                            recorder.start();
                            recording = true;

                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
                    wasRinging = false;
                    Toast.makeText(context, "Cancelled", Toast.LENGTH_SHORT).show();
                    if(recording && recorder != null){
                        recorder.stop();
                        recorder = null;
                        recording = false;
                    }
                }
            }
        }

And this is error..

java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.PHONE_STATE flg=0x10 (has extras) } in com.asadullah.callrecorder.MyBroadCastReceiver@41d6c7a8
   at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:778)
   at android.os.Handler.handleCallback(Handler.java:733)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:136)
   at android.app.ActivityThread.main(ActivityThread.java:5102)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
   at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: start failed.
   at android.media.MediaRecorder.start(Native Method)
   at com.asadullah.callrecorder.MyBroadCastReceiver.onReceive(MyBroadCastReceiver.java:62)
   at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:768)

manifests permissions are:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.STORAGE" />

回答1:


VOICE_CALL is deprecated now. That is why this error occurred.

Use VOICE_COMMUNICATION as AudioSource as it is microphone audio source tuned for voice communications such as VoIP.

I am also working with call recording app but it failed in Android 7.1.1

If you are not trying call record on Android 7.1.1 below code will work.

recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);



回答2:


In order to use VOICE_CALL you need to take special permission.

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



回答3:


I think you require some permissions before recording in newer version of android (Api 23). Check out this SO question - Recording calls in android why this not works

Permissions

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

And if you require more help you can even check official document for more info regarding this error.




回答4:


You need the CAPTURE_AUDIO_OUTPUT permission for Voice_Call, which is documented here.

But you will NOT get the permission for the reason stated here.

Note the line "Not for use by third-party applications."




回答5:


I think you forgot to take this permission.

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


来源:https://stackoverflow.com/questions/45098103/how-to-record-voice-call-using-audiosource-voice-call

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!