java.lang.reflect.InvocationTargetException при отключении вызова в Android 7.1.1 - PullRequest
0 голосов
/ 15 мая 2018

Я использую следующий код для отключения вызова, он не отключается после обновления 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 Ответ

0 голосов
/ 15 мая 2018

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

EDIT : В качестве альтернативы вы можете использовать метод e.getCause(), чтобы получить базовый Exception. e здесь это ловля Исключение / Бросок.

...