java.lang.reflect.InvocationTargetException при отключении вызова в Android 7.1.1

Я использую следующий код для отключения вызова, он не отключается после обновления Android до 7.1.1, и я получаю: "java.lang.SecurityException: разрешение MODIFY_PHONE_STATE" требуется исключение.

 String serviceManagerName = "android.os.ServiceManager";
            String serviceManagerNativeName = "android.os.ServiceManagerNative";
            String telephonyName = "com.android.internal.telephony.ITelephony";
            Class<?> telephonyClass;
            Class<?> telephonyStubClass;
            Class<?> serviceManagerClass;
            Class<?> serviceManagerNativeClass;
            Method telephonyEndCall;
            Object telephonyObject;
            Object serviceManagerObject;
            telephonyClass = Class.forName(telephonyName);
            telephonyStubClass = telephonyClass.getClasses()[0];
            serviceManagerClass = Class.forName(serviceManagerName);
            serviceManagerNativeClass = Class.forName(serviceManagerNativeName);
            Method getService = // getDefaults[29];
                    serviceManagerClass.getMethod("getService", String.class);
            Method tempInterfaceMethod = serviceManagerNativeClass.getMethod("asInterface", IBinder.class);
            Binder tmpBinder = new Binder();
            tmpBinder.attachInterface(null, "fake");
            serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder);
            IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone");
            Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class);
            telephonyObject = serviceMethod.invoke(null, retbinder);
            telephonyEndCall = telephonyClass.getMethod("endCall");
            telephonyEndCall.invoke(telephonyObject);

У меня есть все разрешение на вызов, он работает в зефир.

1 ответ

InvocationTargetException брошен, потому что Reflection оборачивает любой другой Exception в базовом методе в этот класс. Попробуйте поместить весь код в блок try/catch и распечатать трассировку стека с помощью e.printStackTrace(), Должна быть строка "Причины:", которая, надеюсь, укажет вам правильное направление.

РЕДАКТИРОВАТЬ: В качестве альтернативы вы можете использовать e.getCause() метод, чтобы получить основной Exception, e здесь ловится исключение / бросок.

Другие вопросы по тегам