アプリケーション(コード)から画面の向きの変更

閲覧: 209 回
最初の未読メッセージにスキップ

k-suke

未読、
2009/10/26 1:15:202009/10/26
To: 日本Androidの会
はじめて投稿します。k-sukeです。

アプリケーション(コード)から画面の向きを変更したいと思っています。
例えば、あるボタンを押下したら向きを切り替えたいのです。
ご存知の人がいれば、ご教示ください。
なお、AndroidManifest.xmlを変更すれば、向きが変更することは理解しました。
【参考にしたURL】
http://labs.karappo.net/mobiledev/index.php?itemid=183

また、開発にエミュレータとVirtualBoxに構築したLiveAndroid(0.3)の両方を使用しています。
エミュレータは、Ctrl+F12で、画面の向きが変わることは分かりましたが、
LiveAndroidの画面の向きの変更方法が分かりませんでした。
→そもそも、LiveAndroidだと、portraitを指定しても縦長になりませんでした。
本件に関してもご存知の人がいれば、ご教示ください。

よろしくお願いします。

--環境--
eclipse3.4
android 1.5r3

mizmit1222

未読、
2009/10/26 3:39:402009/10/26
To: 日本Androidの会
みずの@組み込みWGです。こんにちは。

LiveAndroidはMIDのポリシーでビルドされていると思います。
MIDポリシーのWindowsManagerは画面の回転をサポートしていません。
landscape固定になっています。ですので、エミュレータや実機のよう
にCTRL-F12やセンサーで画面を回転させることはできないと思います。

ではでは。

k-suke

未読、
2009/10/26 4:03:392009/10/26
To: 日本Androidの会
k-sukeです。

> LiveAndroidはMIDのポリシーでビルドされていると思います。
> MIDポリシーのWindowsManagerは画面の回転をサポートしていません。
> landscape固定になっています。ですので、エミュレータや実機のよう
> にCTRL-F12やセンサーで画面を回転させることはできないと思います。

回答ありがとうございます。
助かりました。

なお、エミュレータ上では、
アプリケーション(コード)から画面の向きを変更することは可能なのでしょうか?

Mogimo

未読、
2009/10/26 4:12:132009/10/26
To: 日本Androidの会
やったことはないのですが、

Activity#setRequestedOrientation() は使えないのでしょうか?

tonimi

未読、
2009/10/27 0:52:042009/10/27
To: 日本Androidの会
はじめまして とにみと申します。
ハードのボタンを押して、画面を回転するという実装を行ったので参考になればと思い投稿します。
以下の手順で行います。
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とかやったことがないので変な所があったら指摘して下さい。
以上です。


On 10月26日, 午後2:15, k-suke <ganbare.keis...@gmail.com> wrote:

k-suke

未読、
2009/10/27 1:31:232009/10/27
To: 日本Androidの会
k-sukeです。

> Activity#setRequestedOrientation() は使えないのでしょうか?

> > > > アプリケーション(コード)から画面の向きを変更したいと思っています。
> > > > 例えば、あるボタンを押下したら向きを切り替えたいのです。
> > > > ご存知の人がいれば、ご教示ください。
> > > > なお、AndroidManifest.xmlを変更すれば、向きが変更することは理解しました。
> > > > 【参考にしたURL】http://labs.karappo.net/mobiledev/index.php?itemid=183

実機(HT-03A)、エミュレータともに、画面の向きが変更されることを確認しました。
アドバイスありがとうございました。

なお、setRequestedOrientationを呼びだした後に、
実機(HT-03A)の本体の向きを変更しても、以下の一連のイベントが発行されなくなりました。
→発生したイベントは一部省略しています。
(onPause→onStop→onCreate)

setRequestedOrientation呼び出し後は、これらのイベントが発生しないのは仕様なのでしょうか?

また、エミュレータは、setRequestedOrientation呼び出し後にCtrl+F12を押下すると、
一連のイベントは発生するが、画面の向きは変更されたままとなりました。

実機と動作が異なるのは、やはりしょうがないのでしょうか?

何か情報を保有している人がいれば、よろしくお願いします。

k-suke

未読、
2009/10/27 1:56:222009/10/27
To: 日本Androidの会
k-sukeです。

> LiveAndroidはMIDのポリシーでビルドされていると思います。
> MIDポリシーのWindowsManagerは画面の回転をサポートしていません。

ちょっと、気になったので再質問させてください。
アプリケーション(コード)から動いている環境がMIDポリシーなのかは、判断できるのでしょうか?
アプリケーションからは不可能だとしても、
OS上のファイル等を参照すればMIDポリシーなのかを判断できるのでしょうか?
例えば、/etc/xxx.policyなど。。

Mogimo

未読、
2009/10/29 1:36:522009/10/29
To: 日本Androidの会
> setRequestedOrientation呼び出し後は、これらのイベントが発生しないのは仕様なのでしょうか?

Activityがrestartしないのは、上記APIでOrientationを固定したからではないでしょうか?
画面のOrientationが変われば、onPause->onStop->onCreate->onResumeとなるはずだと思うのです
が。。。
(ManifestのconfigChangeで宣言してない限り)

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
で戻されてはどうでしょうか?

> 実機と動作が異なるのは、やはりしょうがないのでしょうか?

EmulatorのCtrl+F12は、センサーによる回転ではなく、
DevPhoneなんかのスライド開閉をEmulateしているのではないでしょうか?

k-suke

未読、
2009/10/30 0:39:132009/10/30
To: 日本Androidの会
k-sukeです。

> setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
> で戻されてはどうでしょうか?
試してみたところ、Activityがrestartが発生しました。

> EmulatorのCtrl+F12は、センサーによる回転ではなく、
> DevPhoneなんかのスライド開閉をEmulateしているのではないでしょうか?

なるほど、スッキリしました。
ありがとうございました。
全員に返信
投稿者に返信
転送
新着メール 0 件