android keyguard鎖屏程式不能全螢幕顯示

來源:互聯網
上載者:User

關鍵字:android keyguard  鎖屏程式不能  全螢幕顯示  解鎖介面 變小   平台:S5PC110 S5PV210 系統:android2.3   android2.3.4
問題描述: 
   在第一次燒寫(用sd卡升級)完板子之後不能全螢幕顯示,但是重啟之後就是全螢幕顯示的了。在網上看了下,有相同問題如下:     android的鎖屏程式(frameworks/policies/base/phone/com/android/internal/policy/impl) 在第一次燒寫完板子之後不能全螢幕顯示,但是重啟之後就是全螢幕顯示的了,跟蹤代碼,感覺設定鎖定畫面大小的代碼應該在LockPatternKeyguardView.java裡面,但是log之後發現沒有call到裡面的畫螢幕的函數,請教一下,謝謝!

現象:

解法一:這個方法在網上比較長見,但是在我們的平台上有兩個問題,不過有些平台會好的,不建議用這個:
解法二:這個方法解了我們的問題,測試這麼長時間還沒出現問題:(推薦)


  解法一:這個方法在網上比較長見,但是在我們的平台上有兩個問題,不過有些平台會好的,不建議用這個:(1),豎屏時解鎖只有一邊,如所示;
(2),長按home時,最近開啟程式,那個介面也不滿屏。

更改代碼如下:

frameworks\base\policy\src\com\android\internal\policy\impl\KeyguardViewManager.java. android2.3.4_GB_T34H\frameworks\base\core\java\android\content\res\CompatibilityInfo.javadiff --git a/phone/com/android/internal/policy/impl/KeyguardViewManager.java b/phone/com/android/internal/policy/impl/KeyguardViewManager.javaindex ba1d7f5..38bf161 100644--- a/phone/com/android/internal/policy/impl/KeyguardViewManager.java+++ b/phone/com/android/internal/policy/impl/KeyguardViewManager.java@@ -28,6 +28,8 @@ import android.view.ViewGroup;import android.view.ViewManager;import android.view.WindowManager;import android.widget.FrameLayout;+import android.view.Display;+import android.util.DisplayMetrics; /**  * Manages creating, showing, hiding and resetting the keyguard.  Calls back@@ -97,9 +99,21 @@ public class KeyguardViewManager implements KeyguardWindowController {         if (mKeyguardHost == null) {             if (DEBUG) Log.d(TAG, "keyguard host is null, creating it..."); +            WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);+            DisplayMetrics  dm = new DisplayMetrics();+            wm.getDefaultDisplay().getMetrics(dm);+            Display display = wm.getDefaultDisplay();++            int statusBarHeight = (int)Math.ceil( 25 * dm.density);+            int height = display.getHeight();+            int width = display.getWidth();++            Log.i(TAG, "Display width = " + width);+            Log.i(TAG, "Display height = " + height);+            Log.i(TAG, "Statusbar height = " + statusBarHeight);+             mKeyguardHost = new KeyguardViewHost(mContext, mCallback); -            final int stretch = ViewGroup.LayoutParams.MATCH_PARENT;             int flags = WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN                     | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER                     | WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING@@ -109,7 +123,7 @@ public class KeyguardViewManager implements KeyguardWindowController {                 flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;             }             WindowManager.LayoutParams lp = new WindowManager.LayoutParams(-                    stretch, stretch, WindowManager.LayoutParams.TYPE_KEYGUARD,+                    width, (height - statusBarHeight), WindowManager.LayoutParams.TYPE_KEYGUARD,                     flags, PixelFormat.TRANSLUCENT);             lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;             lp.windowAnimations = com.android.internal.R.style.Animation_LockScreen;

解法二:這個方法解了我們的問題,測試這麼長時間還沒出現問題:(推薦)

1,android2.3.4_GB_T34H\frameworks\base\core\java\android\content\res

修改 frameworks/base/core/java/android/content/res/CompatibilityInfo.java中的如下部分:

public static void updateCompatibleScreenFrame(DisplayMetrics dm, int orientation,            Rect outRect) {        int width = dm.widthPixels;        int portraitHeight = (int) (DEFAULT_PORTRAIT_HEIGHT * dm.density + 0.5f);        int portraitWidth = (int) (DEFAULT_PORTRAIT_WIDTH * dm.density + 0.5f);        if (orientation == Configuration.ORIENTATION_LANDSCAPE) {            int xOffset = (width - portraitHeight) / 2 ;            outRect.set(xOffset, 0, xOffset + portraitHeight, portraitWidth);        } else {            int xOffset = (width - portraitWidth) / 2 ;            outRect.set(xOffset, 0, xOffset + portraitWidth, portraitHeight);        }

把上面這段程式改為下面這一段程式:
==》

public static voidupdateCompatibleScreenFrame(DisplayMetrics dm, int orientation,

            Rect outRect) {

        int width = dm.widthPixels;

        int portraitHeight = (int)(DEFAULT_PORTRAIT_HEIGHT * dm.density + 0.5f);

        int portraitWidth = (int)(DEFAULT_PORTRAIT_WIDTH * dm.density + 0.5f);

        if (orientation ==Configuration.ORIENTATION_LANDSCAPE) {

            int xOffset = (width -portraitHeight) / 2 ;

+  outRect.set(0, 0, 0 + dm.widthPixels,dm.heightPixels);       //新加入代碼

-  outRect.set(xOffset, 0, xOffset +portraitHeight, portraitWidth);   //刪除原來代碼部分

} else

 {

            int xOffset = (width -portraitWidth) / 2 ;

      +   outRect.set(0, 0, 0 +dm.widthPixels, dm.heightPixels);            //新加入代碼

       - outRect.set(xOffset, 0, xOffset + portraitWidth, portraitHeight);   //刪除代碼部分

}

    }

 紅色部分是我們改動的代碼,“-“ 是我們去除原始代碼:

frameworks/base/core/java/android/content/res/CompatibilityInfo.java這裡面,DEFAULT_PORTRAIT_HEIGHT /DEFAULT_PORTRAIT_WIDTH 這兩個值比較重要。

列印出一些值,下面分析:

 dm.density = 1.5 portraitHeight = 720 portraitWidth = 480 dm.widthPixels = 1024 dm.heightPixels= 600 width = dm.widthPixels

其實出現位移的原因是:
假設橫屏:

不正常情況下分析 :

xOffset = (width - portraitHeight) / 2= (1024-720)/ 2 = 152

所在在程式中原來的代碼是
outRect.set(xOffset, 0, xOffset + portraitHeight, portraitWidth);//原始代碼
outRect.set(152, 0, 152+ 720, 480);
xOffset 所以有了左右的位移,如所示:


改動後,正常情況下分析:

改動後計算:

outRect.set(0,
0, 0 + dm.widthPixels, dm.heightPixels);
outRect.set(0, 0, 0 + 1024, 600);


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.