Диспетчер политик устройств - сброс пароля - проблемы с Android 3.0
Я использую Device Policy Manager в своем приложении для Android, и у меня проблема с сотовыми устройствами. При попытке вызвать resetPassword я получаю исключение. Это не относится к Froyo или Gingerbread, так как оба работают нормально.
Ошибка:
java.lang.RuntimeException: Невозможно запустить приемник Package.Name.Test: java.lang.SecurityException: Отказ в разрешении: запись com.android.providers.settings.SettingsProvider uri content://settings/secure from pid=x, uid= у требуется android.permission.WRITE_SETTINGS
Мой код Android выглядит следующим образом:
DevicePolicyManager mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
if ((mDPM.getActiveAdmins() != null) && (mDPM.isAdminActive(new ComponentName(context, DeviceAdmin.class)))) {
mDPM.resetPassword(extra, DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);
mDPM.lockNow();
} else {
Log.d(TAG, "Could not lock because device admin not enabled");
}
Проблема возникает в:
mDPM.resetPassword(extra, DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);
Мой Device_Admin.xml:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<force-lock />
<wipe-data />
<reset-password />
</uses-policies>
</device-admin>
Как я уже говорил, администратор устройства отлично работает на устройствах Froyo и Gingerbread, хотя у меня действительно есть некоторые проблемы с пользователями, использующими разные клавиатуры, например Droid X и HTC Sense. Эта проблема со временем. Когда я вызываю lockNow, устройство выключит экран, но HTC Sense или MotoBlur фактически не будут блокировать клавиатуру до времени, которое было установлено в меню "Настройки", "Безопасность", "Блокировка телефона после".
Любая помощь будет потрясающей! Я только недавно приобрел сотовый планшет для ввода-вывода и еще не тестировал приложение на этом устройстве, но я вижу ошибки на веб-сайте маркета для пользователей с Xoom под управлением 3.0. Еще не видел ни одного 3.1 устройства.
4 ответа
Я тоже боролся с этим. Решение также указано в одной из ваших ссылок, но я упомяну об этом и здесь, если оно кому-то поможет.
Если устройство новое (или сброс настроек), код не работает, как вы описали.
Если пользователь вводит пароль с помощью меню настроек только один раз, почему-то тот же код начинает работать и продолжает работать.
Действительно очень странная ошибка!
Я также столкнулся с этой проблемой, что я могу сказать, что если вы не устанавливали пароль вручную хотя бы один раз, это даст принудительный ответ на запрос разрешения write_settings, но если вы попробуете один раз, установив пароль оттуда, он будет работать как шарм.
На платформе Android Honeycomb 3.0 DevicePolicyServiceManager
сильно отличается от пряников, весь поток resetPassword()
является:
DevicePolicyServiceManager.resetPassword() -->
LockPatternUtils.checkPasswordInHistory() -->
LockPatternUtils.passwordToHash() -->
LockPatternUtils.getSalt() -->
LockPatternUtils.putLong(SALT_KEY, salt) -->
Settings.Secure.putLong(SALT_KEY, salt)
Здесь вы должны знать, почему WRITE_SETTINGS
требуется, кажется, это ошибка Google, они не поместили метод LockPatternUtils.checkPasswordInHistory() в Binder.clearCallingIndentity()
блок.
Еще одна вещь, даже если вы добавите WRITE_SETTINGS
разрешение в вашем AndroidManifest.xml
файл, он скажет вам, что WRTITE_SECURE_SETTINGS
разрешение также требуется.
Надеюсь, что Google может решить эту проблему как можно скорее.
PS Похоже, что эта проблема была исправлена на платформе ICS, Google удалил checkPasswordInHistory () из блока resetPassword(). Я не думаю, что это хороший раствор и я не знаю почему? Может быть, они хотят выпустить ICS как можно скорее?
Я смотрел на эту проблему (которая также легко воспроизводится на 3.1, кстати), но, похоже, вы уже разобрались с ней, основываясь на проблеме, которую вы подали. Я просто хотел отметить это здесь, на случай, если кто-нибудь еще попытается найти ответ.