| 事件 | 廣播 Action / 監聽方式 | 所需權限 |
|---|---|---|
| 來電鈴響 | TelephonyManager.ACTION_PHONE_STATE_CHANGED (隱式廣播)或 PhoneStateListener 監聽 CALL_STATE_RINGING | READ_PHONE_STATE |
| 來電接通 | PhoneStateListener 監聽 CALL_STATE_OFFHOOK | READ_PHONE_STATE |
| 來電掛斷 | PhoneStateListener 監聽 CALL_STATE_IDLE (從 OFFHOOK 轉 IDLE 為掛斷) | READ_PHONE_STATE |
| 去電撥出 | Intent.ACTION_NEW_OUTGOING_CALL (有序廣播,可攔截修改號碼) | PROCESS_OUTGOING_CALLS |
| 短信接收 | Telephony.Sms.Intents.SMS_RECEIVED_ACTION ("android.provider.Telephony.SMS_RECEIVED") | RECEIVE_SMS、READ_SMS |
| 短信發送狀態 | SmsManager.sendTextMessage 的 sentIntent / deliveryIntent | SEND_SMS |
public class CallListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String number) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
// 來電,number 為來電號碼,啟動閃光服務
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
// 接通
break;
case TelephonyManager.CALL_STATE_IDLE:
// 掛斷/空閒
break;
}
}
}
// 在 Service onCreate 中註冊
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(new CallListener(), PhoneStateListener.LISTEN_CALL_STATE);
<receiver android:name=".OutgoingCallReceiver">
<intent-filter android:priority="100">
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
// onReceive 中 getResultData() 獲取號碼,setResultData(newNumber) 修改
<receiver android:name=".SmsReceiver" android:exported="true" android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="999">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
// onReceive 解析 pdus 獲取 SmsMessage
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
requestPermissions)。ACTION_PHONE_STATE_CHANGED 需動態註冊或用 PhoneStateListener。startForeground)。