我正在尝试编写一个能够访问 Android Keyguard 应用程序(包含“锁定屏幕”的系统应用程序)的应用程序。我尝试使用反射来获取对正在运行的 KeyguardUpdateMonitor 实例的引用,但到目前为止,我只收到了一个java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
. 这是导致问题的代码:
try {
DexFile df = new DexFile(new File("/system/priv-app/Keyguard.apk"));
String packageName = "com.android.keyguard";
Context packageContext = context.createPackageContext(packageName,
Context.CONTEXT_INCLUDE_CODE
| Context.CONTEXT_IGNORE_SECURITY);
ClassLoader cl = packageContext.getClassLoader();
Class keyguardUpdateMonitor = df.loadClass(packageName
+ ".KeyguardUpdateMonitor", cl);
Method getKeyguardUpdateMonitorInstance
= keyguardUpdateMonitor.getMethod("getInstance", Context.class);
Object argumentsForGetInstance[] = new Object[1];
argumentsForGetInstance[0] = packageContext;
Object keyguardUpdateMonitorInstance
= getKeyguardUpdateMonitorInstance.invoke(null, packageContext);
...
}
此代码在服务中实例化的类中运行。
我试图调用的方法的签名是public static KeyguardUpdateMonitor getInstance(Context context)
.
- 我可以按照我打算的方式使用反射,还是我需要有一个自己的实例
KeyguardUpdateMonitor
? - 我需要特殊权限吗?
- 我的想法有根本性的错误吗?如果是,我如何在 Android(KitKat 及更高版本)中访问 Keyguard?