Android有未接來電後處理(判斷未接來電)
阿新 • • 發佈:2019-01-26
在Android的手機狀態中沒有未接來電的監聽器,所以如果想當手機有未接來電後進行處理,這時候就需要自己對手機的狀態判斷是未接來電後再進行處理.
實現思路 :
1. 繼承PhoneStateListener後,當手機的電話狀態改變後將會觸發onCallStateChanged回撥方法.手機的狀態分為CALL_STATE_RINGING(響鈴中),CALL_STATE_IDLE(空閒),CALL_STATE_OFFHOOK(忙音)三種狀態.
2. 記錄上一次的手機狀態,如果手機現在是空閒狀態,上次的狀態是響鈴中的話,就可以判斷是未接來電.
不足:
1. 我現在的處理不能判斷出是使用者是否主動不接電話.
實現步驟:
1. 編寫CallListener,處理手機狀態變更監聽,當狀態改變時進行處理。如傳送簡訊或者其他一些操作.
public class CallListener extends PhoneStateListener { private static final String TAG = "sms"; // 最後的狀態,預設為空閒狀態 private static int lastState = TelephonyManager.CALL_STATE_IDLE; private Context context; public CallListener(Context context) { super(); this.context = context; } public void onCallStateChanged(int state, String incomingNumber) { Log.v(TAG, "CallListener call state changed : " + incomingNumber); // 如果當前狀態為空閒,上次狀態為響鈴中的話,則認為是未接來電 if (lastState == TelephonyManager.CALL_STATE_RINGING && state == TelephonyManager.CALL_STATE_IDLE) { sendSmgWhenMissedCall(incomingNumber); } // 最後的時候改變當前值 lastState = state; } private void sendSmgWhenMissedCall(String incomingNumber) { // ... 進行未接來電處理(發簡訊,發email等等通知) Toast.makeText(context, "您有未接來電,號碼為:" + incomingNumber, Toast.LENGTH_SHORT).show(); } }
2. 編寫CallReceiver,註冊來電廣播接收器。
public class CallReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i("sms", "CallReceiver Start..."); TelephonyManager telephony = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); CallListener customPhoneListener = new CallListener(context); telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); Bundle bundle = intent.getExtras(); String phoneNr = bundle.getString("incoming_number"); Log.i("sms", "CallReceiver Phone Number : " + phoneNr); } }
3. 在AndroidManifest.xml中的application節點下新增如下程式碼.進行註冊電話狀態改變廣播接收.
<receiver android:name=".CallReceiver"> <intent-filter android:priority="100"> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter> </receiver>
4. 在AndroidManifest.xml中新增讀取手機狀態的許可權.
<!--新增讀取手機狀態的許可權--> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
總結:
通過以上的步驟,當手機有未接來電時 sendSmgWhenMissedCall 該方法就會觸發,就可以進行相應的處理.