はじめまして とにみと申します。
ハードのボタンを押して、画面を回転するという実装を行ったので参考になればと思い投稿します。
以下の手順で行います。
1.キーコードの定義
2.キー操作の実装
3.キーマップ
1.キーコードの定義
mydroid/framework/base/include/ui/KeycodeLabels.h
mydroid/frameworks/base/core/java/android/view/KeyEvent.java
mydroid/frameworks/base/core/res/res/values/attrs.xml
に新しいキーコード ROTATE を定義。
ソースコード内にはキーコードを追加る時にmonky,emulatorのコードも修正するように記載されていましたが、省きました。
また、ビルドエラーになったので
mydroid/frameworks/base/core/res/res/values/attrs.xml
のにもキーコード定義を追加しました。
2.キー操作の実装
mydroid/frameworks/policies/base/phone/com/android/internal/policy/
impl/PhoneWindowManager.java
にキープッシュ時の処理を記述します。
---
PhoneWindowManager.java.org 2009-10-20 14:37:43.000000000 +0900
+++ PhoneWindowManager.java 2009-10-27 13:17:05.000000000 +0900
@@ -172,6 +172,11 @@
static final int DEFAULT_ACCELEROMETER_ROTATION = 0;
int mAccelerometerDefault = DEFAULT_ACCELEROMETER_ROTATION;
boolean mHasSoftInput = false;
+
+ static final int KP_ROTATE_DEF = 3;
+ static final int KP_ROTATE_ROTATE = 0;
+ boolean mButtonPushFlg = false; //ROTATE key pressed
+ int mMbuttonPushRotate = KP_ROTATE_DEF; //
0:R0/1:R90/2:R180/3:R270 init
// The current size of the screen.
int mW, mH;
@@ -908,6 +913,24 @@
return true;
}
}
+ } else if (code == KeyEvent.KEYCODE_ROTATE) {
+ // ROTATE KEY pressed
+ if (down) {
+ mButtonPushFlg = true;
+
+ try {
+ int ro = mWindowManager.getRotation(); //
Orientation vertical
+ if (ro == 3 ) {
+ mWindowManager.setRotation
(Surface.ROTATION_0,true,mFancyRotationAnimation); //Orientation
landscape
+ } else {
+ mWindowManager.setRotation
(Surface.ROTATION_270,true,mFancyRotationAnimation); //Orientation
portlate
+ }
+ } catch (RemoteException e) {
+ // Igbore
+ Log.i("info", "Rotation failed ");
+ }
+ }
+ return true;
}
// Shortcuts are invoked through Search+key, so intercept
those here
@@ -1690,16 +1713,35 @@
synchronized (mLock) {
switch (orientation) {
case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
+ mButtonPushFlg = false;
//always return landscape if orientation set to
landscape
- return Surface.ROTATION_90;
+// return Surface.ROTATION_90;
+ return KP_ROTATE_ROTATE;//アクティビティ固定の場合回転させない
case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
+ mButtonPushFlg = false;
//always return portrait if orientation set to
portrait
- return Surface.ROTATION_0;
+ //return Surface.ROTATION_0;
+ return KP_ROTATE_DEF;//アクティビティ固定の場合回転させない
}
+
+ if(mButtonPushFlg == true){
+ //when rotate button pushed
+ mButtonPushFlg = false;
+ if(lastRotation==KP_ROTATE_DEF){ // R0->
R270 else R*->R0
+ mMbuttonPushRotate=KP_ROTATE_ROTATE;
+ return KP_ROTATE_ROTATE;//Surface.ROTATION_270;
+ } else {
+ mMbuttonPushRotate=KP_ROTATE_DEF;
+ return KP_ROTATE_DEF;//Surface.ROTATION_0;
+ }
+ }
+
// case for nosensor meaning ignore sensor and consider
only lid
// or orientation sensor disabled
//or case.unspecified
if (mLidOpen) {
+// No tested here
+// with battery patch, mLidOpen is always false
return Surface.ROTATION_90;
} else {
if (useSensorForOrientationLp(orientation)) {
@@ -1707,7 +1749,12 @@
int curRotation =
mOrientationListener.getCurrentRotation();
return curRotation >= 0 ? curRotation :
lastRotation;
}
- return Surface.ROTATION_0;
+ //return Surface.ROTATION_0;
+ if(mMbuttonPushRotate == KP_ROTATE_DEF){
+ return KP_ROTATE_DEF;//Surface.ROTATION_0;
+ } else {
+ return KP_ROTATE_ROTATE;//Surface.ROTATION_270;
+ }
}
}
}
*私の開発環境では初期状態で270度回転する必要があったのでKP_ROTATE_DEF = 3;
KP_ROTATE_ROTATE = 0;にしています。
初期状態回転なし、ポタンブッシュでR90の場合
KP_ROTATE_DEF = 0;
KP_ROTATE_ROTATE = 1;
となります。
*コードは1.5ベースです。
3.キーマップ
android_root/system/usr/keylayout/qwerty.kl ROTATEのキーマップを追加します。
javaとかやったことがないので変な所があったら指摘して下さい。
以上です。