近期公司接了个海思平台的广告机项目,客户需求软件支持屏幕能进行360度旋转;屏幕旋转功能我用了SystemProperties.set(“setprop persist.prop.screenorientation”, “str”);方法设置;其中str是设置屏幕旋转的方向,
//setprop persist.prop.screenorientation landscape ---------横屏
//setprop persist.prop.screenorientation portrait ---------竖屏
//setprop persist.prop.screenorientation seascape ---------180 度
//setprop persist.prop.screenorientation upsideDown --------270 度
设置完属性后重启,屏幕方向是旋转过来了;可是广告机还配有遥控器,结果,遥控器的方向键跟屏幕方向对不上;
经过查看源码日志,原来是遥控器的按键值也跟着变化;
最后经过一天的代码追踪,得到以下的解决方法:
1.frameworks\base\core\java\android\view\ViewRootImpl.java
在ViewPostImeInputStage内部类的processKeyEvent(QueuedInputEvent q)方法里添加以下代码,
判断当前系统的方向;
import android.os.SystemClock;
import android.os.SystemProperties;
String orientation = SystemProperties.get(PROPERTIES_ORIENTATION_DEGREE);
if(orientation.equals(“portrait”)){//顺时90°
try {
if(event.getKeyCode() == 19){
event = createKeyEvent(new KeyEvent(event.getAction(),22));
}else if(event.getKeyCode() == 20){
event = createKeyEvent(new KeyEvent(event.getAction(),21));
}else if(event.getKeyCode() == 22){
event = createKeyEvent(new KeyEvent(event.getAction(),20));
}else if(event.getKeyCode() == 21){
event = createKeyEvent(new KeyEvent(event.getAction(),19));
}
} catch (Exception e) {
e.printStackTrace();
}
}else if(orientation.equals(“upsideDown”)){//逆时90°
try {
if(event.getKeyCode() == 19){
event = createKeyEvent(new KeyEvent(event.getAction(),21));
}else if(event.getKeyCode() == 20){
event = createKeyEvent(new KeyEvent(event.getAction(),22));
}else if(event.getKeyCode() == 21){
event = createKeyEvent(new KeyEvent(event.getAction(),20));
}else if(event.getKeyCode() == 22){
event = createKeyEvent(new KeyEvent(event.getAction(),19));
}
} catch (Exception e) {
e.printStackTrace();
}
}else if(orientation.equals(“seascape”)){//180
try {
if(event.getKeyCode() == 19){
event = createKeyEvent(new KeyEvent(event.getAction(),20));
}else if(event.getKeyCode() == 20){
event = createKeyEvent(new KeyEvent(event.getAction(),19));
}else if(event.getKeyCode() == 21){
event = createKeyEvent(new KeyEvent(event.getAction(),22));
}else if(event.getKeyCode() == 22){
event = createKeyEvent(new KeyEvent(event.getAction(),21));
}
} catch (Exception e) {
e.printStackTrace();
}
}
private KeyEvent createKeyEvent(KeyEvent event){
long downTime = event.getDownTime();
long eventTime = event.getEventTime();
int action = event.getAction();
int code = event.getKeyCode();
int repeatCount = event.getRepeatCount();
int metaState = event.getMetaState();
int deviceId = event.getDeviceId();
int scancode = event.getScanCode();
int source = event.getSource();
int flags = event.getFlags();
if (source == InputDevice.SOURCE_UNKNOWN) {
source = InputDevice.SOURCE_KEYBOARD;
}
if (eventTime == 0) {
eventTime = SystemClock.uptimeMillis();
}
if (downTime == 0) {
downTime = eventTime;
}
KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState,
deviceId, scancode, flags | KeyEvent.FLAG_FROM_SYSTEM, source);
return newEvent;
}
2.frameworks\base\services\core\java\com\android\server\input\InputManagerService.java
在interceptKeyBeforeDispatching();也添加同样的代码