在呼叫挂起时,Media Recorder不会停止并保存录制的呼叫

时间:2015-07-08 08:02:41

标签: android audio-recording android-mediarecorder phone-call

我是Android编程新手。我正在尝试建立一个呼叫记录器。我能够检测到来电并成功启动媒体录音机并录制语音。但是在Call Disconnect上,Stop()方法不会触发。它关闭应用程序时停止。除了stop()之外,一切正常。当我关闭应用程序时,录音也会保存。 如何在通话断开后停止()录音?

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.telephony.TelephonyManager;
import java.io.IOException;
import java.util.Calendar;

public class nCallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {





MediaRecorder callrecorder = new MediaRecorder();

        if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            Calendar c = Calendar.getInstance();
            int tm = c.get(Calendar.DATE);
            int tx = c.get(Calendar.SECOND);
            String timex = tm+"-"+tx;


            callrecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            callrecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            callrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

            callrecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + incomingNumber +"-"+ timex+"-"+tx+".mp4");
            try {
                callrecorder.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }

            callrecorder.start();

            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE)
                    || intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                    TelephonyManager.EXTRA_STATE_OFFHOOK)) {

                callrecorder.stop();
                callrecorder.release();
            }


        }
    }
}

**

编辑2

** 我如何停止()媒体记录器? 我试过实例化

  

MediaRecorder r;

全球但是,

  

r.stop()

不起作用,因为r未实例化。

如果可以保存此MediaRecorder实例的状态,并在稍后使用stop方法,我该怎么做?

public class nCallRecorder extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            //start recording
            String CallNo = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            MediaRecorder r = new MediaRecorder();
            r.setAudioSource(MediaRecorder.AudioSource.MIC);
            r.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            r.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            r.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+CallNo+".mp4");
            try { r.prepare(); } catch(IOException e) { e.printStackTrace(); }
            r.start();

        } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE)) {
            //stop recording
            Toast.makeText(context,"Call Ends",Toast.LENGTH_LONG).show();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

检查状态是否已更改为IDLE似乎位于if intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {内。你可能想要这样的东西:

if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
    // start recording
} else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE) {
    // stop recording
}

此外,每次调用MediaRecorder时,您都会创建一个新的BroadcastReceiver实例。您应该只在开始录制时创建MediaRecorder实例,并保存该实例以便以后可以停止它。

另一个小问题是你的条件是intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)是否应该停止录音。 "摘机"并不意味着你已经挂了;这意味着"至少存在一个拨号,活动或保持的呼叫"