在安卓手机上录制电话?

18
我尝试了一下,并使用以下代码记录外拨电话,但它没有成功。
  @Override
  public void onReceive(Context context, Intent intent) 
  {
          this.context = context;
          if (intent.getAction().equalsIgnoreCase(Intent.ACTION_ANSWER)) 
          {
              try
              {
                  phonenbr = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
                  Log.v("GDHGDHGHDGDHGDHGHDGHDGH", phonenbr);
                  recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                  recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                  recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                  recorder.setOutputFile(pathname);
                  recorder.prepare();
                  recorder.start();
                  recordstarted = 1;
                  telManager= (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
              }
              catch(Exception e)
              {
                  e.printStackTrace();
              }


              final PhoneStateListener phoneListener = new PhoneStateListener()
                {
                    @Override
                     public void onCallStateChanged(final int state, final String incomingNumber)
                        {
                            getTelephonyOverview(telManager);
                        }
                };

           telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

}

}

           public void getTelephonyOverview(final TelephonyManager telManager)
           {
                   int callState = telManager.getCallState();
                   switch (callState)
                   {
                    case TelephonyManager.CALL_STATE_IDLE:
                    {
                        if (recordstarted==1)
                        {
                            recorder.stop();
                            recordstarted =0;
                        }
                        break;
                    }
                }
           }

请提供一些解决此问题的好方法。

如果您能提供错误目录,我可能会帮忙。 - manidhar mulaparthi
你好,我也需要录制电话通话。你有机会让它工作了吗? - Umair A.
1
很酷的想法,但在你深入之前,我建议你先查看与隐私和录音电话相关的当地法律。我知道在美国有非常严格的规定,关于什么可以被记录下来以及通知用户他们正在被记录。 - bakoyaro
5个回答

5

这可以通过API级别8+来解决。将您的音频源设置为电话上行、下行或两者兼备即可。

recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); //Voice downlink/ Uplink
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(AudioEncoder.AAC );

但在此之前,请注意法律法规。

1
我在我的Droid X上尝试了这个,但是在recorder.stop()处一直收到“stop failed: -1007” MediaRecorder的RuntimeException。 recorder.start()没有问题地通过,并创建了一个非零大小的文件,但无法播放。 - CompEng88
你试过哪些手机?看起来这个解决方案太简单了,以至于难以置信...但通常都是如此 :) - rrostt

4
  1. 在Android中,由于SDK应用程序无法访问通话音频,因此无法很好地录制电话通话。
  2. ACTION_ANSWER不是广播Intentnot

6
有没有其他的方式来记录电话通话? - Mobile_Application_Developer
我之前看过,没有办法做到。 - stealthcopter
没有 - 甚至在通话结束之前你都无法知道是谁在打电话(当手机在通话中崩溃时这很棒)。 - Basic
@Kanika 不,你不能录制电话通话,因为你在SDK(甚至系统)级别上没有访问通话音频流的权限。(不知道我怎么会意外地进入了一个几个月前的帖子,抱歉..) - Kristopher Micinski

1

你不能仅通过媒体录音机来记录通话。在开始录制之前,您还需要更改音频管理器的设置并将扬声器打开,而音频源将保持不变(麦克风)。因此,请尝试编辑音频管理器的设置。


AudioManager audiomanager = (AudioManager)context.getSystemService("audio"); 
int i = audiomanager.getRouting(2); 
audiomanager.setMode(2);
audiomanager.setMicrophoneMute(false);
audiomanager.setSpeakerphoneOn(true); 
int j = audiomanager.getStreamMaxVolume(0); 
if(j < 0) 
     j = 1; 
int k = j / 2 + 1; 
audiomanager.setStreamVolume(0, k, 0); 
audiomanager.setRouting(2, 11, 15);

但是如何打开扬声器? - Kartik Bhatt
@Kartik,你需要在你的mainfeast文件中添加更改音频设置权限。这是我的代码:AudioManager audiomanager = (AudioManager)context.getSystemService("audio"); int i = audiomanager.getRouting(2); audiomanager.setMode(2); audiomanager.setMicrophoneMute(false); audiomanager.setSpeakerphoneOn(true); int j = audiomanager.getStreamMaxVolume(0); if(j < 0) j = 1; int k = j / 2 + 1; audiomanager.setStreamVolume(0, k, 0); audiomanager.setRouting(2, 11, 15); - Jaiprakash Soni

0

这段代码可以帮助我记录外拨电话,请点击这里查看。


0

看起来您无法从API记录通话。一个常见的解决方法是打开扬声器并从麦克风录制 - 在许多设备上,麦克风将以此安排足够地捕捉扬声器。

另一种解决方法是在某个电话服务上进行录音,并通过它路由呼叫。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接