Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通话挂断时,Media Recorder不会停止并保存录制的通话_Android_Audio Recording_Android Mediarecorder_Phone Call - Fatal编程技术网

Android 通话挂断时,Media Recorder不会停止并保存录制的通话

Android 通话挂断时,Media Recorder不会停止并保存录制的通话,android,audio-recording,android-mediarecorder,phone-call,Android,Audio Recording,Android Mediarecorder,Phone Call,我是Android编程新手。我正在试着做一个电话录音机。我能够检测来电并成功启动媒体录制器并录制语音。但是在调用断开连接时,Stop()方法不会触发。当我关闭应用程序时,它停止。除了停止()之外,一切正常。当我关闭应用程序时,录音也会被保存。 如何在断开呼叫后停止录音 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import and

我是Android编程新手。我正在试着做一个电话录音机。我能够检测来电并成功启动媒体录制器并录制语音。但是在调用断开连接时,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 ** 如何停止媒体录制器? 我试着实例化

媒体记录器

但在全球范围内

r、 停止()

不工作,因为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();
        }
    }
}

检查状态是否已更改为
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
}

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



另一个小问题是,在您的条件下,您有
intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)
来决定是否停止录制。“摘机”并不意味着您已挂断电话;它意味着“至少存在一个拨号、活动或挂起的呼叫”.

如何保存MediaRecorder实例?以及如何重用已保存的状态?仅声明一个
MediaRecorder
是不够的。您仍然必须在某个地方为其分配一个
MediaRecorder
实例(即
r=new MediaRecorder();
)。您可以在开始录制时,就在
r.setAudioSource
之前执行此操作。