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

  • Post author:
  • Post category:java


在Android 7(牛轧糖)中运行应用程序时遇到问题.

当用户忘记密码时,我的应用程序就像自定义恢复一样.为此,我的应用请求管理员权限,并观察失败尝试的次数,如果达到X次数,则会生成代码并将其发送到用户的电子邮件.

该应用程序在Lollipop和棉花糖设备上运行良好,但是在Nougat中运行时会出现以下错误:java.lang.SecurityException:无法使用空密码进行调用

EmailActivity:

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:

表现:

android:name=”com.example.pin.AdminReceiver”

android:permission=”android.permission.BIND_DEVICE_ADMIN” >

android:name=”android.app.device_admin”

android:resource=”@xml/device_admin” />

输出日志:

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:管理员无法更改当前密码

输出日志:

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)

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.

我进行了一些研究和测试,但没有找到如何使我的设备管理应用成为设备所有者或配置文件所有者的方法.知道如何解决这个问题?

提前致谢!

解决方法:

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

我观察到同样的问题.

没有密码时,resetpassword有效.

清除密码失败.

密码更改也失败.

标签:policy,admin,device,java,android

来源: https://codeday.me/bug/20191111/2020023.html