Использование OS 2.2 классов DevicePolicyManager SDK на Android с поддержкой устройств OS 2.1 - PullRequest
1 голос
/ 28 апреля 2011

Я хочу использовать в своем приложении некоторые 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 Ответ

3 голосов
/ 28 апреля 2011

Если мне нужно реализовать DeviceAdminReceiver, будет ли работать рефлексия?

Не совсем. Вам нужно будет использовать условную загрузку классов, что означает, что вы можете просто пойти по этому пути, чтобы начать с.

Кто-нибудь знает о каких-либо недостатках или осложнениях?

Говоря от имени моего маленького уголка «кто-нибудь», я не знаю никаких недостатков. Я бы использовал константы VERSION_CODES в Build, а не целое число (7). И, если вы не поддерживаете 1.5, вы можете использовать SDK_INT на Build вместо SDK.

Вы бы порекомендовали рефлексию или условную загрузку классов для использования DevicePolicyManager?

Условная загрузка классов.

Потребуется ли мне DeviceAdminReceiver или я могу определить, есть ли у пользователя подходящий пароль, например, неоднократно вызывая isActivePasswordSufficient в моем приложении, чтобы подтвердить, что это было сделано?

Я не могу ответить. Если вы не получите другого ответа на этот вопрос, вы можете задать его в своем собственном вопросе SO.

Любые другие советы, если они у вас есть

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...