簡體   English   中英

如何以編程方式特別在設備API級別25、26、27上終止來電

[英]How to end the incoming phone call programmatically specially on devices API level 25,26,27

我正在使用一個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以后的所有版本。

這是我存檔的方式,並且也可以在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" />

現在,在大於21的API上,還要求用戶在代碼中授予運行時權限。 如果低於奧利奧,那就這樣問。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM