I am trying to get method reportLocation() through reflection from "android.location.ILocationManager$Stub".
CODE:
Class<?> mStub = Class.forName("android.location.ILocationManager$Stub");
Method getInterface = mStub.getMethod("asInterface", IBinder.class);
Class mServiceManager = Class.forName("android.os.ServiceManager");
Method getService = mServiceManager.getMethod("getService", String.class);
Object iBindermInterface = getService.invoke(null, "location");
Object mInterface = getInterface.invoke(null, (IBinder) iBindermInterface);
Method method = mInterface.getClass().getMethod("reportLocation", Location.class, Boolean.class);
ERROR:
java.lang.NoSuchMethodException: android.location.ILocationManager$Stub$Proxy.reportLocation [class android.location.Location, class java.lang.Boolean]
I do not see this method when I trying to print all methods from "android.location.ILocationManager$Stub":
Class<?> mStub = Class.forName("android.location.ILocationManager$Stub");
Method[] getInterfaceAll = mStub.getMethods();
for (Method getInt : getInterfaceAll)
Log.d(LOG_TAG, "getInt = "+getInt);
In Android P (SDK 28) I have no problem with it.
In Android Q (SDK 29) interface android.location.ILocationManager
does not have reportLocation()
method, instead, to my assumptions, interface com.android.internal.location.ILocationProviderManager
has onReportLocation()
. But this interface contains the abstract method onReportLocation()
and I cannot get its implementation.
What interface contain this method or it has been changed (renamed) to another method?
I found out how to put location on report.
Use the public boolean injectLocation(@NonNull Location newLocation) method, it can be obtained from ILocationManager.
Class<?> mStub = Class.forName("android.location.ILocationManager$Stub");
Method getInterface = mStub.getMethod("asInterface", IBinder.class);
Method getService = Class.forName("android.os.ServiceManager")
.getMethod("getService", String.class);
Object mInterface = getInterface
.invoke(null, (IBinder) getService.invoke(null, "location"));
Method method = mInterface.getClass()
.getMethod("injectLocation", Location.class);
method.invoke(mInterface, location);