Android2.1(X06HT/Desire)でハマったこと

SmartTraining 2.2.1にバージョンアップするにあたり、3点ハマりました。
いずれもAndroid2.1側の問題かと思います。
ムカついたのでメモメモ。

1.画面OFF時に加速度変化イベントが取れない。
 あちこちで書いていますが、開発者の間ではIssue3708として認識されているAndroid側の不具合という認識の問題です。様々なアプリケーションもこれにより影響を受けており、Smart Alarm ClockやCardioTrainerなどの超有名どころアプリケーションもこの問題を解決できていません。この中の投稿でBrunoさんという方が、問題を回避する方法を提案しています。実際にX06HT(Desire)とNexus Oneで試してみましたが現象が改善されませんでした。やり方が悪いのか、何なのかわかりませんが、Brunoさんの方法を試しても改善されないという報告がいくつか見られたので、この方法は疑わしいと考えています。
 Android側を弁護するとしたら、バックグラウンドでセンサーを不用意に扱うアプリケーションがバッテリーを大量消費してしまうことを回避する、という意味ではこの動作変更は成功しているかもしれません。しかし、バックグラウンドでの動作に制限をかけるのであれば、よりバッテリ喰いのGPSにはこういった制限がありません、これでは中途半端でしょう。明らかに旧バージョンからダウングレードしています。
 回避方法としては、PowerManagerでSCREEN_DIM_WAKE_LOCK以上に設定します。SCREEN_DIM_WAKE_LOCKというのは、画面の液晶が暗くなっているが、OFFではない状態です。当たり前ですがバッテリかなり喰います。かつ、この状態でポケットに入れたりすると当然誤操作の元となります。SmartTraining的にはこの対応はありえないので、結局「残念なお知らせ」を表示してこの問題がAndroid側の問題であることをアピールするに留めました。

2.画面OFF時にTimerが動作しない(ことがある)。
 上記問題と少し似ているのですが、画面OFF時にTimerが動作しません。「しないことがある」としているのには、いくつか条件が必要なためです。こちらで確認している条件としては、以下の条件でTimerが動作しません。
・画面がOFF状態である。
・他のサービス(例えば音楽アプリで音楽再生中など)がCPUを使用していない。
・GPSが位置情報を取得しているなど、バックグラウンドで何かしら動作を行っていない。
といった感じです。
 ざっくり言うとCPUが暇な時はTimerが動きません。
 回避方法としては、計測中はPowerManagerでPARTIAL_WAKE_LOCKを設定しておくことでCPUがOFFされることを防げばOKです。これも旧バージョンのAndroidとは動作が異なります。そもそも、PCでCPUが停止しているときにTimerが停止するのであれば話はわかるのですが、スマートフォンで画面を消したからといってCPUとめてTimer動かなくなるというのは、ちょっとやり過ぎな感はあります。まぁ、回避方法があるので「1.」の問題に比べればマシですが。Issue1942という問題もあるらしいのですが、Timerが動作しない問題と関係あるかどうかまでは追ってはいません。こちらも結構ホットな不具合として認識されています。

3.PreferenceActivityにThemeを適用してPreference内で画面遷移するとThemeが中途半端に適用される。
 まずはこちらをご覧ください。PreferenceScreeで画面遷移するPreferenceActivityを作成してこれにTheme設定すると、遷移した先の画面ではThemeが正しく適用されません。たぶん、文字だけ適用されて背景色は黒になっているんだと思われます。これも不具合ではないかと考えています。いや、誰がどう見てもおかしいでしょ。結局、このサイトで投稿されている回避方法としてはPreferenceには標準のThemeを設定しましょう、だと。

そろそろ「マジふざけんな!Android2.1」って感じですね。
Froyoで問題がぜーんぶ解決されることを勝手に期待しています。

コメント

このブログの人気の投稿

Joinノードを使う(その1)

Execノードを使う

Joinノードを使う(その4)