Android 通话挂断时,Media Recorder不会停止并保存录制的通话
我是Android编程新手。我正在试着做一个电话录音机。我能够检测来电并成功启动媒体录制器并录制语音。但是在调用断开连接时,Stop()方法不会触发。当我关闭应用程序时,它停止。除了停止()之外,一切正常。当我关闭应用程序时,录音也会被保存。 如何在断开呼叫后停止录音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
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
之前执行此操作。