2014-03-28

Medoly ver.1.2.6

Medoly

ちょっと思いついた事を実装。


再生キュー項目の長押しメニュー内容変更

再生キューの曲を長押しした際のメニューに「先頭に移動」と「末尾に移動」を追加。個人的に少しほしかったので。
代わりに「再生」を除外。再生は項目をタップすれば良いだけの話なので必要性は低いかな…と。

検索画面のジャンル表示高速化

検索のジャンル画面の表示を少し高速化しました。
Androidのメディアデータベースは、一つの曲が複数のジャンルを保持できる構成になっています。
各ジャンルに含まれている曲数を表示させるため、今までは各ジャンルそれぞれについて曲数をカウントするという事をやっていたため、やや処理が遅くなっていました。当然、ジャンル数が多いと時間がかかります。
最近ちょっと調べてみたところ、検索URIに「content://media/external/audio/genres/all/members」を用いることで、ジャンルIDと楽曲IDの紐付けを行うテーブルにアクセスできる事が分かりました(ちなみに「audio_genres_map_noid」というビューを参照している。実体は「audio_genres_map」テーブルの模様)。
これをジャンルIDでグループ化して、各グループのカウントを取得することで、ジャンルに含まれる曲数を素早く取得できるようになりました。
ちなみに、プレイリストも同様の処理を行うつもりでしたが、同様ののURIが見当たりません…。

検索画面のストレージ表示高速化

検索のストレージ画面の表示を高速化しました。
これも曲数カウント絡みで、従来はテーブルからカレントディレクトリに含まれるメディアを全て取得し、Javaのコードで項目をカウントするという力業で曲数を取得していました。当然、曲数が増えると処理に時間がかかるようになります。ディレクトリの階層が浅くなり、サブディレクトリに含まれるメディアが増えていくと、それに合わせて表示に時間がかかるようになります。
変更後は、SQLiteのGROUP BYとCOUNT関数を活用するようにしました。ただし、SQLiteは文字列長に合わせた柔軟なグループ化ができない(私が知らない)ので、以下のような感じのSQL処理を行うようにしました。

START = カレントディレクトリパスの文字列長
LENGTH = カレントディレクトリに含まれる最大ファイル・フォルダ文字列長

SELECT [ファイルパス], SUBSTR([ファイルパス], START, LENGTH) AS subpath, COUNT(subpath) as count
FROM [メディアテーブル]
WHERE [ファイルパス] LIKE カレントディレクトリ%
GROUP BY subpath

上記の内容は大雑把なイメージですが、とりあえずSQLで可能な範囲でざっくり纏めてしまうというのが基本的な方針です。もちろん、同一のサブフォルダが複数に分割される場合もありますが、細かいカウントの合計値はJavaの処理で行っています。
なお、この処理の特性上、カレントディレクトリに一つでも長い名前のファイル・フォルダが含まれていると処理の効率が悪くなります。
ただ、ほとんどの場合は表示が高速化されますし、上位ディレクトリに行く程表示が遅くなる従来の問題は無くなります。

検索画面のジャンル・プレイリストのカウントが正しく表示されない問題修正 

これは、カウントする処理が誤っていたバグです。

検索画面で一つでもチェックが入っていた場合に、タップ挙動をチェックの変更とする

検索画面で、リスト上に一つでもチェックが入っていた場合、項目タップの挙動をチェックのON/OFF切換とするようにしました。ディレクトリのタップ動作によりチェックが全てクリアされてしまうため、誤操作により何度もチェックをやり直す羽目になる問題があったためです。

2014-03-25

Medoly ver.1.2.5

Medoly

エラー発生時の対応ダイアログ追加

エラーが発生してアプリが終了した際、次の起動時に以下の選択ができるようにしました。
もしアプリが起動できなくなった場合は、再生キューのクリア、または設定のクリアを実行してください。
  • 再生キューをクリア
    再生キューの内容をクリアします。
  • 全ての設定をクリア
    再生キューの内容及び設定を全てクリアし、初期状態に戻します。
  • 何もせずに起動
    そのまま起動します。通常はこれを選択してください。

ウィジェットが更新されない不具合修正

現在の再生曲をクリアした際に、ウィジェットに曲情報が残る不具合があったので修正。
これは、ImageViewの画像をクリアする際に、クリアのやり方が悪くて例外が発生していたためでした。これはAndroid 4.4なら問題なかったのですが、旧バージョンでは発生していました。

ストレージ検索の複数チェック時に検索結果がおかしくなる問題を修正

フォルダ検索で、複数チェックして別の条件を再検索した際に、検索結果が正しくならない場合があったので修正しました。
これは、SQLの検索条件が括弧で囲われていないためでした。

例を挙げると、今までは以下のようなWHERE句になっていました。
WHERE _data=? OR _data = ? AND artist=?
これを修正して、以下のようにWHERE句が組まれるようにしました。
WHERE (_data = ? OR _data = ?) AND artist=?

再生キューのサムネイルが正しく表示されるよう修正

再生キューのサムネイルが正しく表示されない場合があったため修正。
アルバムアートが存在しない場合、再生キューの1個前の画像を拾ってしまう場合があり、これをデフォルトの画像が表示されるように修正しました。

2014-03-18

Medoly ver.1.2.3

Medoly - Google Play の Android アプリ

ちょっと試してみたらすぐ出来たので1.2.3へアップデート。
 

再生キューの長押しメニュー追加

再生キューを長押しした際にメニューを表示するようにしました。既に他で代替できるような機能ばかりですが、一応一般的なアプリと同様の操作方法も出来た方が良いかな、と。
とりあえずアップデート内容はそれだけ。

 

2014-03-16

Medoly ver.1.2.2

Medoly - Google Play の Android アプリ

すぐ実装できそうだったのでサクッと機能追加。

関連付け処理追加

音楽ファイルが、他のアプリから「共有」や関連付け実行できるようになりました。
音楽ファイルを「共有」もしくは関連付けで実行すると、再生キューに登録されます。オプションから自動的に再生させるようにする事もできます。
試しに作ってみたけど、意外と面倒くさかった…。

2014-03-15

Medoly ver.1.2.1

Medoly - Google Play の Android アプリ

いきなり修正。

ソートアイコン変更

ソートアイコンが昇順が下矢印、降順が上矢印だったので修正。何となく、A→Zの感覚で昇順を下矢印にしたけれど、よく考えたら昇順は普通↑や△で表記されることが多い。
とりあえず、Excelのアイコン風にAとZを添えてアイコンを統一。

変更前

変更後


ソート時に画面が更新されない不具合修正

ソート時に画面の更新がされず、ソーとされていないように見える不具合があったので修正。


タイトル検索時に同名タイトルがまとめて表示される不具合修正

検索時に同一タイトル名があった場合、まとめて表示されてしまう不具合があったので修正。

Medoly ver.1.2.0

Medoly - Google Play の Android アプリ

Medoly Ver.1.2.0をリリースしました。
個人的な感覚では1.5.0ぐらいまでバージョンをすっ飛ばしたいところですが、表面上は大して変わり映えしないので1.2.0で。



内部処理の大幅な見直し

今回のバージョンで再生キューの内部的な処理を大幅に見直しました。というか、ほぼ別物です。別物ですが、表面上は特に変わってないと思います。そういう風に作ったので。
今までは再生キューの内容をファイルパスで保持し、アプリ起動時にファイルパスから読み込んでいました。アプリ起動時に進捗ダイアログが表示されるのはそのためでした。ところが、当然読み込みに時間はかかります。
これが問題になるのは、リモートコントローラやウィジェットを利用する場合です。再生ボタンを押すと、その時にアプリが起動して読込処理が走るため、再生キューに多くの曲が登録されているとボタンを押しても反応しない等の問題があったり、よく分からないエラーが発生することがしばしばでした。
そんなわけで、再生キューの内容をSQLiteのテーブルで定義し、そこからCursorLoaderを利用して逐次読み込みすることにしました。アプリの根幹部分をゴッソリ入替えたので、この改造でほぼ1ヶ月ぐらい費やしてます。
そのため、起動時の再生キュー読込処理は無くなりました。その代わり、 端末の性能が低いと再生キューのスクロールが多少もたつく事があるかもしれません。それを気にするほど大量に再生キューを登録する利用をしているかどうかは分かりませんが。

また、編集モードのキュー入替え時に再生キューリストが一瞬だけちらつくのはコレに伴う影響です。従来メモリに保持してたものをテーブルに保持させた結果、書き換え&画面更新で処理が遅れてしまうためです。…もしかしたら何かの解決策があるかもしれませんが、現状はそこまで調べ切れてないため、仕様とさせてください。
あと、再生キュー登録時の進捗バーが無くなったのもとりあえず仕様です。処理が変わったことで以前のような進捗バーを出すことが出来なくなってしまったため、表示をやめました。そもそも、100曲登録する程度なら大した時間はかからないので。1000曲ぐらい登録するとやや時間はかかりますが。頑張れば表示出来ないことは無いですが、それによって登録処理が遅くなっても本末転倒なので…。

ウィジェット追加

表面的に一番大きな変更点は、ついにウィジェットが追加されたこと。とりあえずレイアウト別に2種類あります。サイズが可変(最小サイズは2x1)なので、好みに応じて適当に拡大・縮小してご利用ください。Androidのバージョンによっては変なレイアウトになる可能性もありますが…。



 

ソートの降順対応

 内部処理の大幅な見直しに伴う副作用というか、元々これも視野に入れてたのですが、従来ソートが昇順だけだったのに加え、降順にも対応しました。これは、SQLite テーブルを使用した事によって、その辺の処理が簡単に実装できるようになったので追加しました。


ホームパスの省略表記

ホームパスを設定していた場合、ディレクトリパスの表示を半角チルダ「~」で表示するようにしました。省略しないと文字が長くなりすぎるためです。ホームパス以下でない場合や、上位のディレクトリは省略せずそのまま表示します。

その他

ラベル・メッセージの微調整、表記変更、アルバムアート解像度の修正、歌詞の初期表示で先頭にスクロールしない問題の修正等、細かいのはいくつかあります。
内部処理の大幅な見直しで処理が大きく見直されたので、修正が無意味になったりしたものがあったりして、把握できてない物が多いです。