java - 无法使用设备策略管理器在 Android 7 中重置密码

标签 java android admin device policy

我在 Android 7 (Nougat) 中运行应用程序时遇到问题。 当用户忘记密码时,我的应用程序就像自定义恢复一样工作。为实现这一点,我的应用程序请求管理员权限并观察失败尝试的次数,如果达到 X 数字,则会生成一个代码并发送到用户的电子邮件。

此应用在 Lollipop 和 Marshmallow 设备上运行良好,但在 Nougat 中运行时出现以下错误:java.lang.SecurityException: Cannot call with null password

电子邮件 Activity :

private static final String DEFAULT_PASSWORD = "";
// Commented code
DevicePolicyManager devicePolicyManager =
            (DevicePolicyManager) getApplicationContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
devicePolicyManager.resetPassword(DEFAULT_PASSWORD, 0);

资源@xml/device_admin.xml:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <watch-login />
        <reset-password />
    </uses-policies>
</device-admin>

list :

...
<receiver
    android:name="com.example.pin.AdminReceiver"
    android:permission="android.permission.BIND_DEVICE_ADMIN" >
    <intent-filter>

        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
    <meta-data
        android:name="android.app.device_admin"
        android:resource="@xml/device_admin" />
</receiver>
...

输出日志:

01-02 06:35:48.383 7354-7354/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.pin, PID: 7354
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pin/com.example.pin.EmailActivity}: java.lang.SecurityException: Cannot call with null password
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6251)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
Caused by: java.lang.SecurityException: Cannot call with null password
at android.os.Parcel.readException(Parcel.java:1683)
at android.os.Parcel.readException(Parcel.java:1636)
at android.app.admin.IDevicePolicyManager$Stub$Proxy.resetPassword(IDevicePolicyManager.java:3829)
at android.app.admin.DevicePolicyManager.resetPassword(DevicePolicyManager.java:2242)
at com.example.pin.EmailActivity.onCreate(EmailActivity.java:25)
at android.app.Activity.performCreate(Activity.java:6666)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527) 
at android.os.Handler.dispatchMessage(Handler.java:110) 
at android.os.Looper.loop(Looper.java:203) 
at android.app.ActivityThread.main(ActivityThread.java:6251) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

如果将 DEFAULT_PASSWORD 更改为不同于空字符串的任何内容,异常将更改为:java.lang.SecurityException: Admin cannot change current password

输出日志:

04-20 22:31:18.228 8880-8880/com.example.pin E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.pin, PID: 8880
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pin/com.example.pin.EmailActivity}: java.lang.SecurityException: Admin cannot change current password
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6251)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
Caused by: java.lang.SecurityException: Admin cannot change current password
at android.os.Parcel.readException(Parcel.java:1683)
at android.os.Parcel.readException(Parcel.java:1636)
at android.app.admin.IDevicePolicyManager$Stub$Proxy.resetPassword(IDevicePolicyManager.java:3829)
at android.app.admin.DevicePolicyManager.resetPassword(DevicePolicyManager.java:2242)
at com.example.pin.EmailActivity.onCreate(EmailActivity.java:25)
at android.app.Activity.performCreate(Activity.java:6666)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527) 
at android.os.Handler.dispatchMessage(Handler.java:110) 
at android.os.Looper.loop(Looper.java:203) 
at android.app.ActivityThread.main(ActivityThread.java:6251) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 

我已经阅读了来自 Android device policy manager, reset password 的文档,但不明白我应该做什么。

Calling with a null or empty password will clear any existing PIN, pattern or password if the current password constraints allow it. Note: This will not work in N and later for managed profiles, or for device admins that are not device owner or profile owner. Once set, the password cannot be changed to null or empty except by these admins.

我做了一些研究和测试,但没有找到如何让我的设备管理应用程序成为设备所有者或配置文件所有者。知道如何解决这个问题吗?

提前致谢!

最佳答案

来自 Android 文档: https://developer.android.com/about/versions/nougat/android-7.0-changes.html

“设备管理员的重置密码限制现在适用于配置文件所有者。设备管理员不能再使用 DevicePolicyManager.resetPassword() 来清除密码或更改已设置的密码。设备管理员仍然可以设置密码,但只有当设备没有密码、PIN 或图案。”


我观察到同样的问题。 当没有密码时,resetpassword 起作用。 清除密码失败。 修改密码也失败。

关于java - 无法使用设备策略管理器在 Android 7 中重置密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43522740/

相关文章:

安卓编程 : Background color not fully covering fragments

vba - 以不同用户身份写入文件

java - 错误 : operator does not exist: bigint = character varying for empty list of long

java - 如何使用远程调试功能获取对象的数据?

android - Viewpager 适配器不改变 View

directory - Plone 文件夹限制

macos - VS Code 不会保存更改 - Mac

java - NoSuchMethodError : java. lang.Exception.addSuppressed : Updating from Java 1. 6 到 1.7

java - 将条件转移到多个方法中

android - 错误 :Failed to open zip file. Gradle 依赖项缓存可能已损坏(这有时会在网络连接超时后发生。)