如何以编程方式特别在设备API级别25、26、27上终止来电

时间:2018-08-01 18:54:55

标签: android android-8.0-oreo telephonymanager

我正在使用一个android应用程序,在该应用程序中,我确实拦截了传入的电话,并通过某些用户操作以编程方式结束了该电话。 为了实现这一点,使用了ITelephony.endCall

此实现仅在API级别24之前有效。

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级别28中引入的新API TelecomManager.endCall。该API在P beta设备上正常工作。

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 个答案:

答案 0 :(得分:0)

这是我如何存档此文件,也可以在android P版本上工作。 首先
清单权限:

filter

现在,对于大于21的API,还要求用户在代码中授予运行时权限。 如果比奥利奥低,那就这样问。

    <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" />

但是如果大于oreo,那么。

 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();
}