Есть ли способ доступа к полям android классов API, таких как GnssMeasurements, для установки значений. В этом классе уже существуют сетевые методы publi c, но они имеют аннотацию @ TestApi . Я не знаю, как получить доступ к этим методам или как установить личные поля
Я пытался получить доступ к закрытым полям с помощью:
Class<?> c = GnssMeasurement.class;
Object o = null;
try {
o = c.newInstance();
} catch (IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
assert cc != null;
try {
Field f1 = o.getClass().getDeclaredField("mPseudorangeRateMetersPerSecond");
f1.setAccessible(true);
f1.set(o, 123456.789);
Double d = (Double) f1.get(o);
System.out.println("field: " + d);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
Здесь я получил следующую трассировку стека:
W/ocation_logger: Accessing hidden field Landroid/location/GnssMeasurement;->mPseudorangeRateMetersPerSecond:D (dark greylist, reflection)
W/System.err: java.lang.NoSuchFieldException: No field mPseudorangeRateMetersPerSecond in class Landroid/location/GnssMeasurement; (declaration of 'android.location.GnssMeasurement' appears in /system/framework/framework.jar)
W/System.err: at java.lang.Class.getDeclaredField(Native Method)
at com.example.simplelocation_logger2.MainActivity.initApp(MainActivity.java:287)
at com.example.simplelocation_logger2.MainActivity.onCreate(MainActivity.java:152)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
И я попытался также получить доступ к методам:
Class c;
try {
c = Class.forName("android.location.GnssMeasurement");
Method m = c.getMethod("setPseudorangeRateMetersPerSecond", Double.class);
Object o = m.invoke(null, 123456.789);
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
, который дал мне эту ошибку:
W/System.err: java.lang.NoSuchMethodException: setPseudorangeRateMetersPerSecond [class java.lang.Double]
W/System.err: at java.lang.Class.getMethod(Class.java:2068)
at java.lang.Class.getMethod(Class.java:1690)
at com.example.simplelocation_logger2.MainActivity.initApp(MainActivity.java:299)
W/System.err: at com.example.simplelocation_logger2.MainActivity.onCreate(MainActivity.java:152)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err: at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Нет ли способа получить доступ к этим полям?