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

Другие вопросы по тегам