把google app禁用掉后锁屏界面左下角voice图标不变

平台:Android M 6.0.1

一、问题现象

1、进入Settings-Apps-Google App,点击disable,按电源键锁屏,再次按电源键,锁屏界面左下角依然是Voice的图标,向上滑动左下角的voice图标,白屏一段时间,然后回到原始界面。。

2、再次进入Settings-Apps-Google App,点击enable,关屏,开屏,向上滑动左下角的voice图标,白屏一段时间,然后回到原始界面。

3、正常情况下,滑动voice图标,会跳转到voice search应用,进行语音搜索。

二、问题分析

左下角的图标,是由updateLeftAffordanceIcon函数控制

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java

mLeftIsVoiceAssist为true时,显示voice图标,为false时,显示call图标,经过打log分析,发现当disable Google App时,mLeftIsVoiceAssist的值始终为true,所以图标才没有更新,通过暗码###666#把persist.sys.google.enabled设置为0时,即禁用所有Google应用,通过adb shell getprop persist.sys.google.enabled获取到的值为0,此时mLeftIsVoiceAssist更新为false,故得出结果如果只是在Settings中单独禁用Google App那一个,对persist.sys.google.enabled的值是没有影响的,而Google又没有单独对Google app进行监听,但是Voice search依赖Google App,所以当单独禁用Google App时,图标不变,但是滑动的时候因为voice search已经被禁用,故无法启动,白屏了一段时间。


至于白屏的详细原因,经log分析得知,在手机开机后,会从frameworks/base/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManager/ServiceImpl.java中的startLocked方法启动一个服务VoiceInteractionService.java,当把Google app禁用掉后,service断开,onServiceDisconnected方法执行,mService被赋值为null,导致launchVoiceAssistFromKeyguard方法直接return,总之罪魁祸首就是service断开,当把google app enable时,没有重新启动service。

三、解决方案

1、左下角图标不变的解决方案:新加一个对那个google app的disable状态的监听,加入到mLeftIsVoiceAssist的判断当中。

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java

public Boolean getGoogleqsbBoolean(){
         List<ApplicationInfo> slice =
mContext.getPackageManager().getInstalledApplications(0);

         for (ApplicationInfo applicationInfo : slice) {
             if
(applicationInfo.packageName.equals("com.google.android.googlequicksearchbox"))
{
                 return applicationInfo.enabled;
             }
         }//"com.google.android.googlequicksearchbox"
         return true;
     }



updateLeftAffordanceIcon(){
        mLeftIsVoiceAssist = canLaunchVoiceAssist() && getGoogleqsbBoolean();
}

 

2、service重启方案:

frameworks/base/core/java/com/android/internal/content/PackageMonitor.java

onSomePackagesChanged——switchImplementationIfNeededLocked——startLocked

if (mSomePackagesChanged) {
System.out.println("ran.zhou--PM---L412---mSomePackagesChanged");
             onSomePackagesChanged();
         }

/*public Boolean getGoogleqsbBoolean(){
                 List<ApplicationInfo> slice =
mContext.getPackageManager().getInstalledApplications(0);

                 for (ApplicationInfo applicationInfo : slice) {
                     if
(applicationInfo.packageName.equals("com.google.android.googlequicksearchbox"))
{
                         return applicationInfo.enabled;
                     }
                 }//"com.google.android.googlequicksearchbox"
                 return false;
             }*/


/*if (getGoogleqsbBoolean()) {
                             change = PACKAGE_UPDATING;
                         }*/

public int isPackageAppearing(String packageName) {
         if (mAppearingPackages != null) {
System.out.println("ran.zhou--PM--L218--mAppearingPackages != null");
             for (int i=mAppearingPackages.length-1; i>=0; i--) {
                 if (packageName.equals(mAppearingPackages[i])) {
                     return mChangeType;
                 }
             }
         }
         return PACKAGE_UNCHANGED;
     }


以上为调用逻辑


} else if (Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
         if (pkg.equals("com.google.android.googlequicksearchbox")) {
                 mAppearingPackages = components;
             }此段代码为解决方案



未完待续~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值