Android中监听未接来电的2种方法
这里主要是总结一下如何监听有未接来电的问题
1.1使用广播接收器BrocastReceiver
实现思路:
静态注册监听android.intent.action.PHONE_STATE的广播接收器当手机的状态改变后将会触发onReceive.
手机的状态分为CALL_STATE_RINGING(响铃中),CALL_STATE_IDLE(空闲),CALL_STATE_OFFHOOK(忙音).
也就是说当你没有任何电话是,状态是IDLE,当接到电话时是OFFHOOK,电话结束后返回IDLE状态。
记录上一次的手机状态,如果的手机现在的空闲,上次的状态响铃中的话,就可以判断是未接来电.
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/> <receiverandroid:name="com.example.phonestatedemo.receiver.PhoneStateReceiver"> <intent-filter> <actionandroid:name="android.intent.action.PHONE_STATE"/> </intent-filter> </receiver>
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.telephony.TelephonyManager;
importandroid.util.Log;
importandroid.widget.Toast;
publicclassPhoneStateReceiverextendsBroadcastReceiver{
privatestaticintlastCallState=TelephonyManager.CALL_STATE_IDLE;
@Override
publicvoidonReceive(Contextarg0,Intentarg1){
Stringaction=arg1.getAction();
Log.d("PhoneStateReceiver",action);
TelephonyManagertelephonyManager=(TelephonyManager)arg0
.getSystemService(Context.TELEPHONY_SERVICE);
intcurrentCallState=telephonyManager.getCallState();
Log.d("PhoneStateReceiver","currentCallState="+currentCallState);
if(currentCallState==TelephonyManager.CALL_STATE_IDLE){//空闲
//TODO
}elseif(currentCallState==TelephonyManager.CALL_STATE_RINGING){//响铃
//TODO
}elseif(currentCallState==TelephonyManager.CALL_STATE_OFFHOOK){//接听
//TODO
}
if(lastCallState==TelephonyManager.CALL_STATE_RINGING&&
currentCallState==TelephonyManager.CALL_STATE_IDLE){
Toast.makeText(arg0,"有未接来电",1).show();
}
lastCallState=currentCallState;
}
}
1.2 使用PhoneStateListener
实现思路:
继承PhoneStateListener后,当手机的状态改变后将会触发onCallStateChanged.手机的状态分为CALL_STATE_RINGING(响铃中),CALL_STATE_IDLE(空闲),CALL_STATE_OFFHOOK(忙音).
也就是说当你没有任何电话是,状态是IDLE,当接到电话时是OFFHOOK,电话结束后返回IDLE状态。
记录上一次的手机状态,如果的手机现在的空闲,上次的状态响铃中的话,就可以判断是未接来电.
不足:现在的处理不能判断出是用户是否主动不接电话.
TelephonyManagertelephonyManager=(TelephonyManager)this
.getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(newCallStateListener(this),
PhoneStateListener.LISTEN_CALL_STATE);
packagecom.example.phonestatedemo.listener;
importandroid.content.Context;
importandroid.telephony.PhoneStateListener;
importandroid.telephony.TelephonyManager;
importandroid.util.Log;
importandroid.widget.Toast;
publicclassCallStateListenerextendsPhoneStateListener{
privatestaticintlastetState=TelephonyManager.CALL_STATE_IDLE;//最后的状态
privateContextcontext;
publicCallStateListener(Contextcontext){
this.context=context;
}
@Override
publicvoidonCallStateChanged(intstate,StringincomingNumber){
//TODOAuto-generatedmethodstub
super.onCallStateChanged(state,incomingNumber);
Log.d("CallStateListener","onCallStateChangedstate="+state);
//如果当前状态为空闲,上次状态为响铃中的话,则破觚为认为是未接来电
if(lastetState==TelephonyManager.CALL_STATE_RINGING
&&state==TelephonyManager.CALL_STATE_IDLE){
//TODO
Toast.makeText(this.context,"CallStateListener有未接来电",1).show();
}
lastetState=state;
}
}