Android 我正在试着录电话。我可以录下电话,但我不知道在哪里停止录音机。下面是我的代码
这是我的CallBroadcastReceiver,我正在尝试录制通话。它可以正常工作,无需记录器。停止方法。当我添加stop方法时,它会使应用程序崩溃 给我建议,我应该在哪里调用StopRecording方法。这样我就可以恢复记录并将文件保存在SD卡中 我试图将stopRecording放入TelephonyManager.CALL_STATE_IDLE开关中,但它只是使录制崩溃。不记录任何内容或不创建文件Android 我正在试着录电话。我可以录下电话,但我不知道在哪里停止录音机。下面是我的代码,android,audio-recording,telephonymanager,phone-call,Android,Audio Recording,Telephonymanager,Phone Call,这是我的CallBroadcastReceiver,我正在尝试录制通话。它可以正常工作,无需记录器。停止方法。当我添加stop方法时,它会使应用程序崩溃 给我建议,我应该在哪里调用StopRecording方法。这样我就可以恢复记录并将文件保存在SD卡中 我试图将stopRecording放入TelephonyManager.CALL_STATE_IDLE开关中,但它只是使录制崩溃。不记录任何内容或不创建文件 public class CallBroadcastReceiver extends
public class CallBroadcastReceiver extends BroadcastReceiver
{
String path = "/sdcard/AudioRecording";
private final int audioformat = 3;
public class MyPhoneStateListener extends PhoneStateListener implements
SensorEventListener
{
Context context;
AudioManager audioManager;
MediaRecorder recorder;
private SensorManager mSensorManager;
private Sensor myLightSensor;
private boolean CallState;
private float sensorState;
public MyPhoneStateListener(Context arg0)
{
// TODO Auto-generated constructor stub
this.context = arg0;
mSensorManager = (SensorManager)
this.context.getSystemService(Context.SENSOR_SERVICE);
myLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
audioManager = (AudioManager)
this.context.getSystemService(Context.AUDIO_SERVICE);
if (myLightSensor == null)
{
Log.i("On Receive", "Not Support");
}
else
{
mSensorManager.registerListener(this,myLightSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
}
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
// TODO Auto-generated method stub
switch (state)
{
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("My Call IDLE");
CallState = false;
StartAudioSpeacker();
//StopRecording();
System.out.println("Is phone speaker : "+
audioManager.isSpeakerphoneOn());
if (audioManager.isSpeakerphoneOn()) {
audioManager.setSpeakerphoneOn(false);
mSensorManager.unregisterListener(this);
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK :
System.out.println("My Call OFFHOOK");
CallState = true;
StartAudioSpeacker();
StartRecording();
System.out.println("Is phone speaker : "+
audioManager.isSpeakerphoneOn());
break;
case TelephonyManager.CALL_STATE_RINGING :
System.out.println("My Call RINGING");
break;
default:
break;
}
}
private void StartAudioSpeacker()
{
// TODO Auto-generated method stub
if (CallState && sensorState == 1.0)
{
audioManager = (AudioManager)
this.context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setSpeakerphoneOn(true);
audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
audioManager.setStreamVolume(AudioManager.MODE_IN_CALL,
audioManager.getStreamMaxVolume(AudioManager.MODE_IN_CALL), 1);
System.out.println("Is phone speaker : "+
audioManager.isSpeakerphoneOn());
}
else
{
audioManager = (AudioManager)
this.context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setSpeakerphoneOn(false);
audioManager.setStreamVolume(AudioManager.MODE_IN_CALL,
audioManager.getStreamMaxVolume(AudioManager.MODE_IN_CALL), 1);
System.out.println("Speaker Volume :"+
audioManager.getStreamMaxVolume(AudioManager.MODE_IN_CALL));
System.out.println("Is phone speaker : "+
audioManager.isSpeakerphoneOn());
}
}
private void StartRecording()
{
// TODO Auto-generated method stub
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(audioformat);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setOutputFile(path+"test.amr");
try {
recorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
recorder.start(); // Recording is now started
Log.i(this.getClass().getName(), "Start Recording");
}
private void StopRecording()
{
// TODO Auto-generated method stub
recorder.stop();
recorder.reset();
recorder.release();
Log.i(this.getClass().getName(), "Stop Recording");
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1)
{
// TODO Auto-generated method stub
if (arg0.getType() == Sensor.TYPE_PROXIMITY)
{
Log.i("Sensor Changed", "Accuracy :" + arg1);
}
}
@Override
public void onSensorChanged(SensorEvent arg0)
{
// TODO Auto-generated method stub
if (arg0.sensor.getType() == Sensor.TYPE_PROXIMITY)
{
Log.i("Sensor Changed", "onSensor Change :" + arg0.values[0]);
sensorState = arg0.values[0];
StartAudioSpeacker();
}
}
}
public void onReceive(Context arg0, Intent arg1)
{
TelephonyManager tmanager =
(TelephonyManager)arg0.getSystemService(Context.TELEPHONY_SERVICE);
MyPhoneStateListener PhoneListener = new MyPhoneStateListener(arg0);
tmanager.listen(PhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
当您将CALL_STATE_IDLE作为新状态时,请停止录制。 这意味着呼叫已结束