該業務是屬于跨進程的數據獲取
所需權限
<!-- 打電話權限 --><uses-permission android:name="android.permission.CALL_PHONE"/><!-- 監聽電話權限 --><uses-permission android:name="android.permission.READ_PHONE_STATE"/><!-- 處理呼出電話權限,用于修改呼出的電話號碼 --><uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
1、建一個新的包,包名為
com.android.internal.telephony
在該包內創建一個接口類 (官方已經定死的,名為代理接口)
interface ITelephony{ boolean endCall(); void answerRingingCall();}
2、找到你的項目存在的文件夾位置,找到該接口類,將后綴名java 改名 aidl (后綴名需在電腦進行設置可見才可以改到的具體步驟百度)
ITelephony.aidl
3、重啟eclips 或者刷新項目
配置成功后,在 gen 目錄下會有一個包名為com.android.internal.telephony的包 里面有一個 ITelephony.java類 自動生成的
4、 在需要掛斷電話功能的類添加一個方法 在需要調用該方法的位置時,需要傳入一個TelephoneManager對象
原理:通過反射獲取aidl代理接口的對象 ITelephony
private static ITelephony getITelephony(TelephonyManager telephony)throws IllegalArgumentException,IllegalaccessException,
InvocationTargetException,NoSuchMethodException {Method getITelephonyMethod = null;getITelephonyMethod = telephony.getClass().getDeclaredMethod("getITelephony");getITelephonyMethod.setAccessible(true);// 私有化函數也能使用return (ITelephony) getITelephonyMethod.invoke(telephony);}
5、寫一個內部類繼承自PhoneStateListener
class MyPhoneStateListener extends PhoneStateListener {/** * 電話狀態改變監聽 */@Overridepublic void onCallStateChanged(int state, // 狀態常量String incomingNumber) {Log.i("info", "額incomingNumber" + incomingNumber);switch (state) {case TelephonyManager.CALL_STATE_IDLE:// 空閑Log.i("info", "CALL_STATE_IDLE" + "空閑狀態");break;case TelephonyManager.CALL_STATE_OFFHOOK:// 接聽Log.i("info", "CALL_STATE_OFFHOOK" + "接聽狀態");break;case TelephonyManager.CALL_STATE_RINGING:// 振鈴TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);ITelephony iTelephony;try {iTelephony = getITelephony(manager);if (iTelephony != null) {if (incomingNumber.equals("123")) {
//如果號碼為123try {iTelephony.endCall();Log.i("info", "已掛斷" + " 號碼為:" + incomingNumber);} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} else {Log.i("info", "CALL_STATE_RINGING" + "振鈴狀態" + "ITelephonyManager為空");}} catch (IllegalArgumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (IllegalAccessException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (InvocationTargetException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (NoSuchMethodException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}break;}}}
6、在生命周期開始時onCreate時 進行廣播注冊即可
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
// 開啟電話監聽狀態TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);// 調用listener的監聽方法、監聽電話狀態的方法listener = new MyPhoneStateListener();manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);// 注冊廣播接收器receiver = new MyPhoneReceiver();IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);registerReceiver(receiver, filter);}
新聞熱點
疑難解答