Android开发经验谈程序员安卓rom源码分析

Android三方应用如何挂断电话

2017-10-20  本文已影响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();来进行通话的挂断。

上一篇 下一篇

猜你喜欢

热点阅读