AlbumShuffle 0.07

 Androidランダム再生。
 そろそろ上げようかと思う度にバグを見付けたり何か気付いて弄り始めたりして一向に収まりがつかないのだけれど、そろそろ一旦キリをつけたいのでここで締めることにする。

 という訳で、ver0.07。
>AlbumShuffle007.apk (※提供元不明のアプリを許可で)

# 因みに今回は(ようやっと)リリースビルドしてみたので、旧版を入れている場合は一旦削除願います。

 今回も思いのほか色々弄ってしまった。
・アルバムアート表示
・アルバム~トラック選択
・fix: トラックソートにファイル名順追加
・fix: 状態保存 (rewind)
・fix: notification起動時(既存のものをlaunch)
・fix: service終了処理を若干修正


 以下個別に。
・アルバムアート表示
img
 どうせコンテンツプロバイダから取ってくるだけの話なので表示してみた。
 曲名表示の裏に置くしかなかったので強制的に半輝度表示です。別にいいよね。
 因みにアルバムアートはこれまで全く使ってなかったけど、このテストの為に入れました。表示してみるとまぁ悪くないなぁと。

・アルバム~トラック選択
img img
 shuffle(next-album)ボタンの隣のplaylistボタンで起動。アルバム及びトラック選択できるようにしました。リストの強調表示は現在演奏中のアルバム・トラック。曲の切り替わり時にちゃんと反映しますよ(無駄に)。
 アルバム選択に関しては、今はただアルバムを一覧にしてるだけなのでライブラリが沢山ある場合の操作性が酷く悪そうですが、この辺のUIは後日課題。
 あとトラックも選択出来るようにしたけれど、自分はshuffle-track常用なのでランダムでスタート出来るようにrandom-selectボタンを据えてありまする。いい置き場もなくて幅食っちゃってるのでリストが狭いかも。あとアイコンがイマイチしっくり来ない。shuffleする訳ではないのでこれじゃない方がいいと思うんだけど、”icon random”で検索してもこれしか出てこないし、どうしたものか。
 尚、トラック選択は内部で作成したプレイリストの該当位置にジャンプするものなので、shuffle-trackの場合、最悪リストの一番最後になって即アルバムが終わる可能性もありますが。今のところ仕様ということで。

 因みに機能実装はすぐだったんだけど、リスト表示関連で色々すったもんだありました。

・fix: トラックソートにファイル名順追加
 トラック番号ソートしかしてなかったので、一応ファイル名ソートも追加。
 トラック番号がない/おかしい時の回避用に。

・fix: 状態保存 (rewind)
 やっぱり漏れがありましたねと(笑)。

・fix: notification起動時(既存のものをlaunch)
 サンプルそのままだとNotificationから呼び出す度にActivityがポコポコ立ち上がることに気付いたので修正。一個しか立ち上がらないように。

・fix: service終了処理を若干修正
 少し手直ししてみた。バグってないといいね(オチ)。

 以下、開発寄りのお話。

・targetSdkVersion
 を15(ICS v4.0)にした。
 ので本格的にGB(v2.3)でバグらないといいね。
 minSdkVersionは10のまま。多分もっと下でも行けるかもしれないけど個人環境的に保証出来ないので。

・ListViewの強調表示
 前回エントリのお話。
 activate機能がv3からと知らず、代わりにcheckedを使おうとしたら軽く嵌った。

・drawableが一部表示されず
 軽い気持ちでエミュレータでGB(v2.3)の動作確認をしてみたら、random-selectボタンだけが何故か表示されないという謎の現象に遭遇。
 まぁ結局、Android側のバグだったんですけどね(苦笑)。(>参考
 drawableリソースの先頭のものが参照出来なくなると。読めている画面もあるので特定条件があるのかと思うけどそこは知らない。対処法としてはdrawableフォルダにdummyファイルを置くこと。アルファベット順で先頭になるように。(因みにeclipseは_付きを何故か上に表示するけどリソース順は違うので注意)

 他にもこういう訳の分からないバグがあるのかなぁと思うとやっぱり各バージョンごとに確認しないといけないのだろうね。
 というかエミュと実機でしっかり同じくバグるというのが微妙に笑えた。てっきり最初はエミュだけの表示バグかと思ったくらい。

・アルバム選択リスト
 ListViewにimageを入れる場合は非同期でやるとか、画像キャッシュを使うとか、色々断片的に情報を掻き集めながら改修を重ねていたのだけれど、実のところ公式資料に一通りのことがきちんと書かれていた(苦笑)。

 なんでまぁあまり書くこともなくなってしまった気がしますが、一応、
 途中ですったもんだやっている最中、どうしても微妙なカクつきが取れない気がして、android:hardwareAccelerated をonにしたらやっと滑らかになったということもあった。まぁそこからまた作り替えたのでよく分からなくなりましたが。それにtargetSdkVersionを上げると勝手にonになるので意識する必要はないのかも。
 因みにonになっているとデフォルトの背景に微妙にグラデが掛かる。(画面によっては色合いが悪いので黒に塗り潰してますが)

・LruCache
 折角なので上記のLruCacheを使ってみたのだけど、これはapi12以降なので互換用ライブラリを入れた。
 お陰でアプリサイズが一気に倍以上に膨らんでしまった。ちぇ。

・画像サイズ調整
 基本的には上記の話に準じているけれど、bitmap読み込み時のスケール(間引き)だけでは大雑把でメモリサイズが膨らむので、実際の必要サイズにまで縮小(Bitmap.createScaledBitmap)してある。まぁその分処理が遅くなるので随分悩んだけれど、どうせ読み込みは最初の一回だけだし。この縮小をやらないと手持ちのデータでも倍近く差が出るので。
 この辺、どうせ縮小するならと実サイズからそのまま処理するとbitmap一時生成が重くて、やっぱりスケール読込みしてから改めてリサイズするという実に二度手間なことに。読み込みと任意縮小を一気に出来ればいい気がするんだけど、分からず。

・notification起動
 これはSingleTaskでも用は足りたんだけど、折角なのでLauncherで既存インスタンスがあればそれをそのまま立ち上げるようにした(参考)。要はhomeに置かれるアプリアイコンと同じ形にすると。成る程。

・ActionBar(タイトルバー)
 今回ボタンを追加したけれど、こうやってボタンが増えてくるとそれが幾つも並ぶよりはActionBarを利用するように考えていった方がいいのだろうなぁと。
 まぁ今はこの先どう変わっていくかまだ何とも言えないところがあるので、もう少し機能的に整理出来てからかなということで見送った。
 因みにActionBar自体はv3以降の機能だけれど、v2でも使えるライブラリがあるので、やるならこれを試してみると思う。>コチラ
 というかデフォルトだとボタンが無駄にでかすぎるとかあるのだけれど、カスタマイズできるのかなぁ。

・横画面とかタブレットとか
 レイアウトがめんどくさいので今はportrait(縦)固定にしちゃってますが、対応したところでどうせ横画面でリストなんて操作しづらいだけだしなぁ。まぁめんどくさがっちゃいけないんですが(汗)。
 まぁタブレットは逆に横画面がデフォなので、それこそ残念なことになるんですが(使う人がいるかはともかく)
 ただタブレットはどちらにしろ大画面でレイアウトが合わなくなるので、本当はそれ用に考えないといけないし。この辺、fragmentで両対応みたいな話もあるけれど、そう上手いこと共用の構造が取れるとは限らないし、それよりもタブレットは個別に作り込んでHD版としてしまっているアプリも見掛けるので、結局はそれが開発側の回答なんじゃないかなと思う。
 まぁlandscape(横)対応だけはしておいた方がいいよねやっぱ。


 そんなこんなで。意外に勉強になりました。
 あとそうそう、これを言い忘れていた。なんかアプリっぽくなってきたね(笑)。