Я создаю приложение, которое позволяет пользователям блокировать все входящие вызовы после активации услуги.
Существует явное отсутствие решения проблемы, когда речь идет о таргетинге на новые версии 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? Если так, я хотел бы быть назначенным в правильном направлении. Спасибо.