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

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

Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос