先日、UsbWebCameraProだと端末の向きに応じて画面が回らないってコメントを頂いたので調べてみた。
(無料版のUsbWebCameraはOKとのこと)
いつも使ってるNexus9(Android5.0.1)
・・・端末の向きに合わせて回転するし、縦固定・横固定も正常に動作。
いつも使ってるNexus7(2013, Android5.0.2)
・・・端末の向きに合わせて回転するし、縦固定・横固定も正常に動作。
いつも使ってるNexus7(2012, Android4.4.4)
・・・端末の向きに合わせて回転するし、縦固定・横固定も正常に動作。
いつもは使ってない(^^;)MeMoPad7(Android4.4.2)
・・・端末の向きに合わせて回転するし、縦固定・横固定も正常に動作。
いつも使っているNexus5(Android5.0.1)
・・・縦固定・横固定は正常に動作するけど、端末の向きに合わせて回転してくれない。無料版はOK。
いつもは使ってない(^^;)GALAXY NoteII(GT-N7100, Android4.4.2)
・・・縦固定・横固定は正常に動作するけど、端末の向きに合わせて回転してくれない。無料版はOK。
いつもは…
むむぅ〜スマホはダメでタブレットはOKという結果に(´・ω・`)
ディメンジョンリソース(マージンとかボタンの大きさとかフォントサイズとか)は画面サイズ毎に設定してるけどスマホとタブレットという区別はしとらんぞよ?
でもまぁ無料版と有料版で回転の仕方が違う理由って言えば心当たりがあります。透明アクティビティやね。
以前記事にもした「透明アクティビティは自動回転出来ない」(記事はこれ)
UVCカメラを接続した時にアプリが自動起動するかどうかを設定したいって言われることが多くて有料版は設定できるようにしたんだけど、本来はアプリで設定するものじゃないんですよね。Androidに対しては標準で起動するアプリに設定しておきながらアプリには自動起動しない設定にするなんてのは超矛盾してる気がするんです。Android自体も同じ考えで自動起動するかどうかはアプリのマニフェストに記載しておく必要があります。でもマニフェストはアプリが自分で動的に書き換える事は出来ません。
そりゃそうだ。でないと悪いことするアプリ作り放題になってしまいます。
まぁ絶対不可能かと言われるとroot取ってる端末なら・・・(自己検閲)・・・
一方で、USBのパーミッションと自動起動はちょっと特殊で、色々条件を満たさないと自動でパーミッションを取得して起動出来ないのです。これも以前記事にしました(記事はこれ)、
で実際の所どうしてるかというと、自動起動するようにマニフェストには記載しておいて起動直後に(アクティビティが表示される前に)自分の設定が自動起動しないなら自殺するようにしているのです。
ところがですねぇアプティビティが表示される前にも終了しているにも関わらずこの方法だとアプリ起動のアニメーションが見えてしまう場合のがあるのです。アクティビティは表示されていないにも関わらずアクティビティに割り当てたアニメーションが表示されるって・・・(●`ε´●)
それを誤魔化すために、実は有料版の方はアクティビティを透明化していてアクティビティが実際に生成されない時にはアニメーションが見えないようにしています。
普通に起動する場合には、アクティビティが表示される前に通常のテーマに動的に上書きすることで普通に見えるって仕掛けです。
タブレットだとうまく動いているんだけど、スマホじゃダメ・・・うまく出来たと思ったんだけどなぁ(´・ω・`)
やっぱり自前でセンサー読むしかないんかなぁ↓
またまたレアな仕様?バグ?にぶち当たってしまいました。
チャンチャン(´・ω・`)ショボーン
いきなりの追記です。
センサー読むのは面倒くさいのでなんとか誤魔化す方法を考えてたら閃きました\(^o^)/
現状はこんな感じ。
- マニフェストで透明テーマを適用するとセンサーでの画面回転が上手くいかない
- アクティビティ生成中(onCreateとか)でテーマを上書きすることは可能
- 今はマニフェストは透明テーマを適用してて通常起動する時は普通のテーマで上書きしている。
ようは逆にすればいいんでしょう逆に。
つまり、マニフェストでは通常のテーマを当てておいて、自動起動せずにonCreateで#finishを呼ぶ前に透明テーマで上書きしてやればええんじゃろってことです。
元々はこんな感じでした(Activity#onCreateでの処理です)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... final boolean autostart = {自動起動するかどうかのチェック}; if (!autostart) { finish(); return; } // 通常の起動処理 // 自動起動しない時にも起動時のアニメーションが一瞬見えてしまうのを防ぐために // マニフェストで透明テーマを当てているのを上書きして打ち消す // (setContentViewより前に実行しないとダメ) setTheme(R.style.AppTheme); // 通常のテーマを当てる // setContentView(R.layout.activity_main); ... } |
こんな感じにしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... final boolean autostart = {自動起動するかどうかのチェック}; if (!autostart) { // 自動起動しない時にも起動時のアニメーションが一瞬見えてしまうのを防ぐために // 透明テーマを適用する(setContentViewより前に実行しないとダメ) setTheme(android.R.style.Theme_Translucent_NoTitleBar); finish(); return; } // 通常の起動処理 setContentView(R.layout.activity_main); ... } |
無事解決です。自動起動しない時にもアニメーションは見えないし、端末の向きに応じて画面の回転もできるようになりました。
と言うか元々してたのが無理があったってことですね(´・ω・`) お馬鹿でしたm(__)m
でも今更ながら試してて気づいたんですけど、タブレットだとセンサー任せでポートレートでもランドスケープでも好きな方に回せば自動で端末の下側=画面の下側になるように回してくれるように出来るのに、スマホだとポートレートで上下反転ってのは普通には出来なくて、ポートレートで上下逆さまに向けると、端末の下側=画面の上側になってしまうんでしたね。
今度こそお疲れ様でした。おやすみなさい(=_=)