J'essaie d'utiliser la réflexion pour accéder à certaines fonctionnalités non publiées de l'API de téléphonie. Actuellement j'ai du mal à instancier un objet serviceManager
qui est nécessaire pour obtenir le service "téléphone" comme un classeur que je peux ensuite utiliser pour instancier un objet de téléphonie qui est nécessaire pour passer un appel, terminer un appel, etc ...Réflexion pour accéder aux fonctionnalités de téléphonie avancées
actuellement quand je fais l'appel
serviceManagerObject = tempInterfaceMethod.invoke(null, new Object[] { new Binder() });
retourne un NullPointerException. Je crois que cela a à voir avec la création d'un nouveau liant au lieu d'envoyer le classeur approprié (que je ne suis pas sûr dont l'un est approprié)
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);
}
« Actuellement, je ne parviens pas à instancier un objet ServiceManager » est la seule information que vous donnez l'erreur ou un problème. Vous nous avez donné le code. Maintenant, dites-nous ce qu'il fait ou ne fait pas, ce qui est inattendu, et comment vous savez que cela ne fonctionne pas correctement. –