2017-07-14 527 views
2

要记录通话,我使用MediaRecorder class如何录制语音呼叫在代码使用<code>AudioSource.MIC</code>或<code>AudioSource.VOICE_COMMUNICATION</code>其记录只有我的声音不是来自recevier ,当我使用<code>AudioSource.VOICE_CALL</code>它提供了有关参加调用异常.. 这里的时候,使用AudioSource.VOICE_CALL

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; 
        } 
       } 
      } 
     } 

,这是错误..

java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.PHONE_STATE flg=0x10 (has extras) } in [email protected] 
                       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) 

体现的权限是:

<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" /> 
+0

您是否找到解决方案? – NehaK

回答

0

我认为在录制更新版本的android之前需要一些权限(Api 23)。 看看这太问题 - Recording calls in android why this not works

权限

<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"/> 

如果你需要更多的帮助,你甚至可以查看官方document了解有关此错误的详细信息。

+0

已添加所有权限 – Asad

0

您需要Voice_Call的CAPTURE_AUDIO_OUTPUT权限,该权限为is documented here

但是,您将不会得到stated here原因的许可。

注行“不为第三方应用程序使用。

0

VOICE_CALL现在已经过时。这就是发生这种错误的原因。

使用VOICE_COMMUNICATION作为AudioSource,因为它是调谐用于语音通信(如VoIP)的麦克风音频源。

我也有通话录音的应用程序工作,但它的Android 7.1.1

失败如果没有在Android 7.1.1试图呼叫记录下面的代码将工作。

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

您的建议代码是否会记录麦克风以及扬声器语音?意味着所有双向的声音? – Asad

+0

是的,除了7.1.1,我的建议还可以为我工作,请尝试这一个,这将为你工作。如果使用VOICE_COMMUNICATION无法听到来自接收器的语音,请尝试MediaRecorder.AudioSource.DEFAULT。 –

相关问题