我是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();
}
}
}
}
**
** 我如何停止()媒体记录器? 我试过实例化
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();
}
}
}
答案 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)
是否应该停止录音。 "摘机"并不意味着你已经挂了;这意味着"至少存在一个拨号,活动或保持的呼叫" 。