android4.4如何开机横屏

软件环境:android4.4

硬件平台:marvell

之前调试过在android4.0上将屏幕开机旋转90度,找到了契合点,调整起来还是相对简单,只需设置一个名称为ro.sf.hwrotation = 90即可,android的surface系统显示的时候会读取该系统属性的值,从而将显示界面旋转,但是android4.4的surfaceflinger机制做了调整,自始至终没有发现对该属性的处理判断,可能有其他的暗门,我暂时没发现,因此就把4.0判断属性的那一套移植了过来,具体改动如下:

--- a/services/surfaceflinger/DisplayDevice.cpp

+++ b/services/surfaceflinger/DisplayDevice.cpp

@@ -384,6 +384,11 @@ status_t DisplayDevice::orientationToTransfrom(

int orientation, int w, int h, Transform* tr)

{

uint32_t flags = 0;

+    char property[PROPERTY_VALUE_MAX];

+    if (property_get("ro.sf.hwrotation", property, NULL) > 0) {

+        if (atoi(property) == 90)

+            orientation = DisplayState::eOrientation90;

+    }

switch (orientation) {

case DisplayState::eOrientationDefault:

flags = Transform::ROT_0;

@@ -411,6 +416,7 @@ void DisplayDevice::setProjection(int orientation,

const int w = mDisplayWidth;

const int h = mDisplayHeight;

+    char property[PROPERTY_VALUE_MAX];

Transform R;

DisplayDevice::orientationToTransfrom(orientation, w, h, &R);

@@ -418,7 +424,12 @@ void DisplayDevice::setProjection(int orientation,

if (!frame.isValid()) {

// the destination frame can be invalid if it has never been set,

// in that case we assume the whole display frame.

-        frame = Rect(w, h);

+        if (property_get("ro.sf.hwrotation", property, NULL) > 0) {

+            if (atoi(property) == 90)

+                frame = Rect(h, w);

+        } else {

+            frame = Rect(w, h);

+        }

}

--- a/services/surfaceflinger/SurfaceFlinger.cpp

+++ b/services/surfaceflinger/SurfaceFlinger.cpp

@@ -674,6 +674,7 @@ status_t SurfaceFlinger::getDisplayInfo(const sp<IBinder>& display, DisplayInfo*

const HWComposer& hwc(getHwComposer());

float xdpi = hwc.getDpiX(type);

float ydpi = hwc.getDpiY(type);

+    char property[PROPERTY_VALUE_MAX];

// TODO: Not sure if display density should handled by SF any longer

class Density {

@@ -718,8 +719,15 @@ status_t SurfaceFlinger::getDisplayInfo(const sp<IBinder>& display, DisplayInfo*

info->orientation = 0;

}

-    info->w = hwc.getWidth(type);

-    info->h = hwc.getHeight(type);

+    if (property_get("ro.sf.hwrotation", property, NULL) > 0) {

+        if (atoi(property) == 90) {

+            info->w = hwc.getHeight(type);

+            info->h = hwc.getWidth(type);

+        }

+    } else {

+        info->w = hwc.getWidth(type);

+        info->h = hwc.getHeight(type);

+    }

这两个文件做完相应的修改之后,问题来了,开机以及后续的一系列显示确实进入了横屏模式,但是触摸屏却依然没有旋转过来,上层对touch点位的处理还是按竖屏模式处理的。。。接着尝试修改了surface的不少地方企图扭转touch点位,均告失败,最终选择了一个能解决问题但未必最优的方案,修改Input系统的处理。改动如下:

--- a/services/input/InputReader.cpp

+++ b/services/input/InputReader.cpp

@@ -42,6 +42,7 @@

#include "InputReader.h"

#include <cutils/log.h>

+#include <cutils/properties.h>

#include <input/Keyboard.h>

#include <input/VirtualKeyMap.h>

@@ -2954,6 +2955,12 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) {

int32_t naturalPhysicalWidth, naturalPhysicalHeight;

int32_t naturalPhysicalLeft, naturalPhysicalTop;

int32_t naturalDeviceWidth, naturalDeviceHeight;

+

+            char property[PROPERTY_VALUE_MAX];

+            if (property_get("ro.sf.hwrotation", property, NULL) > 0) {

+                if (atoi(property) == 90)

+                    mViewport.orientation = DISPLAY_ORIENTATION_90;

+            }

switch (mViewport.orientation) {

case DISPLAY_ORIENTATION_90:

naturalLogicalWidth = mViewport.logicalBottom - mViewport.logicalTop;

@@ -4246,6 +4253,11 @@ void TouchInputMapper::cookPointerData() {

// X, Y, and the bounding box for coverage information

// Adjust coords for surface orientation.

float x, y, left, top, right, bottom;

+        char property[PROPERTY_VALUE_MAX];

+        if (property_get("ro.sf.hwrotation", property, NULL) > 0) {

+            if (atoi(property) == 90)

+                mSurfaceOrientation = DISPLAY_ORIENTATION_90;

+        }

switch (mSurfaceOrientation) {

case DISPLAY_ORIENTATION_90:

至此,触摸屏旋转成功。

本人是本着遇到问题解决问题的原则,也许4.4有类似4.0的关卡可以一步属性设置即可,只是本人没有发现这道关,上述提供的方案仅供参考以及笔者作为记录之用,稳定性还有待考究,本人未做全面的测试。有问题的同仁可以和我探讨,有更好方案的朋友还望不吝赐教。谢谢~~~

时间: 2024-10-09 15:37:55

android4.4如何开机横屏的相关文章

Android4.0强制横屏竖屏

Android的启动默认是横屏或者竖屏我们的TV本来是横屏显示,但是有客户竟然要竖屏显示,昨天快下班收到的需求,竟然说7.19就要搞定.思路有2个,一个就是修改LCD的默认输出,但是这个不是我这个水平能轻而易举搞定的.另外一个就是底层应该给上层porting出接口.像这种系统性的接口一般在build.prop里.找到一个相关度比较大的属性ro.sf.hwrotation=270,和旋转有关的,联想到0,90,180,270.试试吧,将其改为ro.sf.hwrotation=0,测试了一下,OK,

迅为嵌入式4418开发板Android4.4-更改uboot开机LOGO

本文转自迅为论坛:http://www.topeetboard.com 在 iTOP4412 开发板 Android启动时出现了三个 logo,就是 uboot 的 logo,内核的logo,还有系统的 logo.但是在 iTOP4418 开发板中少了两个.具体情况是这样的:uboot 和内核都显示同一个logo,跑起来的时候都是在读取:/home/4418/android/device/nexell/drone2/boot 中的logo.bmp. 为了显示自己的 logo,其实只要找张图片来替

[转]android logo:内核、android开机动画

平台信息:内核:linux2.6/linux3.0系统:android/android平台:S5PV310(samsungexynos4210/4412) 作者:xubin341719(欢迎转载,请注明作者) android开logo,这一块在工作改动的也是比较多的,也比较简单,不同的公司,不同型号的产品,开机的标识不一样. 我们平时目测的开机logo一般是两种:静态的和动画的.其实在实现logo的过程中,有四幅图片:(1).uboot显示:(2).kernel显示logo_linux_clut

iTOP-4412开发板-嵌入式平台开机测试

iTOP-4412平台硬件的连接1.核心板和底板的连接 迅为iTOP-4412开发板采用工业级进口板对板连接器,拔插方便稳定可靠,如下图所示. 另外迅为独家提供两种封装的核心板,接口定义完全兼容,如下图所示. iTOP-4412开发平台,核心板和底板可分离.拆分核心板的时候,使用塑料的薄片在核心和底板任意一边轻轻撬动,听到清脆的响声,表明撬动的一边的连接器已经分离,接着依次分离其它三边. 安装核心板的时候,核心板和底板的箭头要指向同一方向,将核心板和底板对齐,然后按压核心板,听到四次清脆的响声,

编译android4.4.4 for nexus4

参考https://source.android.com 1.配置开发环境 Initializing a Build Environment 编译Android4.4.4要求使用64bit系统.所以我在虚拟机上装了一个Ubuntu 14.04 64bit. 首先安装jdk,andorid官网提供的安装方法是是安装OpenJDK7,android4.4.4要求使用jdk1.6.所以我去oracle下载一个1.6版本的jdk http://www.oracle.com/technetwork/jav

Launcher Activity在开机时重新启动两次解决的方法

今天在看log的时候发现,Launcher activity会被onDestroy掉一次.然后再重新启动. 可能原因推測: 1.横竖屏切换 2.MCC MNC等Configuration改变引起的 MCC(移动国家码)和 MNC(移动网络码) 因为当时的Launcher设置为强制横屏了.应该是不会引起重新启动的. 对于Configuration改变系统会发一个android.intent.action.CONFIGURATION_CHANGED的广播 于是就做了一个广播接收器去检測是不是因为Co

Android KK开机按power键不能灭屏,须过会儿才能灭屏

这是Google issue,原生Android4.4都有此问题.流程是:AMS发出BOOT_COMPLETED,PowerManager收到BOOT_COMPLETED后check Boot animation是否完成,如果完成,就会将内部的成员mBootCompleted置为true,之后再按power键才会正常休眠. PowerManagerService.java在systemReady()方法中动态注册BootCompletedReceiver监听ACTION_BOOT_COMPLET

google 分屏 横屏模式 按home键界面错乱故障分析(二) 分屏的启动过程

google 进入分屏后在横屏模式按home键界面错乱(二) 你确定你了解分屏的整个流程? Android 关机对话框概率没有阴影故障分析 android recent key长按事件弹起触发最近列表故障分析 google 分屏 popup无法显示故障分析 分享此文便是对代码GG的支持,也是爱的表达方式,所以让爱来的猛烈些吧. 代码阅读,请到此处http://androidxref.com 查看原生代码 前情回顾: google 分屏 横屏模式 按home键界面错乱故障分析(一) 上一节我们主要

Android隐藏虚拟按键,关闭开机动画、开机声音

/*********************************************************************** * Android隐藏虚拟按键,关闭开机动画.开机声音 * 声明: * 有时候,我们可能会希望隐藏掉android中的虚拟按键,当然,那个 * Android的开机动画,有时候也是挺讨人厌的,也是可以隐藏的. * * 2016-1-7 深圳 南山平山村 曾剑锋 **********************************************