【问题标题】:Device Policy Manager - Reset Password - Android 3.0 Problems设备策略管理器 - 重置密码 - Android 3.0 问题
【发布时间】:2011-08-30 10:41:06
【问题描述】:

我在我的 Android 应用程序中使用设备策略管理器,但我遇到了 Honeycomb 设备的问题。尝试调用 resetPassword 时抛出异常。在 Froyo 或 Gingerbread 中情况并非如此,因为它们都可以正常工作。

错误是:

java.lang.RuntimeException: 无法启动接收器 Package.Name.Test: java.lang.SecurityException: Permission Denial: 从 pid=x 写入 com.android.providers.settings.SettingsProvider uri content://settings/secure , uid=y 需要 android.permission.WRITE_SETTINGS

我的安卓代码如下:

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 不会真正锁定键盘锁,直到在设置、安全、锁定手机之后设置的时间。

任何帮助都会很棒!我最近在 I/O 上买了一个蜂窝平板电脑,还没有在这个设备上测试过这个应用程序,但是我在市场网站上看到了运行 Xoom 3.0 的用户的错误。还没有看到任何 3.1 设备。

【问题讨论】:

    标签: android android-3.0-honeycomb device-admin


    【解决方案1】:

    我也遇到过这个问题,我可以告诉你的是,如果你甚至一次都没有手动设置密码,它会强制关闭请求 write_settings 权限,但如果你通过手动设置密码尝试一次-病房它会像魅力一样发挥作用。

    【讨论】:

      【解决方案2】:

      我也为此苦苦挣扎。该解决方案也列在您的一个链接上,但我也会在此处提及,以防它对其他人有所帮助。

      • 如果设备是全新的(或恢复出厂设置),代码会如您所描述的那样失败。

      • 如果用户只使用设置菜单输入密码一次,则相同的代码会以某种方式开始工作并继续工作。

      确实是一个非常奇怪的错误!

      【讨论】:

        【解决方案3】:

        在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()方法放在@987654325中@块。

        还有一点,即使你在AndroidManifest.xml文件中添加了WRITE_SETTINGS权限,它也会告诉你还需要WRTITE_SECURE_SETTINGS权限。

        希望谷歌能尽快解决这个问题。

        附:似乎这个问题已经在 ICS 平台上得到修复,谷歌已经从 resetPassword() 块中删除了 checkPasswordInHistory()。我不认为这是一个很好的解决方案,我不知道为什么?也许他们想尽快发布 ICS?

        【讨论】:

          【解决方案4】:

          我正在研究这个问题(顺便说一句,它在 3.1 上也很容易重现),但您似乎已经根据the issue you filed 解决了这个问题。我只是想在这里指出,以防其他人试图研究答案。

          【讨论】:

          • 很高兴知道。我假设您正在 xoom 上进行测试?这是迄今为止我见过的最疯狂的错误。没有多少人使用 decice admin APIs 并没有真正的帮助,或者如果他们这样做了,我还没有找到它们。
          • 是的...除非您正在制作像 SeekDroid 这样的应用程序,您希望允许某人亲自锁定或擦除他们的设备,或者您可能希望强制某人设置的企业应用程序为保护敏感的公司信息而设置的强密码,大多数人从不接近这些密码。
          • 其实...我是 SeekDroid 的开发者。希望谷歌的人能在 android 3.1+ 到来之前看到这个问题并修复这个问题。
          猜你喜欢
          • 2017-09-17
          • 1970-01-01
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-20
          • 2021-10-23
          • 2010-12-27
          相关资源
          最近更新 更多