Отражение для доступа к расширенным функциям телефонии - PullRequest
20 голосов
/ 04 января 2010

Я пытаюсь использовать рефлексию для доступа к некоторым неопубликованным функциям API телефонии. В настоящее время у меня возникают проблемы с созданием объекта serviceManager, необходимого для получения службы «телефон» в качестве связующего, который я затем могу использовать для создания экземпляра объекта телефонии, необходимого для выполнения вызова, завершения вызова и т. Д. 1002 *

в настоящее время, когда я звоню

serviceManagerObject = tempInterfaceMethod.invoke(null, new Object[] { new Binder() });

возвращает исключение nullPointerException. Я считаю, что это связано с созданием нового Binder вместо отправки соответствующего Binder (который я не уверен, какой из них подходит)

public void placeReflectedCall() throws ClassNotFoundException,
        SecurityException, NoSuchMethodException, IllegalArgumentException,
        IllegalAccessException, InvocationTargetException,
        InstantiationException {
    String serviceManagerName = "android.os.IServiceManager";
    String serviceManagerNativeName = "android.os.ServiceManagerNative";
    String telephonyName = "com.android.internal.telephony.ITelephony";

    Class telephonyClass;
    Class telephonyStubClass;
    Class serviceManagerClass;
    Class serviceManagerStubClass;
    Class serviceManagerNativeClass;
    Class serviceManagerNativeStubClass;

    Method telephonyCall;
    Method telephonyEndCall;
    Method telephonyAnswerCall;
    Method getDefault;

    Method[] temps;
    Constructor[] serviceManagerConstructor;

    // Method getService;
    Object telephonyObject;
    Object serviceManagerObject;
    String number = "1111111111";

    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);
    // this does not work
    serviceManagerObject = tempInterfaceMethod.invoke(null,
            new Object[] { new Binder() });

    IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject,
            "phone");
    Method serviceMethod = telephonyStubClass.getMethod("asInterface",
            IBinder.class);
    telephonyObject = serviceMethod
            .invoke(null, new Object[] { retbinder });

    telephonyCall = telephonyClass.getMethod("call", String.class);
    telephonyEndCall = telephonyClass.getMethod("endCall");
    telephonyAnswerCall = telephonyClass.getMethod("answerRingingCall");

    telephonyCall.invoke(telephonyObject, number);

}

Ответы [ 3 ]

5 голосов
/ 04 января 2010

Делая следующее

Binder tmpBinder = new Binder();
tmpBinder.attachInterface(null, "fake");
serviceManagerObject = tempInterfaceMethod.invoke(null,  new Object[] { tmpBinder });

вы получите экземпляр ServiceManagerProxy, затем следующая проблема произойдет в строке

telephonyCall.invoke(telephonyObject, number);
3 голосов
/ 18 августа 2010

У меня есть решение. Изменения:

String serviceManagerName = "android.os.IServiceManager"; 

до:

String serviceManagerName = "android.os.ServiceManager"; 
1 голос
/ 18 июня 2010

Да, это возможно! Я потратил 24 часа на изучение и обнаружение, и я нашел «свежее» решение!

// "cheat" with Java reflection to gain access to
// TelephonyManager's ITelephony getter
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(tm);

Любой, кто хочет разработать свое программное обеспечение для управления вызовами, посетит эту начальную точку:
http://www.google.com/codesearch/p?hl=en#zvQ8rp58BUs/trunk/phone/src/i4nc4mp/myLock/phone/CallPrompt.java&q=itelephony%20package:http://mylockforandroid%5C.googlecode%5C.com&d=0

Есть проект. и есть важные комментарии (и кредиты).

Вкратце: скопируйте файл aidl, добавьте разрешения в манифест, скопируйте и вставьте источник для управления телефонией.

Дополнительная информация для вас: Вы можете отправлять AT-команды, только если вы root. Затем вы можете прервать системный процесс и отправить команды, но вам потребуется перезагрузка, чтобы ваш телефон мог принимать и отправлять вызовы.

Я очень счастлив! Теперь мой Shake2MuteCall получит обновление!

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