首页 > 学院 > 开发设计 > 正文

AIDL自动挂断电话

2019-11-08 00:30:38
字体:
来源:转载
供稿:网友

该业务是属于跨进程的数据获取

所需权限

<!--     打电话权限 --><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);}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表