寫個實例實現Android中來電和去電的監聽,來電可以使用PhoneStateListener對電話狀態的改變進行監聽,去電需要動態或者靜態去註冊廣播接收器,對去電進行監聽;
來電:
來電所對應的三種靜態成員常量:
1、CALL_STATE_IDLE:空閒狀態,沒有任何活動。
2、CALL_STATE_OFFHOOK:摘機狀態,至少有個電話活動。該活動或是撥打(dialing)或是通話,或是 on hold。
3、CALL_STATE_RINGING:來電狀態,電話鈴聲響起的那段時間或正在通話又來新電,新來電話不得不等待的那段時間。
去電:
通過自定義廣播接收器,監聽手機發出的android.intent.action.NEW_OUTGOING_CALL的廣播,然後在廣播接收器中處理去電的相關邏輯。
實例代碼實現:
public class PhoneListenService extends Service {
private static final String tag = "PhoneListenService";
// 電話管理者對象
private TelephonyManager mTelephonyManager;
// 電話狀態監聽者
private MyPhoneStateListener myPhoneStateListener;
// 動態監聽去電的廣播接收器
private InnerOutCallReceiver mInnerOutCallReceiver;
@Override
public void onCreate() {
mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
myPhoneStateListener = new MyPhoneStateListener();
mTelephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
// 動態註冊廣播接收器監聽去電信息
mInnerOutCallReceiver = new InnerOutCallReceiver();
// 手機撥打電話時會發送:android.intent.action.NEW_OUTGOING_CALL的廣播
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
registerReceiver(mInnerOutCallReceiver, intentFilter);
super.onCreate();
}
/**
* 動態註冊廣播接收器監聽去電信息
*/
class InnerOutCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 獲取播出的去電號碼
String outPhone = getResultData();
Log.i(tag, "outPhone:" + outPhone);
}
}
/**
* 自定義內部類對來電的電話狀態進行監聽
*/
class MyPhoneStateListener extends PhoneStateListener {
// 重寫電話狀態改變時觸發的方法
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
Log.i(tag, "響鈴:" + incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(tag, "接聽");
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i(tag, "掛斷");
break;
}
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
// 取消來電的電話狀態監聽服務
if (mTelephonyManager != null && myPhoneStateListener != null) {
mTelephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_NONE);
}
// 取消去電的廣播監聽
if (mInnerOutCallReceiver != null) {
unregisterReceiver(mInnerOutCallReceiver);
}
super.onDestroy();
}
}
權限添加:
<!--讀取電話的狀態信息的權限-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--處理撥出電話,允許程序監視,修改或放棄播出電話-->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
另外: 這裏給大家提供一個AndroidManifest.xml中權限控制的在線查詢工具:
測試結果如下: