0

在我的设备中,我已经设置了设备密码,现在我安装了由设备策略管理器管理的应用程序。现在当我调用这个方法时

 int currentPolicy = devicePolicyManager.getPasswordQuality(demoDeviceAdmin);
    if(currentPolicy==262144)passwordType="Alphabetic";
    else if(currentPolicy==327680)passwordType="Alphanumeric";
    else if(currentPolicy==131072)passwordType="Numeric";
    //if(currentPolicy==196608)passwordType="PASSWORD_QUALITY_NUMERIC_COMPLEX";
    else if(currentPolicy==393216)passwordType="Complex";
    else if(currentPolicy==196608)passwordType="Pattern";
    else if(currentPolicy==0)passwordType="None"; 

它没有给我密码类型。现在,如果我像这样在我的应用程序中通过设备策略管理器设置密码

  Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);

那么现在如果再次获得密码质量,它会给我正确的价值。第一次我认为设备策略管理器没有或存储旧密码类型。

所以我的问题是如何在通过设备策略管理器从我的应用程序设置密码之前获得密码质量。

谢谢你

4

2 回答 2

0

对于Android 6(独占)之前的设备,您可以通过调用类中的隐藏函数来获取解锁方法类型getActivePasswordQuality()LockPatternUtils可以通过Java反射调用该函数)。但是对于Android 6及以上,我还没有弄清楚如何获取解锁方法类型。

 /**
 * Determine authentication method type (DAS, PIN, Password or Biometric)
 */
private String getAuthenticationMethodType(){
    String LOCK_PATTERN_UTILS="com.android.internal.widget.LockPatternUtils";
    String ACTIVE_PASSWORD_QUALITY="getActivePasswordQuality";

    int lockProtectionLevel=0;
    try{
        Class <?> lockPatternUtilsClass=Class.forName(LOCK_PATTERN_UTILS);
        Object lockPatternUtils=lockPatternUtilsClass.getConstructor(Context.class).newInstance(this);

        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            // Have not figured out how to get the unlocking method type for Android 6 and above devices. The same method will not work on Android 6. See detailed explanation below.
        }else {
            Method method = lockPatternUtilsClass.getMethod(ACTIVE_PASSWORD_QUALITY);
            lockProtectionLevel=Integer.valueOf(String.valueOf(method.invoke(lockPatternUtils,null)));
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    switch (lockProtectionLevel){
        case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
        case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
            return "PIN";
        case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
        case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
        case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
            return "Password";
        case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
            return "DAS";
        case DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK:
            return "Biometric";
        default:return "None";
    }
}

对于Android 6,经过我到目前为止的所有测试,我发现如果我们仍然想通过function获取解锁方法getActivePasswordQuality(int userId),应用程序必须有权限android.permission.ACCESS_KEYGUARD_SECURE_STORAGE才能读取lockscreen.password_type,并获取解锁方法。但是,权限ACCESS_KEYGUARD_SECURE_STORAGE是签名权限,也就是说我们需要用厂商对系统进行签名的相同密钥(或者说权限)对app进行签名,才能成功的将签名权限授予app。

希望这可以帮助。

于 2016-10-26T08:16:40.337 回答
0

getPasswordQuality不报告当前密码的质量,它只报告允许的最低密码质量的策略设置。

基本上 getPasswordQuality 返回使用管理员的 setPasswordQuality 设置的值,如果有多个管理员处于活动状态,则返回聚合值。

管理员可以通过调用 DevicePolicyManager.isActivePasswordSufficient() 来检查当前密码是否足够好。

Keyguard 使用隐藏方法setActivePasswordState将当前密码状态报告给 DevicePolicyManager 。

据我所知,此信息不适用于第三方管理应用程序。

如果输入的密码不正确,keyguard 会调用 DevicePolicyManager.reportFailedPasswordAttempt,如果尝试失败次数过多,则会启动出厂重置。

希望这可以帮助。

/Marek Pola(索尼移动员工)

于 2016-01-15T21:56:04.993 回答