Android P 解决“从锁定屏幕中添加用户”功能不起作用

3 篇文章 0 订阅
1 篇文章 0 订阅

问题描述

打开设置–>系统–>高级–>多用户,如下图所示:

在这里插入图片描述
测试同事发现当没有启用这个功能时候,在锁屏页面还是可以添加新用户,默认是没有打开这个功能的。先看看锁屏页面,在锁屏页面调出下拉菜单:

在这里插入图片描述
然后点击方框中的头像:

在这里插入图片描述
可以进入这个页面,点击添加访客,可以进行切换,而此时设置中的从锁定屏幕中添加用户是禁止的状态,说明确实存在问题,那就跟代码吧。

这里先说一下我的思路,先找到设置中设置从锁定屏幕中添加用户的代码,先确定点击点击按钮settings做了什么。因为锁屏属于systemUi模块,所以我们得在systemui中拿到settings中这个按钮的状态。然后当在锁屏页面点击头像按钮时进行检查,如果settings中的设置是禁止状态,那就不响应点击事件就是了。

分析过程

首先根据字符串找到settings中设置的逻辑,搜索到字符串再根据它的name找到使用它的地方:
在这里插入图片描述
然后vim res/xml/user_settings.xml +38
在这里插入图片描述

这个字符串用在了com.android.settingslib.RestrictedSwitchPreference控件中,显然这是个Preference,所以继续搜索它的key:
在这里插入图片描述
熟悉settings的同学都应该知道,它里面的控件都对应Controller控制器。对于这个控件它的控制器就是AddUserWhenLockedPreferenceController,

@Override
public boolean setChecked(boolean isChecked) {
   return Settings.Global.putInt(mContext.getContentResolver(),
          Settings.Global.ADD_USERS_WHEN_LOCKED, isChecked ? 1 : 0);
}

很简单,这里就是保存状态的地方。

下面再去找点击锁屏添加用户头像的响应方法,通过Android Device Monitor可以直接找到resource-id :com.android.systemui:id/multi_user_switch ,继续grep:

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java:112:        mMultiUserSwitch = findViewById(R.id.multi_user_switch);

mMultiUserSwitch 是一个自定义控件MultiUserSwitch,
路径:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java

打开它的源码会发现它里面有一个onClick方法,这里就是响应点击的地方了。

所以我们要做的就是在onClick中添加判断是否允许添加新用户的代码。

解决方法

先声明两个成员变量

//记录settings中按钮状态
private boolean mAddUsersWhenLocked;
//判断当前是否在锁屏页面
private KeyguardManager mKeyguardManager;

在MultiUserSwitch构造方法中初始化mKeyguardManager :

public MultiUserSwitch(Context context, AttributeSet attrs) {
	super(context, attrs);
    mUserManager = UserManager.get(getContext());
    //add by pitt.guo for *** start
    mKeyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
    //add by pitt.guo for *** end
}

在onClick中添加下面代码,因为这个按钮在解锁后的页面也是存在的,所以一定要加上对锁屏状态的判断:

    @Override
    public void onClick(View v) {
        //add by pitt.guo for *** start
        mAddUsersWhenLocked = Settings.Global.getInt(mContext.getContentResolver(),
                    Settings.Global.ADD_USERS_WHEN_LOCKED, 0) != 0;
		//判读锁屏状态 和 settings中的设置
        if(mKeyguardManager.inKeyguardRestrictedInputMode() && !mAddUsersWhenLocked){
        	//如果走到这,说明在锁屏页面,而且setting没有打开该功能,直接返回
            return;
        }
        //add by pitt.guo for *** end
        if (mKeyguardMode) {
            if (mKeyguardUserSwitcher != null) {
                mKeyguardUserSwitcher.show(true /* animate */);
            }
        } else if (mQsPanel != null && mUserSwitcherController != null) {
            View center = getChildCount() > 0 ? getChildAt(0) : this;

            center.getLocationInWindow(mTmpInt2);
            mTmpInt2[0] += center.getWidth() / 2;
            mTmpInt2[1] += center.getHeight() / 2;

            mQsPanel.showDetailAdapter(true,
                    getUserDetailAdapter(),
                    mTmpInt2);
        }
    }

以上就是对该问题的分析过程和解决方法了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值