设备策略管理器 - 重置密码 - Android 3.0 问题



我正在Android应用程序中使用设备策略管理器,但Honeycomb设备出现问题。 尝试调用重置密码时,我抛出了一个异常。 在Froyo或Gingerbread中并非如此,因为两者都可以正常工作。

错误是:

java.lang.RuntimeException: 无法启动接收器 Package.Name.Test: java.lang.SecurityException: Permission Denial: write com.android.providers.settings.SettingsProvider uri content://settings/secure from pid=x, 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 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,这似乎是谷歌的错误,他们没有把 LockPatternUtils.checkPasswordInHistory() 方法放在Binder.clearCallingIndentity()块中。

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

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

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

我也遇到了这个问题,我可以说的是,如果您没有手动设置密码,即使是一次,它也会强制关闭要求write_settings许可,但如果您尝试一次从那里手动设置密码,它将像魅力一样工作。

我正在研究这个问题(顺便说一句,在 3.1 上也很容易重现),但根据您提交的问题,您似乎已经弄清楚了。 我只是想在这里指出,以防其他人试图研究答案。

相关内容

  • 没有找到相关文章

最新更新