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; } }