Android STATE_IDLE_响铃而非CALL_STATE_摘机
我正在制作一个用于录制语音通话的应用程序。据我所知,一旦我们打电话,电话就会挂断 这就是应该发生的事情。 但我的应用程序正在录制我第一次打电话。之后,无论何时我打电话,电话都会一直处于响铃状态。我为所有状态设置了一个Log.I()语句,这样每次手机状态发生变化时,我都可以得到它的状态。每次我打电话时,电话都会一直响个不停 代码如下:-Android STATE_IDLE_响铃而非CALL_STATE_摘机,android,phone-state-listener,Android,Phone State Listener,我正在制作一个用于录制语音通话的应用程序。据我所知,一旦我们打电话,电话就会挂断 这就是应该发生的事情。 但我的应用程序正在录制我第一次打电话。之后,无论何时我打电话,电话都会一直处于响铃状态。我为所有状态设置了一个Log.I()语句,这样每次手机状态发生变化时,我都可以得到它的状态。每次我打电话时,电话都会一直响个不停 代码如下:- public class CallRecorder extends Service{ private MediaRecorder rec; private bo
public class CallRecorder extends Service{
private MediaRecorder rec;
private boolean recordStarted;
private File file;
//private TelephonyManager manager;
//private StateListener listener;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Bundle b = intent.getExtras();
file = Environment.getExternalStorageDirectory();
rec = new MediaRecorder();
rec.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
rec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
rec.setOutputFile(file.getAbsolutePath() + "/TESTRECORD.3gp");
rec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
TelephonyManager manager = (TelephonyManager) getApplicationContext().getSystemService(getApplicationContext().TELEPHONY_SERVICE);
manager.listen(new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if(TelephonyManager.CALL_STATE_OFFHOOK==state && rec == null)
{
try {
Log.i("OUTGOING CALL", "CALL_STATE_OFFHOOK");
rec.prepare();
//Thread.sleep(500);
rec.start();
recordStarted = true;
Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else if(TelephonyManager.CALL_STATE_IDLE==state)
{
Log.i("OUTGOING CALL", "CALL_STATE_IDLE");
if(rec!=null)
{
try{
rec.stop();
rec.reset();
rec.release();
recordStarted = false;
stopSelf();
}
catch (IllegalStateException e) {
//Log.e("CALL ERROR",e.getMessage());
}// ILLEGALSTATEEXCEPTION WHILE THE CALL ENDS AUTOMATICALLY
}
}
else
{
Log.i("OUTGOING CALL", "CALL_STATE_RINGING"); // 2nd time outgoing
}
}
}, PhoneStateListener.LISTEN_CALL_STATE); // LISTENER REGISTERATION
Toast.makeText(this, "Calling...", Toast.LENGTH_LONG).show();
return 0;
}
}
现在,每次我打电话时,“电话\状态\铃声”的日志数量都在增加
我第二次打电话时,它被显示了三次
我第三次打电话时,它被显示了5次
我第4次打电话时,它显示了7次
这是日志
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.621: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.071: I/OUTGOING CALL(7614): CALL_STATE_RINGING
每次尝试后,都会显示调用状态空闲
下面给出了一些随机误差
stop is called in an invalid state:4
有谁能告诉我这是为什么和如何发生的吗?
提前感谢。您还没有取消活动的订阅,所以一切都在累积:)非常简单的修复 以下是我的onReceive方法:
@Override
public void onReceive(Context context, Intent intent) {
mContext = context;
mIntent = intent;
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
这是我在onCallStateChanged事件结束时使用的行:
((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE)).listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
这应该解决它