投稿

EditTextPreferenceを拡張する

EditTextPreferenceをそのまま使いたくないこともあるわけです。 例えば、Preferenceに永続化させるときは文字列を暗号化さたい、とか。 そんな時はEditTextPreferenceをextendsしてonPrepareDialogBuilder()をオーバーライドしちゃえばいいわけです。 こんな感じ。 ※値は"CCC"として保存するけど、EditTextに表示する際には"CCC converted"と表示して、保存するときは再び"CCC"で保存。 これに暗号化と復号化を組み合わせればいいわけですね。 @Override protected void onPrepareDialogBuilder(Builder builder) { super.onPrepareDialogBuilder(builder); // get value from xml file String value = getText(); Log.d(TAG, "value : " + value); // convert value value = value + " converted"; // display converted value this.getEditText().setText(value); // event handler when select ok button builder.setPositiveButton( android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // re-convert value and save to xml setText("CCC...

Viewを丸く切り取る

イメージ
Viewを丸く切り取るには、onDraw()をオーバーライドしてclipPath()してあげたクラスを作ってあげればOK。 こんな感じ。 public class ClipImageView extends ImageView { private static final String TAG = "ClipImageView"; public ClipImageView(Context context) { super(context); } public ClipImageView(Context context, AttributeSet attrs) { super(context, attrs); } public ClipImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private Path pathCircle = new Path(); /** * Viewのサイズ確保 */ protected void onSizeChanged(int w, int h, int oldw, int oldh){ // 丸いパス pathCircle.addCircle(w/2, h/2, 24, Path.Direction.CW); } /** * 描画処理 */ protected void onDraw(Canvas canvas) { // パスに沿って切り取り canvas.clipPath(pathCircle); super.onDraw(canvas); } } あとは、これをLayoutにぺたっと貼り付け。 android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > android:layout_...

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が動作しません。 ・画...

Google Maps Data APIの謎

SmartTraining 2.0.0のこと。 今回のバージョンアップは初期バージョンリリース以来ずっと実現したかったGoogle Mapsへのデータアップ機能実装がメイン。嬉しかったので自分へのご褒美という意味でメジャーバージョンをあげちゃいましたwバージョン管理なんてそんなもん。 Google Mapsへのデータアップロード、意外に手間取りました。つい最近までずっとMaps関連のAPIは Google Maps API だけだと思っていて、外部アプリからデータのアップロードなんてできないものだと思い込んでいました。 ところが先週、何気に情報探していたら Google Maps Data API なるものを発見。紛らわしー名前だなー。これ発見した時「勝てる!」思いましたよ。楽勝だってね。でもそこからが大変。 まずは、Androidアプリを開発してるわけなので、Javaライブラリを探す。 発見 。おおぉー、サンプルも載ってるし楽勝じゃねーか。と思いつつライブラリダウンロード。ダウンロードしたライブラリには普通のJava環境用のライブラリとandroid用のライブラリが格納されている。普通のJava環境用のものはjacksonやらkxmlやらcommons-loggingやらいろいろと依存ライブラリがあるらしく、Android上でそのまま動かすのはちょっとつらい。 そこでAndroid用ライブラリをためす。早速ライブラリを組み込み実験用アプリを作りマップのリストを取得してみる。が、なんかおかしい。Webサイト上のサンプルをそのまま書いてみてもEclipse上では赤い下線が出る。 「そんなメソッドねぇ」だと。そこでダウンロードしたJavaDocs見ると、Webサイト上のサンプルで使ってるメソッドなんてありません。Maps関連のクラスを見てもAUTH_TOKEN_TYPEとVERSIONのstaticなフィールドが定義されているだけ。んー、なんだこりゃ。ライブラリのソースをダウンロードしてみるがJavaDocs通りフィールドが2個定義されているだけ。。。オイw未実装かよwさんざん探したけどサンプルもありません。 一晩寝てわかりました。Webサイト上のサンプルはv1.4用のっぽいんですね。この当時のライブラリにAndroid版はない。ダウンロードしたのはv2.1。どおりでダ...

HT-03AとXperiaの比較~加速度センサー&GPS編

イメージ
HT-03AとXperiaでSmartTrainingを動かして加速度センサーとGPSの計測結果を比較してみました。 ◆計測方法  ・2端末を縦向きにして同じ胸ポケットに入れる。  ・実測約1000歩の区間を普通の速度で歩く。 ◆結果 ↑Xperia画面 ↑HT-03A画面 ・Xperia  歩数:1178歩  距離:963m ・HT-03A  歩数:944歩  距離:921m 歩数が1000歩から±10%~20%誤差があります。 それぞれのセンサーの特性による違いなのか、それとも、端末自体の重量によりセンサーが受け取る衝撃の強さが違うのか、ちょっとよくわかりませんが、端末によってこの程度の誤差は付き物なのかもしれません。 距離も5%程度違っています。 これは、30秒おきに計測しているGPSのロケーション情報が取れるタイミングが微妙に異なるのが原因で、地図上の軌跡が異なっていることが原因です。 カロリーと継続時間が微妙に異なっているのは、計測停止時に同時に2端末をストップさせることができずに、もたもたしていたせいです。カロリーは継続時間に依存するのでここで端末の違いによる誤差がでることはありません。 ↑Xperia画面 ↑HT-03A画面 GPSから取得した時間-高度グラフをみても結構違いますね。 API経由で取れちゃうんだからアプリとしてはどうしようもないのですが、いろいろと内部での補正の方法が違ったりするのかな? いずれにしても精度としては数十mがいいところといった感じでしょうか。 ---- その後、同じコースでもう一度計測してみました。 今回は朝出勤の時に測ったので、ちょっとだけ急ぎ足なのかもしれませんね。 やっぱり、Xperiaの方が多くカウントされます。 同じような傾向がでました。 ・Xperia  継続時間:09:28  歩数:1120歩  距離:930m  カロリー:104kcal ・HT-03A  継続時間:9:22  歩数:926歩  距離:808m  カロリー:103kcal

SmartTraining 1.9.0 リリース

先日リリースしたSmartTraining1.9.0のこと。  今回のバージョンアップは、以前Andronaviさんで 紹介 していただいた時に低かった評価の改善、Marketでいただいたコメントに対する対応を行ってみました。  歩数については、あの当時から万歩計ロジックを2度修正して多少はマシになっていると思います。一応、個人的な計測では悪くても2割程度の誤差。ロジックについてはさらに見直して精度アップの余地はあると思っています。ただ、なかなか試験に時間がかかるので、引き続き実験と計測を繰り返しつつ徐々に改善していこうかと思っています。  一時停止中の距離カウントを止める機能は、途中でトレーニング種別を変える機能と絡めてみました。例えば、将来的にはトライアスロンや、スキーでの滑走&リフトなど、途中で実施する運動が変化するケースでも計測の継続を容易にすることを想定しています。現実的には今のハードウェアが耐水的にも耐寒冷的にも弱いのでこの機能が真価を発揮するのはまだまだ先のことになりそうです。あと、本当は人が操作しなくても自動的に状況を認識して記録してくれるというのが理想ですが、こちらはもう少し研究が必要ですね。  Twitterにつぶやく機能は1.8.5で適当に実装(といっても他アプリに送るだけですが)してみたのをもう少し拡張してみました。っていうか、誰もハッシュタグ使ってつぶやいてくれないので消そうかと思いましたがwちょっとだけ悪あがき。  最後は、ContentProviderによるデータの公開。どうやって公開するのが一般的なのかわからなかったので、 サポートサイト に利用側コードを貼ってあります。マッシュアップで運動の計測にはこのアプリを活用していただけるととても嬉しいです。データアクセス手段の公開と外部へのエクスポートによるアプリマッシュアップはAndroidならではの機能ではないかなと思っています。  あと、おまけ。機能的には地味なのでどこにもコメントありませんが、設定画面で使っているトレーニングタイプの選択時に表示しているリストダイアログ。以前は標準のListPreferenceを使っていたのですが、結構殺風景だったので、リスト上にアイコンを表示するように機能拡張してみました。 やり方は、DialogPreferenceを継承したオリジナルのクラスを作成...

万歩計文化の謎

SmartTraining1.7.xでおかしかった万歩計の感度を修正するまでいろいろとコメントを頂きました。 その際、日本語圏とそれ以外の国での万歩計の地位が微妙に違うような気がしました。 これまで、ずっと日本語圏の方からのコメントは凄く少なかったんです。 逆にそれ以外の国(英語しか理解できませんが)からはいろんな意味で非常にアツいコメントをたくさんいただいていました。 1.7.xのリリース後は、逆に日本語圏の方からのコメントをたくさんいただきました。主に万歩計の感度に関して。英語圏の方からはそれほどコメントは頂きませんでした。 ひょっとして、万歩計って日本だけ? ちょっと謎です。 さて、今週末は志賀スタンプラリー、レッツリトライです。