1. 程式人生 > 其它 >Android P 設定淺色桌布後,虛擬鍵不顯示

Android P 設定淺色桌布後,虛擬鍵不顯示

技術標籤:androidjava安卓

一、測試描述:

前提:設定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 修復,對於未知風險,要有畏懼之心。儘量在影響範圍最小的情況下修改。