android keyguard锁屏程序不能全屏显示
2011-12-05 17:11
274 查看
关键字:android keyguard 锁屏程序不能 全屏显示 解锁界面 变小
平台:S5PC110 S5PV210系统:android2.3 android2.3.4
问题描述:
在第一次烧写(用sd卡升级)完板子之后不能全屏显示,但是重启之后就是全屏显示的了。在网上看了下,有相同问题如下:
android的锁屏程序(frameworks/policies/base/phone/com/android/internal/policy/impl) 在第一次烧写完板子之后不能全屏显示,但是重启之后就是全屏显示的了,跟踪代码,感觉设置锁屏界面大小的代码应该在LockPatternKeyguardView.java里面,但是log之后发现没有call到里面的画屏幕的函数,请教一下,谢谢!
现象:
![](http://hi.csdn.net/attachment/201112/5/0_132307573383i4.gif)
解法一:这个方法在网上比较长见,但是在我们的平台上有两个问题,不过有些平台会好的,不建议用这个:
解法二:这个方法解了我们的问题,测试这么长时间还没出现问题:(推荐)
解法一:这个方法在网上比较长见,但是在我们的平台上有两个问题,不过有些平台会好的,不建议用这个:
(1),竖屏时解锁只有一边,如下图所示;
![](http://hi.csdn.net/attachment/201112/5/0_13230760279bq7.gif)
(2),长按home时,最近打开程序,那个界面也不满屏。
![](http://hi.csdn.net/attachment/201112/5/0_1323076085qaF6.gif)
更改代码如下:
frameworks\base\policy\src\com\android\internal\policy\impl\KeyguardViewManager.java. android2.3.4_GB_T34H\frameworks\base\core\java\android\content\res\CompatibilityInfo.java diff --git a/phone/com/android/internal/policy/impl/KeyguardViewManager.java b/phone/com/android/internal/policy/impl/KeyguardViewManager.java index 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 所以有了左右的偏移,如下图所示:
![](http://hi.csdn.net/attachment/201112/5/0_132307621476c0.gif)
改动后,正常情况下分析:
改动后计算:
outRect.set(0,
0, 0 + dm.widthPixels, dm.heightPixels);
outRect.set(0, 0, 0 + 1024, 600);
![](http://hi.csdn.net/attachment/201112/5/0_1323076265S5nr.gif)
相关文章推荐
- 开发Android平板电脑程序不能全屏显示问题的解决
- android让程序全屏显示
- HotApp小程序统计开发总结之设置了navigationBarBackgroundColor颜色,android 可以显示,ios不能显示
- Android源码去除锁屏及应用程序开机自动运行不锁屏全屏显示
- android 4.0 dialog不能显示全屏,status bar不能不能屏蔽
- 控制Android系统 全屏并且 程序开机自动运行 并且实现程序运行中 开机不锁屏
- android去掉系统状态栏(StatusBar),让所有app程序均是全屏显示
- 分享Android平板电脑上开发应用程序不能全屏显示的问题解决
- android 解决ScrollView嵌套ListView的问题,不能全屏,全屏不能显示下面控件
- android去掉系统状态栏(StatusBar),让所有app程序均是全屏显示
- Android程序在各个分辨率设备上全屏显示
- cocos2d-x在android调用第三方sdk时,弹出的页面不能全屏显示,露出的游戏页面不停闪烁
- 解决Android实现照相机程序时不能显示摄像头的问题
- Android设置Activity(界面)为全屏显示的两种方法 xml和java程序
- Android手机或Android平板电脑 应用不能全屏显示,解决方案!
- Android源码去除锁屏及应用程序开机自动运行不锁屏全屏显示
- Android实例-全屏显示程序(XE10+小米2)(无图)
- Android程序如何全屏显示
- HBuilder开发iPad程序不能全屏显示的解决方法
- Android 应用程序不能全屏显示