【问题标题】:Can't Reset Password in Android 7 with Device Policy Manager无法使用设备策略管理器在 Android 7 中重置密码
【发布时间】:2017-09-17 06:39:42
【问题描述】:

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

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

电子邮件活动:

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>

清单:

...
<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 的文档,但不明白我应该做什么。

如果当前密码限制允许,使用空密码或空密码进行呼叫将清除任何现有的 PIN、图案或密码。注意:这不适用于 N 及更高版本的托管配置文件,或者对于不是设备所有者或配置文件所有者的设备管理员。一旦设置,密码不能更改为 null 或空,除非由这些管理员。

我进行了一些研究和测试,但没有找到如何让我的设备管理应用成为设备所有者或个人资料所有者。知道如何解决这个问题吗?

提前致谢!

【问题讨论】:

  • 我有同样的问题,如果您有任何解决方案,请提前告诉我。
  • 抱歉,我找不到任何适合我的解决方案。
  • 在这种情况下我应该怎么做,因为我必须解决这个问题。
  • 尝试阅读有关安全异常、设备管理员和设备警察管理器的 android 文档。也许你能找到一些平常的东西,我怎么说,我没有找到任何解决这个问题的方法,所以我决定停止这个项目。

标签: java android admin device policy


【解决方案1】:

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

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


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

【讨论】:

    【解决方案2】:

    您的应用作为设备或配置文件所有者将要求尚未配置该设备或配置文件 - 因此,如果您想要迎合“标准”应用使用模型(即可从 Play 商店/网站下载并由任何用户安装)谁想要它),这不是你的选择。如果这是一个公司场景,尽管您必须研究如何正确实施设备或配置文件所有者;然后您可以使用 adb 将您的应用设置为所有者,但可能仍需要先将设备恢复出厂设置(至少对于设备所有权)。个人资料所有权意味着与主要/私人个人资料不同的工作资料。听起来您想重置他们的主要个​​人资料的密码,但听起来您将无法做到。

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多