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