【问题标题】:Recording OUTGOING CALL and INCOMING CALL in ANDROID在 ANDROID 中记录呼出和呼入
【发布时间】:2014-05-30 06:06:38
【问题描述】:

我发现了很多关于这个问题的问题,但我一点都不清楚。 我想开发和应用程序,以便它可以记录任何拨出电话和来电。我在下面写了这段代码,但它不起作用。请帮助详细说明。在此先感谢。

import java.io.File;
import java.io.IOException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
public class serviceBroadcast extends BroadcastReceiver {
    Context mycontext;
    final MediaRecorder recorder = new MediaRecorder();
    public void onReceive(Context context, Intent intent) {
        mycontext=context;
        try {
            // TELEPHONY MANAGER class object to register one listner
            TelephonyManager tmgr = (TelephonyManager) context
                    .getSystemService(Context.TELEPHONY_SERVICE);

            //Create Listner
            TeleListener PhoneListener = new TeleListener();

            // Register listener for LISTEN_CALL_STATE
            tmgr.listen(PhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
        } catch (Exception e) {
            Log.e("Phone Receive Error", " " + e);
        }

    }
    class TeleListener extends PhoneStateListener {
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                StopRecording();
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                startRecording();
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                break;
            default:
                break;
            }

        }
    }
    public void startRecording(){
        recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setOutputFile(Environment.getExternalStorageDirectory()+ "/RecordMyVoice.mp4");
        try {
            recorder.prepare();
            Log.i(this.getClass().getName(), "Prepared");
        } catch (IllegalStateException e) {
            e.printStackTrace();
            Log.i(this.getClass().getName(), "ERR 1");
        } catch (IOException e) {
            e.printStackTrace();
            Log.i(this.getClass().getName(), "ERR 2");
        }
        recorder.start(); 
    }
    public void StopRecording(){
        recorder.stop();          
        recorder.release();
        Log.i(this.getClass().getName(), "Stop Recording");
   }

}

}

【问题讨论】:

  • 有什么错误吗?或者别的什么
  • 是的。当我打电话给某人或来电时,它就会崩溃..
  • 你能在这里发日志吗
  • @MehediHassan 你得到答案了吗?您的应用记录通话吗?如果得到答案,请发布。

标签: android audio android-sdcard mediarecorder


【解决方案1】:

也许这个答案不能解决您的问题,但它很渴望发表评论。如果没有看到 Logcat,很难说为什么你会得到一个异常,但我看到的一件事是,它可能会给你的 release() 调用带来错误。因此,如果您在 MediaRecorder 对象上调用 release(),则它处于 null 状态,此后无法使用。所以问题是,你打电话给

   final MediaRecorder recorder = new MediaRecorder();

在开头。将 MediaRecorder 设为全局会是一种更好的做法

    private MediaRecorder recorder=null;

并在您的 startRecording() 方法中创建对象:

    private void startRecording(){

     recorder = new MediaRecorder();
                .
                .
                .

     }

另外,不要忘记在清单中设置权限:

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

【讨论】:

  • 我遇到了问题。实际上问题出在 recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);我应该写 MIC 而不是 VOICE_CALL.. 但是当我写 MIC 时,录音文件已创建但它是空的。
  • 您是否设置了 WRITE_EXTERNAL_STORAGE 权限?您可以发布 logcat 输出吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2012-03-29
  • 1970-01-01
相关资源
最近更新 更多