Никогда не вмешивайтесь в сухопутную войну в Азии.

у использовать некоторые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 (например,Вот), Я считаю, у меня есть два варианта:

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 в моем приложении, чтобы подтвердить, что это было сделано?Любые другие советы, если они есть (например,этот вопрос предполагает, что могут быть проблемы, заставляющие пользователя сбросить свой пароль).

Спасибо!