Android三方应用如何挂断电话

作者: 代码视觉 | 来源:发表于2017-10-20 14:47 被阅读54次

    Android 源码中挂断电话的方法众多,但大多数都是对系统级的开放,三方应用想调用这些接口基本是不行的.可以看看下面列出的两个例子,这些接口都冠以 @SystemApi的注解,三方应用是无法直接进行调用的。
    例如Telecommmanager.java中

        @SystemApi
        public boolean endCall() {
            try {
                if (isServiceConnected()) {
                    return getTelecomService().endCall();
                }
            } catch (RemoteException e) {
                Log.e(TAG, "Error calling ITelecomService#endCall", e);
            }
            return false;
        }
    

    同样在TelephonyManager.java中

        /** @hide */
        @SystemApi
        public boolean endCall() {
            try {
                ITelephony telephony = getITelephony();
                if (telephony != null)
                    return telephony.endCall();
            } catch (RemoteException e) {
                Log.e(TAG, "Error calling ITelephony#endCall", e);
            }
            return false;
        }
    
    

    那么三方应用想实现在自己的程序代码中挂断电话,就需要使用AIDL配合反射来进行实现。

    AIDL文件,这里需要注意的是包名必须是com.android.internal.telephony

    // ITelephony.aidl
    package com.android.internal.telephony;
    interface ITelephony {
      boolean endCall();
    }
    

    具体实现挂断电话的方法如下:

      public static ITelephony getITelephony(Context context) {
            TelephonyManager mTelephonyManager = (TelephonyManager) context
                    .getSystemService(TELEPHONY_SERVICE);
            Class c = TelephonyManager.class;
            Method getITelephonyMethod = null;
            try {
                getITelephonyMethod = c.getDeclaredMethod("getITelephony",
                        (Class[]) null); // 获取声明的方法
                getITelephonyMethod.setAccessible(true);
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
            try {
                ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(
                        mTelephonyManager, (Object[]) null); // 获取实例
                return iTelephony;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    

    完了之后可以直接在代码中通过调用getITelephony(Context).endCall();来进行通话的挂断。

    相关文章

      网友评论

        本文标题:Android三方应用如何挂断电话

        本文链接:https://www.haomeiwen.com/subject/aokvuxtx.html