关键字: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);



更多相关文章

  1. android知识点记录汇总(不断更新中)
  2. Android(安卓)eclipse SVN提交时提示:Could not execute PROPPATC
  3. 非常全的android manifest详解
  4. 程序猿媛一:Android滑动翻页+区域点击事件
  5. Android(Java):SharedPreferences
  6. 【Android(安卓)- 框架】之Retrofit+RxJava的使用
  7. Android实现图片轮播切换实例代码
  8. Android在java代码中设置margin
  9. 自动拨号程序调试过程

随机推荐

  1. android 多媒体扫描过程(Android(安卓)Med
  2. Excessive JNI global references - Andr
  3. Android(安卓)Studio第三十九期 - popWin
  4. Android——ViewPager+Fragment+ListView
  5. Android7.0中文文档(API)-- LinearLayout.L
  6. android 微信 listview 气泡
  7. imagebutton 带文字
  8. 【Android】安卓运行问题
  9. Android’s HTTP Clients(Android的HTTP客
  10. android典型代码系列(四)------android全