我想在我的应用中使用一些DevicePolicyManager方法。 DevicePolicyManager是在OS 2.2中引入的,但我的应用程序必须继续在OS 2.1设备上运行。
这是我想要做的伪代码:
if (needSecurity)
{
if (runningOS2.2orGreater)
{
// Invoke the required security policy, e.g.
setPasswordQuality(myComponentName, PASSWORD_QUALITY_NUMERIC)
}
else
{
// Tell the user they can't use this feature
}
}
通过阅读文档,我认为我可能还需要一个DeviceAdminReceiver来处理onPasswordFailed和onPasswordSucceeded回调。
从其他Stackoverflow问题(例如here),我相信我有两个选择:
1。反射
继续针对OS 2.1 SDK进行构建,并使用反射在运行时调用类,例如
Class myClass =
ClassLoader.getSystemClassLoader().loadClass("android.app.admin.DevicePolicyManager")
Object DPMInstance = myClass.newInstance();
Method myMethod = myClass.getMethod("setPasswordQuality",
new Class[] { ComponentName.class,
int.class });
myMethod.invoke(DPMInstance,
new Object[] { myComponentName,
PASSWORD_QUALITY_NUMERIC });
如果我需要实现DeviceAdminReceiver,反射会起作用吗?我如何处理DeviceAdminReceiver的回调并回调到我自己的应用程序类?
2。条件类加载
更改为针对OS 2.2 SDK构建。在运行时,如果当前设备版本是OS 2.2或更高版本,则仅加载OS 2.2类,例如,
int sdk = new Integer(Build.VERSION.SDK).intValue();
if (sdk > 7)
{
sLog.info("OS 2.2 or later");
return new myClassImplementsDeviceAdminInterfaces();
}
else
{
sLog.info("OS 2.1 or earlier");
return new myClassDoesNotSupportDeviceAdmin();
}
这种方法看起来会产生更容易支持的代码,并且可能也适用于DeviceAdminReceiver。有人知道它的任何缺点或并发症吗?
所以,我的问题是:
谢谢!
答案 0 :(得分:3)
如果我需要实现DeviceAdminReceiver,反射会起作用吗?
不是真的。你需要使用条件类加载,这意味着你也可以从那条路线开始。
有人知道它有任何缺点或并发症吗?
代表我的“任何人”的小角落发言,我不知道有什么缺点。我会在VERSION_CODES
上使用Build
常量,而不是整数(7
)。而且,除非您支持1.5,否则您可以SDK_INT
使用Build
而不是SDK
。
您是否建议使用DevicePolicyManager进行反射或条件类加载?
条件类加载。
我是否需要DeviceAdminReceiver,或者我是否可以检测用户是否具有合适的密码,例如通过在我的应用程序中反复调用isActivePasswordSufficient来确认它已经完成了吗?
我无法回答。如果你没有得到另一个解决这一点的答案,你可以考虑在自己的SO问题中提出这个问题。
如果你有任何其他提示
永远不要卷入亚洲的陆战。