Как программно повесить звонок на Oreo и выше? - PullRequest
2 голосов
/ 19 мая 2019

Я создаю приложение, которое позволяет пользователям блокировать все входящие вызовы после активации услуги.

Существует явное отсутствие решения проблемы, когда речь идет о таргетинге на новые версии SDK, в моем случае Oreo и выше. Ближайшее решение, которое я нашел, это эта тема , но на этот вопрос нет принятого ответа, и ни один из предоставленных ответов не работает в моем случае.

Вот только некоторые ссылки, которые я также посетил:

Мой подход заключается в использовании службы переднего плана и прослушивании изменений состояния телефонных звонков.

@Override
public void onCreate() {
    super.onCreate();
    TelephonyManager telephonyManager = (TelephonyManager) getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
    telephonyManager.listen(new CallStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
    Log.d(TAG, "Called onCreate() method");
}

где это CallStateListener

private class CallStateListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String phoneNumber) {
        if (state == TelephonyManager.CALL_STATE_RINGING) {
            Log.d(TAG, "Phone is ringing");
            TelephonyManager telephonyManager = (TelephonyManager) getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
            try {
                //Gain access to ITelephony getter
                Class c = Class.forName(telephonyManager.getClass().getName());
                Method method = c.getDeclaredMethod("getITelephony");
                method.setAccessible(true);
                com.android.internal.telephony.ITelephony telephony = (ITelephony) method.invoke(telephonyManager);

                //Hung up the call
                telephony.endCall();
            } catch (Exception e) {
                Log.d(TAG, "Exception occurred: " + e.getMessage());
                e.printStackTrace();
            }
        }
    }
}

Я могу подтвердить, что сообщение журнала Phone is ringing получено

Исключение, которое я получаю: Exception occurred: MODIFY_PHONE_STATE permission required.

Разрешение MODIFY_PHONE_STATE недоступно сторонним разработчикам приложений. Я видел предложение изменить линтер, что я и сделал, но я все еще не могу запросить это разрешение, поэтому исключение сохраняется.

Есть ли альтернативный способ прерывать вызовы в этих версиях SDK? Если так, я хотел бы быть назначенным в правильном направлении. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...