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

时间:2011-05-22 01:59:15

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

我在Android应用中使用设备策略管理器,我遇到了Honeycomb设备的问题。尝试调用resetPassword时,我会抛出一个异常。这不是Froyo或Gingerbread的情况,因为这两种方法都可以正常工作。

错误是:

  

java.lang.RuntimeException:无法启动接收器Package.Name.Test:java.lang.SecurityException:Permission Denial:编写com.android.providers.settings.SettingsProvider uri content:// settings / secure from pid = x ,uid = y需要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实际上不会锁定键盘锁,直到在设置,安全,锁定电话之后设置的时间。

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

3 个答案:

答案 0 :(得分:2)

我也在努力解决这个问题。该解决方案也列在您的某个链接上,但我也会在此处提及它,以防它帮助其他人。

  • 如果设备是全新的(或出厂重置),则代码会失败,如您所述。

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

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

答案 1 :(得分:1)

在Android Honeycomb 3.0平台上,DevicePolicyServiceManager 非常与Gingerbread不同,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尽快解决此问题。

P.S。看来此问题已在ICS平台上修复,Google已从resetPassword()块中删除了checkPasswordInHistory()。我不认为这是一个很好的solutoin,我不知道为什么?也许他们想尽快发布ICS?

答案 2 :(得分:0)

我正在研究这个问题(在3.1上也可以很容易地重现,顺便说一下),但看起来你已经根据the issue you filed找出了它。我只想注意,以防万一其他人试图研究答案。