來電信息的攔截以及判斷

如何攔截來電,並檢測到某些特定號碼時自動掛斷電話?
使用反射的技術訪問android SDK的內部功能來掛斷電話
1.攔截來電的廣播接收器類(InCallReceiver)的onReceive()方法android

 

 1 public void onReceive(final Context context,Intent intent){  2  //獲得電話管理服務,以便得到電話狀態
 3  TelephonyManager tm=(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);  4  //根據不一樣的來電狀態進行處理
 5  switch(tm.getCallState()){  6      //響鈴
 7   case TelephonyManager.CALL_STATE_RINGING:  8      //得到來電的電話號碼
 9   String incomingNumber=intent.getStringExtra("incoming_number"); 10    //假如來電號碼時12345678.則掛斷電話
11    if("12345678".equals(incomingNumber)){ 12    Calss<TelephonyManager> telephonyManagerClass=TelephonyManager.class; 13    //經過Java反射技術得到getITelephony方法對應的Method對象
14  Method telephonyMethod=telephonyManagerClass.getDelaredMethod("getITelephony",(Class[]) null); 15    //容許訪問getITelephony方法
16    telephonyMethod.setAccessible(true); 17    //調用getITelephony方法獲取ITelephony對象
18    Object obj=telephonyMethod.invoke(telephonyManager.(Object[]) null); 19    //獲取endCall方法對應Method對象
20    Method endCallMethod=obj.getClass().getMethod("endCall",null); 21   //容許訪問endCall方法
22   endCallMethod.setAccessible(true); 23   //調用endCall方法掛斷電話
24    endCallMethod.invoke(obj,null); 25 
26  } 27    break; 28    case TelephonyManager.CALL_STATE_OFFHOOK://接聽電話
29   Log.d("call_state","offhook"); 30   break; 31   case TelephonyManager.CALL_STATE_IDLE://掛斷電話
32  closeToast(); 33   break; 34  } 35  }

2.最後須要在清單文件中定義廣播接收器,並添加可接收來電廣播的權限
配置inCallReceiverspa

1 <receiver android:name=".InCassReceiver"
2 android:enable="treu">
3  <intent-=filter>
4  <action android:name="android.intent.action.PHONE_STATE"/>
5  <intent-filter>
6  </recevier>
相關文章
相關標籤/搜索