1. 程式人生 > >Android有未接來電後處理(判斷未接來電)

Android有未接來電後處理(判斷未接來電)

       在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 該方法就會觸發,就可以進行相應的處理.