代码之家  ›  专栏  ›  技术社区  ›  Krishna Sharma

如何在API级别25、26、27上以编程方式结束来电

  •  0
  • Krishna Sharma  · 技术社区  · 7 年前

    我正在开发一个android应用程序,在这个应用程序中,我会拦截来电,并通过一些用户操作以编程方式结束它。 ITelephony.endCall .

    private void rejectCallViaTelephonyManager() {
        ITelephony telephonyService = getTelephonyService();
        if (telephonyService != null) {
            telephonyService.endCall();
        }
    }
    
    private ITelephony getTelephonyService() {
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        try {
            Class c = Class.forName(tm.getClass().getName());
            Method m = c.getDeclaredMethod("getITelephony");
            m.setAccessible(true);
            return (ITelephony) m.invoke(tm);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    

    我还发现了新的API TelecomManager.endCall 在API 28级中引入。这对Pβ设备很好。

    private void rejectCall() {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P /* 28 */) {
                TelecomManager manager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
                if (manager != null) {
                    // complains required API app requires API level 28 (current min is 21).
                    manager.endCall();
                }
            } else {
                rejectCallViaTelephonyManager();
            }
            Log.d(TAG, "call ended successfully.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    现在我正在寻找解决方案,使其适用于API级别25、26、27

    你知道我们怎么做吗?

    我的目标是“结束来电”功能应该适用于所有版本的API级别21以后。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ali Asjad    7 年前

    这里是我如何归档这一点,并在android P版本上工作。
    清单权限:

        <uses-permission android:name="android.permission.READ_CALL_LOG" />
        <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
        <uses-permission android:name="android.permission.CALL_PHONE" />
        <uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" />
        <uses-permission
        android:name="android.permission.MODIFY_PHONE_STATE"
        tools:ignore="ProtectedPermissions" />
    

    如果低于奥利奥那么这样问。

     requestPermissions(new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.READ_PHONE_STATE},REQUEST_CONTACTS);
    

    但如果大于奥利奥那么。

    requestPermissions(new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.ANSWER_PHONE_CALLS,Manifest.permission.READ_PHONE_STATE,Manifest.permission.READ_CALL_LOG},REQUEST_CONTACTS);
    

    现在在你的应用程序中创建一个完整的包。

    com.android.internal.telephony
    

    在此包中放置此接口。

    package com.android.internal.telephony;
    public interface ITelephony {
    boolean endCall();
    void answerRingingCall();
    void silenceRinger();
    }
    

     private void endCall(){
     ITelephony telephonyService;
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        if (tm == null)
            return;
        try {
            Class c = Class.forName(tm.getClass().getName());
            Method m = c.getDeclaredMethod("getITelephony");
            m.setAccessible(true);
            telephonyService = (ITelephony) m.invoke(tm);
        } catch (Exception e) {
            e.printStackTrace();
        }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
            if (telecomManager != null) {
                telecomManager.endCall();
            }
        } else {
    
            if (telephonyService != null) {
                telephonyService.silenceRinger();
                telephonyService.endCall();
            }
        }}
    
    推荐文章