在Android上使用OS 2.2 DevicePolicyManager SDK类,同时支持OS 2.1设备

时间:2011-04-27 23:09:53

标签: android reflection sdk

我想在我的应用中使用一些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。有人知道它的任何缺点或并发症吗?

所以,我的问题是:

  • 您是否建议使用DevicePolicyManager进行反射或条件类加载?
  • 我是否需要DeviceAdminReceiver,或者我可以检测用户是否有合适的密码,例如通过在我的应用中反复调用isActivePasswordSufficient来确认它已完成?
  • 如果您有其他任何提示(例如this question表示可能存在强制用户重置密码的问题)。

谢谢!

1 个答案:

答案 0 :(得分:3)

  

如果我需要实现DeviceAdminReceiver,反射会起作用吗?

不是真的。你需要使用条件类加载,这意味着你也可以从那条路线开始。

  

有人知道它有任何缺点或并发症吗?

代表我的“任何人”的小角落发言,我不知道有什么缺点。我会在VERSION_CODES上使用Build常量,而不是整数(7)。而且,除非您支持1.5,否则您可以SDK_INT使用Build而不是SDK

  

您是否建议使用DevicePolicyManager进行反射或条件类加载?

条件类加载。

  

我是否需要DeviceAdminReceiver,或者我是否可以检测用户是否具有合适的密码,例如通过在我的应用程序中反复调用isActivePasswordSufficient来确认它已经完成了吗?

我无法回答。如果你没有得到另一个解决这一点的答案,你可以考虑在自己的SO问题中提出这个问题。

  

如果你有任何其他提示

永远不要卷入亚洲的陆战。