Android P 设置浅色壁纸后,虚拟键不显示

一、测试描述:

前提:设置Device theme为Light,手机内上传有浅色图片
操作步骤:
1、长按手机屏幕
2、点击Wallpapers
3、选择已有的浅色图片设置为Home screen
问题点:设置壁纸后,返回待机界面,手机屏幕闪了一下,虚拟键不显示
期望结果:虚拟键正常显示

测试视频: 

Android P 设置浅色壁纸后,虚拟键不显示

 

分析过程:

(1)首先要验证虚拟键是否真的消失? 点击虚拟按钮位置是否有效果。  ==>检测方法, 手动点击虚拟按键位置,譬如:长按recent 键位置,发现有响应。则说明虚拟按键并没有被屏蔽,只是背景色全黑而已。 

(2)发现功能是正常,则应该是UI绘画导致的问题。 通过工具sf_bqdump_P 进行dump 对应图层。(sf_bqdump_P :https://transfer.mediatek.com/Detail/Go/REQ30006023090)

(3) 从SF_bqdump_all 上看,发现android.systemui.ImageWallpaper 绘画底部有一部分是黑色区域,怀疑是壁纸的问题。

(4)将wallpaper pull 出来,观察壁纸是否正常. 命令 : adb pull  data/system/users/0/wallpaper   ./         

   壁纸:

 

(5)原始壁纸,根本就没有,下面的黑条。是在设置壁纸时,进行产生的。

(6)在设置壁纸的代码上分析,找出原因。通过debug 发现,解析图片时返回的大小是不正确的, 而且发现若是图片png 是正常的,若是jpg 就不正常.

  vendor/mediatek/proprietary/packages/apps/WallpaperPicker/src/com/android/wallpaperpicker/common/InputStreamProvider.java

    public Bitmap readCroppedBitmap(RectF cropBounds, int outWidth, int outHeight, int rotation) {

                //解析JPG的高度不正确,574x800  的jpg 图片,解析出来是574x835。 若是PNG 图片, 574x800  解析出来是574x800

               crop = decoder.decodeRegion(roundedTrueCrop, options);

}
   尝试使用crop in-memory 可以正常显示。
//BitmapRegionDecoder has failed, try to crop in-memory

(7)而且若将decodeRegion 解码忽略掉,直接使用BitmapRegionDecoder 就是正常的,那就说明是decodeRegion 解码的问题了。 现在问题已经清晰了,是decodeRegion 解析出来的图片高度不正确。 第一种方案是修改底层库为什么返回高度不正确, 对于底层库不熟悉,直接修改不能评估会有什么风险。第二种方案是framework 层,framework 也存在同样的问题,可能会存在未知风险。 第三种就修改上层app,毕竟此问题只有特殊的壁纸才会有此问题。

修改方案:

/packages/apps/WallpaperPicker/src/com/android/wallpaperpicker/common/InputStreamProvider.java

public Bitmap readCroppedBitmap(RectF cropBounds, int outWidth, int outHeight, int rotation) {
...

        Bitmap crop = null;
        if (decoder != null) {
            // Do region decoding to get crop bitmap
            BitmapFactory.Options options = new BitmapFactory.Options();
            if (scaleDownSampleSize > 1) {
                options.inSampleSize = scaleDownSampleSize;
            }
//修改代码开始

+            if (roundedTrueCrop.right> decoder.getWidth ()){
+                roundedTrueCrop.right = decoder.getWidth ();
+            }
+            if (roundedTrueCrop.bottom> decoder.getHeight ()){
+                roundedTrueCrop.bottom = decoder.getHeight ();
+            }
//修改代码结束

            crop = decoder.decodeRegion(roundedTrueCrop, options);
            decoder.recycle();
        }

....
}

总结:对于bug 修复,对于未知风险,要有畏惧之心。尽量在影响范围最小的情况下修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值