言い訳タイム

 Android言い訳タイム。(AlbumShuffle)
 iOSアプリのgroove(Android版はない)を見せて貰ったりしながら話を聞いてきた。UIはやっぱり難しいね。まぁ勿論うちはそんなでかいアプリと競うつもりはないので、ランダムアルバムというメイン機能を軸にやりたいことを明確にしていければいいなとは思っていますが。

・Random Selectなるボタン
 まぁ正直自分も悩んだんですが、はっきり言って何コレ分かり難いよねと。
 機能的には「トラックリストの中から開始位置をランダムで選んでスタートする」というまぁ一応名前そのままではあるんですが。
 そもそも何でこれが出来たかというと、元々アルバムをランダムで選択する機能から始まって、その中のトラック再生順もランダム化する「shuffle track」がついたと。その上で楽曲選択機能を入れるという時に、アルバムだけ選んでスタートすれば何の苦労も無かった訳ですが、普通に考えればトラックも選択したくなるよねと。ただそうするとshuffle trackモード時のシャッフルスタートはどうするのということで、それ用のボタンを置いたと。でもって今度は通常再生モードの時にどうしようかというところで、要はトラック選択がお任せになるという意味でまとまるなということで、最終的に「開始位置をランダムで選んでスタートする」=「Random Select」という名称になりましたと。ワカリニクイネ!

 通常モードの時はボタンを消して、shuffle trackの時だけ「Shuffle Start」というそのものずばりの名称にしておけば何の苦労も無かった気もするんですが、モードで機能が切り替わるより意味合いが統一される方が良いかなと考えたりもしたというか。
 それ以外にも幾つか代案、妥協案を考えたりはしたけれど、なかなかどれもこれという結論に行き着かず。
 うーん。
 まぁ少なくとも今のバージョンはやってしまった感が激しいので、確実に手直しをする予定ということで、今はごめんなさい。

・アルバム選択UI
 実のところ今まで2G分くらいのアルバムしか入れていなかったのだけれど、今回アプリがそれっぽくなったことで調子に乗ってアルバムをガンガン突っ込んでみたら、案の定アルバム選択がもうただの一覧ではやってられない(笑)。
 ただこれこそどういうUIが良いのだろうか。
 超絶極個人的な話をすると、自分はフォルダである程度の分類を作っていて(ゲーム、アニメ、洋楽なんちゃらとか)、そのフィルタをかますだけでもアルバムの絞り込みの役には立つのだけれど、これは一般的には全く成り立たない話なので論外だろうと思う。(PCのfoobar2000ではフォルダでフィルタして指定フォルダ以下ランダムなどとやっている。作業BGM=ゲーム音楽な自分としてはこういう使い方は便利なのだけれど)。まぁこれはそもそもID3タグの「ジャンル」が正しく機能していればそれで行う筈のもの。だけどあれは死にタグだろうし。
 そうすると、あと使われるのはやっぱりアーティスト分類くらい。アーティストで括って二階層の展開式リストにするのも一つの手ではあるけれど。ただそれでも一覧がダラーッと連なることにやはり変わりはない。
 結局「検索を入れてくれればいい」と言われたけど、やっぱりそれくらいしかないのかなぁ。自分もPCの方のライブラリはそれこそ(要らないものも)一杯あって、曲を探す時は検索上等だし。ただスマフォで文字入力はかったるくて出来ればやりたくないという思いもあるのが大変悩ましい。
 うーん。

・Serviceの終了処理
 pauseのまま待機状態というのが常のこのアプリの機能的に終了タイミングがないので、serviceの終了はもうシステムの強制終了(例のno longer want)にお任せという状態だったのだけれど、これがどうにもおかしい。
 前から薄々気になってはいたけれど、START_NOT_STICKY指定で立ち上げている筈のこのserviceを強制終了させても(no longer wantを食らっても)、どういう訳か再起動が掛かる。それこそ消しても消してもゾンビのように立ち上がる(苦笑)。ただまぁStartCommandの方は走っていなくてただCreateされているだけなので、動作的にCPUに何の負担を掛けているという訳でもない(筈)。ただやはりこのゾンビっぷりは何処ぞの行儀の悪いソフトのように思われそうでどうにもなぁと。それにメモリも食うしね。
 そもそもSTART_NOT_STICKYなのに再起動されるのは、どうもBindを使った時に発生する模様。bind時にAUTO_CREATEさせているので(してなくてもなんだけど)、kill後にcreateだけ走るというのは何となく合致する。ただunbindしてもその状態から抜け出せないのがどうなのかという所ではありますが。調べてみたけれど解決法は見付からなくて。後はもうservice側できちんとstopselfするしかない感じ。

 うーん、今はレジューム処理もあるし、pause後に適当にタイマ張って待機状態が長く続いたらstopさせちゃおうかなぁ。そこでタイマ処理が暴発して再生中に強制stopする訳ですね、分かります(ぉ)。
 まぁやはり何かしらの形で終了処理まできちんと持って行きたいというのもヘボグラマ(ヘボいプログラマ)的にありまして。なので今はBT切断という「明らかにもう使わないよね」というタイミングだけ終了処理を走らせてます。上記の話はBT未使用時。


 などとグダグダ書き並べてしまいましたが。
 手を入れないといけない部分は一杯あるけれど、ただ機能的には一応成り立っているので、ちょっとそれより違うこともやりたい自分がいるというか。弄るなら何気に結構弄らないといけないもんで。その葛藤を表現してみましたということで。

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(横)対応だけはしておいた方がいいよねやっぱ。


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

state_activatedの罠

 Android進捗。
 粗方やりたい所は組めたと思うけど、若干気になる点があるので確認中。

 しかし今回は妙なところで嵌ってしまった。実働的には大したことはないけど気分的に。
 ListViewで選択行に色付けをするだけの簡単なお仕事を5分くらいで済まそうと思ったら、何だかさっぱり動かない。それというのも、自分はAndroidでUI周りを弄り始めたのは主にタブレットからなので当たり前のように使ってしまっていたけれど、state_activatedってHC(v3)からの機能なのね。
 しかもこれは今思えばなるほど馬鹿な話だけれど、プロジェクトのplatformのjarはICS(v4.0)に切り替えていたけどtargetSdkVersionを指定していなかったので、minSdkVersionに指定したGB(v2.3)に引っ張られて下位互換モードで動いていたという。だから旧OSでもエラーにならないしかといって新OSでも動作しないしで、一体どいうことかと実に無駄な時間を過ごしてしまった。はははのは。

 でまぁstate_activatedが使えないならstate_checkedを使えばいいじゃない、と思ったのだけれどこれまたさっぱり動かない。ListView自体はcheck状態を保持出来ているけれど、各行のviewでstateが取れない。
 どうやらstate_checkedを使うには各行のviewにCheckableを実装し、自分でcheck状態を保持して、尚かつdrawableStateにstate_checkedをマージせよと参考。分かってしまえば成る程ではあるけれど、こんな単純な処理でも実に原始的なことをやらされるのだなぁと。しかも公式サンプルだとstateの処理はサボっているから分からないし(何だかな)。
 まぁこれを見かねてactivateが追加された訳で、ラクになったよね良かったねということなのですが。ただ新OSでしか動かないので、v2がまだシェアの大半を占める現状では結局古い実装方式を取るしかない。他にもv3やv4で扱いやすくなったものは結構あって、こういうのを見る度にさっさとv2も駆逐されてしまえと思ってしまう。
 それに、こういった変遷を知らないと、webサイトで情報を集めても何処か話が噛み合わなかったりすることが多くて、特に今はv2以前の情報が大半を占めるからかなり困る。googleが短期間でころころ変えすぎなんじゃないかとも思うけれど、過渡期はこんなものなのかなぁ。

 まぁそんなバージョン問題のゴタゴタなんぞより、リストのスクロールが酷くカクカクなもんで、あれやこれやと手を入れてやっと標準プレーヤと同等の自然なスクロールになったよ、などとやっている方が実に建設的且つ健康的で良いやね。

バグ取りついでに

 Androidランダムアルバム。
 そういえばSDカードのことをすっかり忘れていた、自分は内蔵ストレージ(ユーザメモリ)に曲を入れてるからなぁ。ということで対応しておこうと思ったら、何のことはない、Androidのコンテンツプロバイダがユーザメモリも外部SDカードも一緒くたに扱ってくれていた。そもそも外部ストレージとしてのユーザメモリがsdcardになってて、SDカードは更にexternal_sdになっているという、何だかなな状態なんだよね。
 逆にここを分けて扱うことはパッと見出来ないのかも。まぁSDカードアクセスのバッテリ消費が勿体ないので普段は切り分けておきたい、とかいう希少な需要でもなければ必要のない話なのかもですが。

 お陰で折角の改修のネタも無くなってしまいましたが。
 いやはや、早速バグを見付けてしまいましたよ。レジュームでトラックのランダム再生リストの復旧に失敗してた。
 ソースを見れば明らかにおかしいし、動作確認は一度やった筈なのでおかしいなと思ったら、一旦レジューム機能を作った後に、別途盛り込んだ機能の都合で手を入れた際のミスだった。まぁ経緯が分かれば納得。そういう点を気にするのは職業病なのかなぁやっぱ(笑)。

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

・レジューム処理修正
・テーマHoloに変更(HC(3.0)以降)
・ボタンの見た目を変更

 ver2までのデフォルトのカラースキームが気に入らないので、折角ICS機なのだからとHoloテーマに変更した。勿論、旧OSで起動した場合は昔のまま。
img
 ただボタンのアイコンに白基調のものを使っているため、ボタン背景が黒いと苦しいのでそこだけ調整。白基調にして、ついでに角を落としてグラデを掛けた(安直)。安直だけれど、こんな単純な事だけでもデフォのカクカクべったりよりは喜ばれるものなんだよね。
 しかし一度ボタンをいじると押下時のグラフィックについてもいじらなければいけなくて、そこはデフォルトのhighlight色に準じておいたけど、実はここは機種依存なのが悩み所。Androidはデフォルトリソースも機種毎に変えられるので、職場に転がっているMEDIASのようにデフォルトのチェックボックスの色等もいじられていると、それと色が合わなくなって非常に残念なことになると思う(休日なのでまだ試してないけど)。一度グラフィックリソースを弄ろうと思ったら徹底して全部弄らないといけないんだよね。めんどくさい。
 ついでに言うと、そのhighlight色をシステムで取得できればこっちで何とかすることも出来るのだけれど、問題が2つある。まずそれがある(?android:attr/colorPressedHighlight)のはICS以降、そしてattr参照をshape内で行うと落ちるという罠。幾つも同事例を見掛けたけれど誰も解決してないのでどうにもならないんだと思う。まぁ何かAndroid側の都合が色々あるのだろうけれど、使い手としては残念な話。


 ところでそもそもの話、Androidのカラースキームって、てっきり黒背景に青地強調、緑のインジケータの組み合わせだと思い込んでいたけれど、ver2までは黒にオレンジがデフォルトだったのね。何と言うか、一言で言えばダサいです、はい。黒青緑は悪くないと思ってたんだけどなぁ。
 GalaxyS2に搭載されているシステムアプリや基本アプリ(如何にも標準リソースを使っているような見た目のもの)がことごとく前述のカラースキームなのでそれがデフォルトだと思っていたけれど、わざわざver3以降のカラースキームに近いものに変更していたみたいね。
 というかMEDIAS同様、デフォルトリソースそのものを変更していたんじゃないのかなぁ? いまいち記憶があやふやだけれど、オレンジだと気付いたのはGB(2.3)からICS(4.0)にアップデートしてからという気がしてならない。ICS対応の時にリソースを変え忘れたというか、それが証拠にメニューのhighlightだけはデフォルトでも青なんだよなぁ。何だかやってしまった感が。
 まぁ何にしてもデフォルトがはっきりしないので、弄るなら徹底的に弄るか、弄らないならまったく弄らない、ってことになっちゃうのでめんどくさい。デフォルトがもっとしっかりしていれば、って思うわやっぱ。

 何かAndroidは年々知れば知るほど愚痴っぽくなってしまうのですよ(苦笑)。
 droid君は好きなんだけどなぁ。

色々改修

 やっぱり無くても何とかなるようなものはいまいち意欲が湧かないんだよなぁ、ということで絶賛放置しまくったAndroidひつまぶし編を再開してみた。ランダムアルバムの方。まぁマーケット上に競合アプリも出てきてしまったので(敢えて貼らない(笑))、益々もってモチベーションのピンチってなものですが、何か足りない物があった気がする、あと何より広告が要らないので、それだけの為に作ると思えばいい。俺カスタムメイド最強。

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

 今回は大分弄った。
・UIボタン変更
・曲情報表示
・シークバー追加
・prev track追加(今までただの手抜き)
・アルバム内でトラック再生順のシャッフルを追加
・レジューム機能追加
・Bluetooth制御オプション追加
・アイコン

# 因みに今まで何も考えてなかったけど、動作確認の都合上GB(2.3)以上限定ですよ。
# その後ICS(4.0)化してしまったのでそのGBも実際どうだか分かりませんが、、。

 以下ずらずらと、
・UI関係
img
 まぁこんなんですけどね。必要最低限を詰め込んでみた。ボタンアイコンはフリー素材。
 個人的には十分満足してたんだけど、やっぱりこうして見るとしょっぱいね(笑)。
 ICSになったのでholoテーマにも出来たんだけどデフォルトのボタン形状がおいしくなかったのでやめた。layoutは何かとめんどい。
 シークバーは横一杯に広げたら端っこが触れなくて縮めざるを得なかったり、テキストはなるべく多く情報が表示されるように調整したけれどここは機種依存で大きく崩れそう。広げるだけ広げて残りを省略にしたいところだけれど、省略設定時は最大段数を指定しないといけないんだよね。やっぱmarquee(スクロール表示)の方が無難なんだろうなぁ、あまり好きじゃないので避けましたが。コレとか色々な意味で酷い(笑))
 因みにmarqueeはfocusable設定が肝みたいね。

・prev track
 手抜きでしたので。ただそのアルバムの先頭までにしか戻りません。
 prev albumも出来るんだけど、ちょっと考慮しないといけない点があるので保留。

・トラック再生順シャッフル
 どうも1日に聞く量が1アルバムに満たなくて前半だけ聞いて終わるケースが多かったので、いっそトラック順もランダムにしてみることに。もう普通に全曲ランダムでいいんじゃないかと言われそうな気もしてきましたが、アルバムセットで同タイプの曲がランダムに流れてくるのがいいかなということで。

・レジューム機能
 今まではserviceが殺されるまでの命だったけれど、きちんとレジュームするようにした。
 一応、各操作のタイミングと曲の切り替わりで状態保存を行っているので、不正に落ちない限りは問題ないと思うけど、思わぬ抜けがないかいじめ甲斐がありそうですね(ぉ)。

・Bluetooth操作
 BT操作用のメディアレシーバの登録はどういうルールにするのが良い作法なのかいまいち分からず。再生時に登録するのは良いけど、普通はpauseまでしかしないので解除=終了のタイミングが分からない。service終了はほぼイコール強制終了だからdestroy走らないし、まぁBT切断時に解除ってことでいいのかなぁ。この辺、一度は弄ったんだけど最終的には以前までの仕様に戻った感じ。ただBluetoothそのものを使うか使わないかのオプションを追加してみた。

・アイコン (!)
img
 まぁわざわざ人に見せるアプリじゃないけれど、話の種になる時に流石にアイリのままでは厳しいので、名残惜しくも変更することにした。
 ネット上から適当なフリー素材を拾ってきて加工、したんだけどイマイチ面白くなくて、つい魔が差してやっぱりアイリを画像内に忍ばせちゃいましたよ。昨今流行(?)のステルスってことで(違)。この大きさならまず言わないと分からないから大丈夫。大きくするとバレバレですけどね。(なんか若い頃に作ったlainの壁紙を思い出しましたよ(ぉ))
 いやホントは、shuffleを意味する記号を入れるのが先なんですけどね。

 あとアイコンと言えば(service強制終了防止用の)notificationのそれはサンプルから丸パクリ。ICSからアイコンサイズも変わってるらしくて、色々なアプリが残念なことになっているという。めんどくさいね。


 そんなこんなで。
 今回はもう日が経ちすぎて何が良くて何が悪かったかも思い出せず、そのまま弄って更にやっつけの継ぎ接ぎ状態なのでいつも以上にバグがおっかないですが。まぁ気付いたバグはそれなりに潰したつもりだけどね。
 一応、最低限の機能は乗った気がするので、この先どうなるかな。
 ここから先は既存プレーヤのクローンの世界になってしまうので、ぶっちゃけ、デフォルトのプレーヤーで十分と思うと気が重い。

Service強制終了

 Androidひつまぶし編。
 だからもう調査というか基礎固めに徹してしばらく更新する気ないのに~、と思いつつ、手酷いバグ仕様をまた見付けてしまった。
 自分はあまり長時間聴くことが無かったのでなかなか気付かなかったのだけれど、どうにも再生を続けていると唐突に落ちることがある。通算二度目で今度は即刻PCに繋いでログを見てみたらうちのアプリは何もエラーは吐いておらず、代わりにActivityManagerが「No longer want ~」とうちのServiceをhidden即ち強制終了してくれていた。何じゃこりゃあ。
 まぁうちは残念ながら技術系blogではないので詳細はきちんとした方々の手に委ねるとして(参考にこちらなど、成る程、Serviceだろうがなんだろうが、表面上働いている様子がなければkillの対象になってしまうのね。それを防ぐにはnotification(通知)でforegroundにせよと。サンプルにそういうコードがあるのは見ていたけど、通知なんていらねーよ後でいいよと放置していたのがまさかこんな事になろうとは。聞いてないよ、というかだからこそ基礎固めが必要なのですよと。

 流石に小一時間も聴いていたら落ちるようなアプリは前回以上に晒し者に出来ないだろうと、現段階であまり弄りたい所ではなかったのだけれども渋々改修。あーもうこのソース見てらんない。早く丸めてポイして作り直したい。まぁ最初に作るモノはしょうがないよね。
 で、それだけでは面白くないし、実のところ自分用カスタム版とup版を作り分けるのが面倒臭くなったので、前回書いたconfig仕様を盛り込んでみた。Bluetooth機器優先接続と、そのボタン機能のカスタマイズ。BTの優先は、ヘッドセットを繋ぐだけでボタン操作をこのアプリが拾うようにする。offだと再生から停止するまでの間しかBTは占有しない。手動で曲を選択することも出来ないような局地戦アプリなのでご利用は計画的に。またボタンカスタマイズは自分がshuffle操作を優先して使いたかったけど割り当てるボタンがないから。というかprev trackは都合上未実装です、はい(笑)。
 いやぁ、こうして設定画面が付くと何かアプリっぽくなるよね。え?その前に操作UI何とかしろって? 先にconfig作っちゃうところが如何にも自分らしいなとつくづく思い知りましたとさ(笑)。

 という訳で、ver0.04。
>AlbumShuffle004.apk (※提供元不明のアプリを許可で)
 そしてもうアプリ名とかアイコンについては忘れ去られている。
 公式のDL素材から持ってきたんだから利用上は問題ないんだよ、たぶん(そういう問題か)。

いじめ(操作)格好良い

 Androidひつまぶし編(違)。
 いやはや、酷い不具合を見付けてしまった。nextボタンを連打すると大変なことになる(笑エナイ)。
 楽曲再生の準備(prepare)を非同期で行っているので、その間にまた次のを処理しようとして、というのを繰り返す内にイベントが溜まりまくってやがては応答不能で落ちる。ははは。こういういじめ操作は気の利いた人なら真っ先に試す試験だよね。いやはや情けない。
 取り敢えずprepare中はボタン入力を無視するようにした。この分連続スキップの反応は悪くなるんだけど、サンプルも標準添付アプリも同じ挙動なのでそれでいいかと思う。
 という訳で、ver0.03。
>AlbumShuffle003.apk (※提供元不明のアプリを許可で)

 まぁ慌てずとも誰が使うものでもない気もしますが、一応万が一に。
 この辺でしばらく水面下に潜って整理・改修かなーとも考えているので、変なバージョンをネットの片隅に晒し続けるのも賢明ではないなと。

 因みにBluetoothボタン制御の件は試した感じ今考えているやり方で良さげ。ただそもそも優先アプリにしてしまうとそれは即ち標準プレイヤーに成り上がるということなので、現状の低機能局地戦仕様だとあまりにおこがましい事になってしまう。なので上の0.03には入れていない。入れるならconfigでオンオフ出来るようにしてからだね。他にもボタン割り当てを個人仕様にしていたりして(ボタン数が少ないのでより使う機能を当てたい)、この辺のカスタマイズ機能も入れたいなと思いつつ。
 その前にUIどうにかしろってな。<自分はどうせBTでしか操作しないので後回しにしがち
 え、アイコン?(笑)

ランダム再生つづき

 さて、Android暇潰し編。
 Bluetoothボタン制御は出来るには出来たのだけれど、標準プレーヤーがやっているような非起動状態からボタン一発で起動させる方法がはっきりしない。普段から、Bluetoothデバイスを取り出して接続して再生という風に本体の操作無しで済んでしまっているので出来ればこれもやっておきたい。
 イベントレシーバに登録しないとボタンのイベントが取れないようで、登録するのは構わないのだけどそれをいつ解除すれば良いのかという。サービスを立ち上げっぱなしというのもどうかと思うし、一旦登録したらずっと解除しない(メニュー操作で明示的に解除させる)というのも手なのかもしれないけど、登録したままアプリをアンインストールするとあら大変と言いますか。ちょっとかなり行儀が悪い。そもそもアンインストール時の後片付けをやりたい時ってどうやるの?とか調べ出しても良い回答が出てこないのは困りもの。まぁ次善の策として、Bluetoothの接続・切断イベントは任意に受け取れるので、切断時にレシーバを解除しておけば不意のアンインスコ事故も比較的防げるかもしれない。

 という訳で早速脱線しております。脱線じゃないか。まぁハードウェア制御はこういうものと。
 しかも本題の方は、よくよく見ると公式のサンプルに如何にもなのが転がっているじゃないですか(ものは普通のトラック単位のランダムだけれども)。音楽再生に関する作法が一通り押さえられているので、それを参考にすればするほど当然というか必然というか似たようなコードになっていって、何かもうサンプルソースをベースに手を入れた方が早いんじゃないの?とか思ってしまう罠。
 とはいえ必要のない部分はまだ読んでいないし、それで問題があっても「サンプル通りなので分かりません」は人としてどうかと思うので、流用よりは模倣の方がまだマシというものであろうかと。

 そんなこんなのver0.02。
>AlbumShuffle002.apk (※提供元不明のアプリを許可で)

 暫定暫定で試しているのでここから先は少し大掛かりな整理をしていかないといけない。
 まぁプログラミングなんて作り直してナンボだと思いますけどね。
 一方、MassEffect3が発送されたけれど、どうするかなぁ。

Androidでランダム再生

 あまりのテンションの低迷ぶりに「何もしない」と決めたはいいが、そうと決めると途端にヒマにあぶれる罠。しょうがないのでAndroidアプリ開発でも始めてみた。前々から欲しかった機能があって、従来そういう物は探せば何処かで見付かってしまうものだったけれど、何だかもう探すのも面倒くさくなってしまって(ぉぃ)。

 そんな訳で今回作ってみたのは、mp3プレーヤCreative Zenにあった「Today’s Album」という機能の再現。
 ボタン一発でその日その日のアルバムを選んで再生してくれるというもので、つまるところは「アルバム単位でのランダム再生」。楽曲はアルバム単位で聴きたいけど、アルバム自体はランダムで選びたい、そういう時に丁度良い。UIが良いとは言えなかったZenでは殆どこの機能ばかり使っていた。

 Android開発を始めたとは言っても、仕事で基本的な所は既に触れていたので初めてではない。必要な所を調べながらざっくり形にしてみた。メディア周りの一切をシステムが提供してくれるからこその、このお手軽日曜大工。サービス周りは初めてで少し手間取ったけれど。
 勿論UIは超暫定、多分アプリ名も暫定、アイコンはアイリ。そんなところで宜しくお願いします(ぉ)。
>AlbumShuffle.apk (※提供元不明のアプリを許可で)

 UIも色々考えないといけないけど、個人的にはBluetoothのボタン制御も対応させないといけない。むしろ機能性から言えばこっちが先だなー。また面倒くさくなる前にそこまではやらないと(笑)。