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