Я пытаюсь программно прервать телефонный звонок в Android Oreo.
Вот мой исходный код.
public boolean killCall(Context context) {
try {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Method m1 = tm.getClass().getDeclaredMethod("getITelephony");
m1.setAccessible(true);
Object iTelephony = m1.invoke(tm);
Method m2 = iTelephony.getClass().getDeclaredMethod("silenceRinger");
Method m3 = iTelephony.getClass().getDeclaredMethod("endCall");
m2.invoke(iTelephony);
m3.invoke(iTelephony);
} catch (Exception ex) { // Many things can go wrong with reflection calls
Log.d(TAG,"PhoneStateReceiver **" + ex.getCause());
ex.getCause().printStackTrace();
return false;
}
return true;
}
Но я получаю исключение java.lang.SecurityException: Neither user 10187 nor current process has android.permission.CALL_PHONE.
Несмотря на то, что я определил разрешение в манифесте
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" />
, я также беру разрешения на время выполнения с помощью всплывающего окна, и при просмотре разрешений приложения разрешение телефона также включается там.Мне интересно, почему это происходит, и удивительно, что это происходит только на Android Oreo, а не на более низких версиях.Любое полезное предложение было бы замечательно.