我在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设备。
答案 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找出了它。我只想注意,以防万一其他人试图研究答案。