该业务是属于跨进程的数据获取
所需权限
<!-- 打电话权限 --><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);}
新闻热点
疑难解答