Как программно заблокировать вызов в Android Nougat, Oreo и выше?

Этот код отлично работает до Android 6 (Marshmallow):

TelephonyManager tm = (TelephonyManager) context
        .getSystemService(Context.TELEPHONY_SERVICE);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
Object telephonyService = m.invoke(tm); 
c = Class.forName(telephonyService.getClass().getName()); 
m = c.getDeclaredMethod("endCall"); 
m.setAccessible(true); 
m.invoke(telephonyService);

После прочтения документации

Я все еще звонил endCall(context, number). Не удалось заблокировать вызов. Нужно рабочее решение для Android Nougat, Oreo, Pie и выше.

Обновить

Я включил следующий код из официальной документации Nougat, но номер не был добавлен в черный список.

Cursor c = mContext.getContentResolver().query(BlockedNumberContract.BlockedNumbers.CONTENT_URI,
                    new String[]{BlockedNumberContract.BlockedNumbers.COLUMN_ID,
                            BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER,
                            BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER}, null, null, null);

person cooldev    schedule 29.08.2018    source источник
comment
@jackjay Предоставленная вами ссылка не работает, я полагаю, вы имели в виду это .   -  person Filnor    schedule 29.08.2018
comment
Это исправленная ссылка: source.android.com/devices/tech/connect/block -numbers Сейчас я это реализую.   -  person cooldev    schedule 29.08.2018
comment
да, вы должны пройти по этой ссылке.   -  person jack jay    schedule 29.08.2018
comment
Я хотел только поместить числа в черный список, поэтому я написал это: `Значения ContentValues ​​= new ContentValues(); values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, 1234567890); Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, значения); ` Но это не занесение номеров в черный список   -  person cooldev    schedule 29.08.2018


Ответы (1)


Android 9 не может использовать интерфейсы, отличные от SDK

Android 9 вводит новые ограничения на использование интерфейсов, отличных от SDK, будь то напрямую, через отражение или через JNI. Эти ограничения применяются всякий раз, когда приложение ссылается на интерфейс, не относящийся к SDK, или пытается получить его дескриптор с помощью отражения или JNI.

И похоже, что вы не можете читать или писать в BlockedNumberContract, если только это не системное приложение, или номеронабиратель по умолчанию, или приложение для смс по умолчанию.

Разрешения

Только система, приложение SMS по умолчанию и приложение для телефона по умолчанию (см. TelecomManager.getDefaultDialerPackage()) и приложения оператора связи (см. CarrierService) могут считывать и писать поставщику заблокированных номеров. Однако доступ к canCurrentUserBlockNumbers(Context) может получить любое приложение.

person Aeiman Bakeer    schedule 16.12.2018