ダウンロード数が1000を越えた

先日、1/11にMedolyのダウンロード数が1000を越えました。

ダウンロード数が1000を越えると、Google Play上の表記が「500~1,000」となっていたものが、「1,000~5,000」に変わります。Android端末のGoogle Play端末上も表記が以下のように変わります。
 
Android端末上の表記
 ちなみに、ここでいうダウンロード数というのはユーザベースの総ダウンロード数となります。1つのアカウントが1度でもダウンロードすると1回にカウントされるはずです。別端末にアプリをインストールしても、アプリをアンインストールしてもカウントは変わらず、カウントが減ることはない…という認識です。
ちなみに、それ以外に現在インストール中のユーザ数、現在インストール中の端末数などが見られます。

公開してからおおよそ1年ぐらいで1000まで来ましたが、次の基準値の5000になるのはいつになることやら…という感じです。個人的には、あと1桁は増やしたいところですが、まぁノンビリやっていきたいと思います。
いつもご利用頂いてる皆様、本当にありがとうございます。今後もよろしくお願いします。
 

Medoly Ver. 1.8.5, 1.8.6

2014-12-28 Ver. 1.8.5

– M3Uファイルプレイリストの出力対応
– 歌詞のMIME Type表示
– プロパティのメディア、アルバムアート、歌詞ファイルに「開く」アクション追加
– 検索画面の「ストレージ」タブを外部アプリから開く機能追加(プロパティのフォルダパスを開くアクションに対応)
– Viewタブにボタンを表示させた状態で歌詞がスクロールできない問題修正

M3Uファイルプレイリストの出力対応


プレイリストの保存の際、M3Uファイルへ保存できるようにしました。保存時に、プレイリスト保存種別の選択ダイアログが表示されます。
従来、プレイリストの保存を行う場合はAndroid標準の共通メディアデータベースへ保存されていました。これはAndroid標準で用意されているため、多くのプレイヤーが読み込みに対応しています。ただし、当然のことながら、端末を変更するとプレイリストの読込みができなくなります。また、何らかの事情によりデータベースが初期化されると、プレイリストも一緒に削除されるため、同様に読込ができなくなります。
その問題への対応として、M3U形式のプレイリストファイルを書き出せるようにしました。M3UファイルはAndroidでも標準で対応しているため、別端末へ移動したり、DBを削除したりしても、Androidによって自動的に再スキャンされ、プレイリストとして再登録されます。
注意点としては、M3Uファイルはプレイリストの名前としてファイル名が利用されるため、プレイリストの名前には改行やファイル名に使用できない文字が使えないといった制約があります。
保存時に保存先のファイルパスの他、「相対パス」と「絶対パス」の2種類を選択します。これは、M3Uファイル内に記録するメディアファイルのパスを、相対パスで保存するか、絶対パスで保存するかの選択です。「相対パス」の場合、メディアファイルとプレイリストの保存場所を変更しなければ、端末が変わってもそのままプレイリストが再読込されますが、M3Uファイルの保存位置を変更すると読み込めなくなります。一方の「絶対パス」は、M3Uファイルの場所を変更してもプレイリストの再読込を行う事ができますが、端末が変わると読み込めなくなる可能性が高いです。基本的には、相対パスを推奨します。

歌詞のMIME Type表示


読み込める歌詞ファイルの種類が増えたので、歌詞ファイルにもMIME Typeを表示するようにしました。歌詞ファイルに対して、「共有」や「開く」のアクションを実行する際に影響します。

プロパティのメディア、アルバムアート、歌詞ファイルに「開く」アクション追加


従来、メディア、アルバムアート、歌詞ファイルに対して「共有」アクションを実行して外部アプリにファイルを渡すことができましたが、それ以外に「開く」アクションを追加しました。同様に外部アプリにファイルを渡すのですが、アクションが異なります。「開く」の方は、Windowsでいうダブルクリックでファイルを開くようなアクションで、「共有」はメールへのファイル添付を行う場合等に利用します。
やってることは似たようなものですが、Androidではこれらは別物として扱われます。

検索画面の「ストレージ」タブを外部アプリから開く機能追加(プロパティのフォルダパスを開くアクションに対応)


Medolyに対して「フォルダを開く」といったアクションが実行された場合、指定したフォルダを検索画面のストレージタブで開けるようにしました。受け取れるMIME Typeは「resource/folder」「x-directory/normal」「inode/directory」等です。なお、「resource/folder」他のファイラーアプリでも対応してるため、これが標準と考えています。
プロパティタブに表示された「フォルダパス」の「開く」アクションを実行しても受け取ることができます。現在開いてるメディアファイルのフォルダを開きたい場合にご利用ください。

Viewタブにボタンを表示させた状態で歌詞がスクロールできない問題修正


フリック操作対応時にタップ処理の対応漏れがあったため、修正しました。

2015-01-07 Ver. 1.8.6

– 標準のプレイリストの保存種別を保持する設定追加
– SYLT歌詞の読込処理を修正 (ISO-8859-1対応)
– 歌詞のMIMEタイプ取得処理修正
– M3Uファイル保存時にプレイリスト名を更新するよう修正

標準のプレイリストの保存種別を保持する設定追加


プレイリストの保存種別を選択する際、標準の保存種別(Android標準データベース or M3Uファイル)を決定できるようにしました。これを使う人は、毎回保存種別を選択するような使い方はしないと思われますので…。なお、設定画面よりダイアログを復活させることができます。

SYLT歌詞の読込処理を修正 (ISO-8859-1対応)


これは、ユーザー様からの修正要望です。ID3v2の同期歌詞タグ、SYLTに保存された歌詞の読み取り処理を修正しました。
従来もSYLT読み込み処理はできていたのですが、文字コードがUNICODE(UTF-16)限定でした。というのも、SYLTの書込みツールとして利用していたのが「MiniLyrics」だったためです。このツールは、SYLTの書き込みはUTF-16で行われています。
今回は、それに加えてISO-8859-1への対応を行いました。さらに言うと、一旦バイナリ配列に落とし込んだあとで文字コード判定処理を行っていますので、Shift_JISが書かれていても読めます。文字コード判定に失敗さえしなえれば、大抵の文字コードは大丈夫だと思います、多分。とりあえず、「K5 Lyrics Editor」で作成したSYLTファイルで読込を確認しています。
ともかく、これでSYLTの読み込みはほぼ問題なくなると思います。ちなみに、SYLTで検索すると「SYLT Editor」というツールが出てきますが、 これはタグ情報が破壊されてSYLT情報どころかタグ情報その物が読み込めなくなるので、使用しないで下さい。
なお、 SYLTの仕様は以下のサイトにあります。
ここで少しオマケ話。
この仕様を見ると、歌詞はテキストの間に「$00 xx xx」(xx xx = 再生時間)という同期識別子が挟まっている形式となっています。また、改行は「$0A」で表現されます。ところが、多くのSYLT対応プレイヤーでは、同期識別子の出現と同時に、テキストが改行される挙動となっており、事実上標準の動作となっています。(そのため、行内の文字単位で同期させることができません。)
本プレイヤーでは、基本的には同様に同期識別子で改行する動作に合わせています。…が、同期識別子の前後に改行文字(LF, CR, CR+LF) が一つでも出現すると、本来のSYLT動作が期待されているものと判断し、同期識別子での改行を行わず、改行文字による改行のみを行うようにしています(行の途中での出現は無効となります)。
 まぁ、そんな細かい動作に拘っても、使う人がいないので意味が無いのですが、本来の動作に拘ってみたかったので、そんな実装をしてみました。

歌詞のMIMEタイプ取得処理修正


1.8.5で作成した歌詞のMIME Type読み込み処理に問題があったため、修正しました。

M3Uファイル保存時にプレイリスト名を更新するよう修正

M3Uファイルを保存した際に、プレイリスト名が更新されていなかったため、保存するように修正しました。

Medoly Ver. 1.8.0

1ヶ月ぶりぐらいのバージョンアップ。

2014-12-22 Ver. 1.8.0
– ピンチイン・ピンチアウトによる画面表示サイズ変更の追加
– スワイプ操作による画面切換の追加
– 音声フォーカスの一時喪失の処理が誤っていた問題修正

ピンチイン・ピンチアウトによる画面表示サイズ変更の追加

これはユーザ様からの要望です。
メイン画面のタブ枠内で、縦方向のピンチアウト・ピンチイン操作を行うと、タブの表示領域を拡大・縮小します。以前の設定オプションの表示拡大を拡張し、段階的に出来るようにした形です。
Android画面の、上方向のステータスバー及び下方向のナビゲーションバーまで非表示になります。なお、Android 4.4より前のバージョンではナビゲーションバーを非表示にしても、画面をタップするとナビゲーションバーは復活しますが、これは仕様です。また、画面を横した場合はナビゲーションバーが横になりますが、その場合も操作は変わらず下方向の操作となります。…一々操作を切り替えるのは、作る側も操作する側も面倒臭いですから。

なお、このピンチイン・ピンチアウト動作については少し変わった動作をします。2本以上タップした状態で、上側の指を上方向に動かすと、上側のアクションバー及びステータスバーが非表示になり、下側の指を下方向に動かすと、下側のGUI及びナビゲーションバーが非表示になります。非表示になる順番を以下の図に示します。

ピンチズームで拡大・縮小する順序

ちなみに、最大まで拡大すると、以下のような感じになります。

スワイプ操作による画面切換の追加

これは、上記のピンチズーム動作の追加に伴うもので、メイン画面タブ内をスワイプすると、タブの切換が行われるようになりました。これは、ピンチズームで画面を最大まで引き伸ばすとタブが隠れるため、その際にタブ切換が行えるようにする救済措置的な意味があります。
…実はこのスワイプ操作、最初の公開前の開発段階で実装するつもりではいたのですが、作り方がよく分からず後回しにした経緯があり、やっと実装できたという感じです。実際、スワイプやスクロール、クリック、ピンチズームといった各種操作を細かく制御する必要があり、ちょっと難しかったのですが、何とかそれっぽく動くようにはできたと思います。

なお、この実装にはAndroidのサポートライブラリが必要だったため、このバージョンより「android-support-v13.jar」を追加しています。そのため、実行APKのサイズが350KBほど増加しています。
今まで使ってなかったのかと言われそうですが、使わなくてもさほど困らなかったもので。そもそも、どうしてViewPagerクラスがサポートライブラリにしか含まれていないのか、その辺の理由がよく分かりません。

余談ですが、スワイプ操作ができるようになった事で、何か凄くスマートフォンアプリっぽくなったなぁ、と個人的に思ってます。今までは何となく、Windowsアプリケーションの延長線ぐらいの感覚だったのですが。

音声フォーカスの一時喪失の処理が誤っていた問題修正

アプリの標準状態で、他のアプリで一時的な音声が発生した場合、例えばメール通知やナビゲーション音声が発生した場合、音楽再生が中断していたと思いますが、これはバグでした。本来、一時的な音声フォーカスの喪失が発生した場合、音量を下げる処理を入れるつもりだったのですが、これが永続的な音声フォーカスの喪失の処理となってしまっていました。
そのため、今までの状態はメールの通知等で音楽が中断される状態となっていたと思いますが、これが音量を下げるようになりました。

その他

現在、アプリに別の処理を組み込んでいます。実はもう9割ぐらい実装済みなのですが、公開はもう少し先になると思います。とりあえず現在は埋め殺し状態です。現状でも、別途アプリを入れると動くようになりますが…。
その辺の兼ね合いでバグが発生する可能性もありますが、問題があれば報告していただけると幸いです。

Medolyの仕様書

1週年なので小話を一つ。

Medolyには仕様書があります、一応。作り始める前に、イメージを固めるために、画面のイメージを描いてみたものです。描いた時期は多分、2013年の8月頃だと思います。

…仕様書です。仕様書ですったら仕様書です。
見ての通り、適当な代物です。ちなみに、その時手元にあったやや広めの付箋紙に描いてあります。1枚目はメイン画面(下)と検索画面(上)、2枚目は検索画面の検索欄です。この時点で大体今のアプリのイメージは固まってました。
当時は検索画面のタブを下側に置くつもりでいたと記憶しています。
あと文字が読めないので分からないと思いますが、この時点ではメイン画面の再生キューが右側のタブ、プロパティが左側のタブになってます。色々あって左右逆転して今の形になってます。UIの設計は色々考えながら今の形になっているのですが、時間があればその辺もここで書いてみたいと思ってます。

そんな感じで、1周年の小話でした。

Medoly 1周年

Medolyは2013/12/8にVer.1.0がリリースされたので、昨日で公開から丁度1年経ちました。

Androidで始めて作成したアプリだったので、1年前のリリース時はかなり色々問題がありましたが、この1年で機能追加やら改善やらで大分自分の理想
のアプリに近づいてきたように思います。なお、現在のバージョンは1.7.6。内部的なバージョンコードは50で、1年間で49回バージョンアップさせて
います。

お使い頂いてる方には何となく分かるかと思いますが、とにかく歌詞の表示に注力しています。理由は、そういう機能を重視したアプリがさっぱり見られないからです。無いなら自分で作ってしまおう、というのが開発を始めた動機だったりします。

近年、音楽の販売はどんどんCD販売からネットワーク販売に移行していますが、CDは必ずジャケット等に必ず歌詞がついてました。ところが、音楽配信サービスは多くの場合、歌詞がついてない。それが当たり前になっている。歌詞を見たいなら、広告がベタベタ貼ってあって、コピー&ペーストも出来ない歌詞サイトとやらを利用することになります。

もうアホかとバカかと。なんでそれで満足してんの?自分で買った曲の歌詞ぐらい自由に利用させろ。そもそも、最初から従来の歌詞カードの代用になるデータを寄越せよ。ってのが個人的な本音です。

そういう不満タラタラな状態だったのですが、以前より歌詞データの仕様については色々調べていたこともあり、とりあえずそれを実現可能な形にしてみたのがMedolyです。多分、現状Google Playストアにあるどんな音楽プレイヤーよりも対応してる歌詞の種類は多いと思います。あと、ライブラリ依存ですが文字コード判定もそこそこ高い精度でできていると思うので、英語しか出せないようなアプリが多い中、比較的多くの言語で利用できると思います。要するに、言語・種別問わず多くの歌詞が表示できるのではないかと思います。

そんなこんなで、本アプリはまだまだ色々追加したい機能や改善したい部分が多数あるので、これからものんびり開発を続けていきたいと思います。もしご意見・ご要望等ありましたら、遠慮せずに連絡いただけると嬉しいです。

ちなみに、現状で考えてる追加機能は、

  • プラグインによる機能追加
  • 歌詞の表示レイアウト調整
  • プレイリストのエクスポート

など。もう少し色々ありますが、大きなところはそんな所です。
プラグインは、歌詞やアルバムアートの自動取得等の機能も込みで。その辺はまだまだ先の話ですが。どう実装したものかと手探りなところがありますが、温かい目で見て頂けると幸いです。

そんなこんなで、これからもよろしくお願いします。

Medoly Ver. 1.7.5, 1.7.6

2014-11-02 Ver. 1.7.5
– MP3 内蔵歌詞 Lyrics3 v1, Lyrics3 v2 形式対応
– 以下の外部字幕ファイル対応
 * SRT (SubRip) フォーマット [.srt]
 * STL (Spruce subtitle) フォーマット [.stl]
 * SCC (Scenarist Closed Caption) フォーマット [.scc]
 * SSA/ASS (SubStation Alpha) フォーマット [.ssa/.ass]
 * TTML (Timed Text Markup Language) フォーマット [.xml]
– プロパティ情報のファイルパスをフォルダとファイルに分割
– フォルダの共有を追加

MP3 内蔵歌詞 Lyrics3 v1, Lyrics3 v2 形式対応

MP3は規格的に古い事もあり、長い歴史の中でいくつものタグ種別があります。
歌詞の内蔵方法にもいくつかの種類があり、主に以下のようなものがあります
・ID3v2 USLT
・ID3v2 SYLT
・Lyrics3 (Version1, Version2)

USLTは非同期歌詞を保存するタグです。単純なテキストが格納され、MP3で「内蔵非同期歌詞」と呼ばれるのはこれです。この歌詞タイプの場合、比較的多くのプレイヤーで読み取りができると思います。
SYLTは同期歌詞を保存するタグです。歌詞は単純なテキストではなく、テキストとタイムコードが交互に登場するような形となっています(参考: id3v2.3.0 – ID3.org )。この内容を独自に解析しているので、表示結果が怪しいところがあるかもしれません。Windows Media Playerのバージョンによっては、これが読み取れる場合があるようです。
Lyrics3は、ID3v1、ID3v2とも独立したタグです。名前の通り歌詞が保存されますが、タイトルやアーティスト情報も保存できるようです。Version1とVersion2がありますが、Version1は古い規格なので、Version2さえ使っておけば良いかと思います。歌詞はテキストで作られますが、その内容はLRCファイルと同一のフォーマットとなるようです。というか、LRCファイルがLyrics3の内容を外出ししているのでしょうか(その辺の経緯はイマイチ分かってません)。Medoly内部でも、Lyrics3の内容をLRCファイルの解析処理にそのまま流して処理しています。いくつかの同期歌詞対応ソフトは、この歌詞を利用しています。

これらは以前からずっと対応しようと思ってましたが、ようやく対応させることができました。これで、大体の内蔵歌詞は読み取れるようになったと思います。読み取り結果に怪しい部分があるかもしれませんが、その際は連絡頂けると幸いです。

なお、これを作っていて分かったのですが、海外のアプリは概ね「文字コード?何それ美味しいの?」レベルの対応しかしていないようです。そんなわけで、Shift_JISで歌詞を保存した場合、まともに表示できるアプリは非常に限られてくると思います。歌詞やタグをMP3に保存する場合は、Unicodeを用いるようにしましょう。Medolyはなにぶん日本人が作ってますので、Shift_JISでも何とかなるかと思いますが。

余談ですが、カラオケタグについて調べてるうちに、ルビの規格について考えてる記述を見つけました。余力があれば、この辺も何とかしてみたいところ。

タイムタグ規格ルビ拡張規格 [翔星 Be ランド| BeOS 特集]

以下の外部字幕ファイル対応

世の中には歌詞ファイル以外に、動画の字幕データを歌詞として用いる文化があるようです。私はほとんど見たこと無いですが。とりあえず「Mediaplayer for lyrics」に名前負けしないよう対応させてみました。対応に当たり、以下のライブラリを利用しています。

JDaren/subtitleConverter · GitHub

一応こういう事をやってる方もいるようです。

春日 – カラオケ字幕制作ソフト プロジェクト日本語トップページ – SourceForge.JP

これも余談ですが、対応させたフォーマットのうち、TTMLフォーマットというXMLファイルがあります。w3cで策定された、由緒正しいフォーマットです。

Timed Text Markup Language 1 (TTML1) (Second Edition)

これは字幕等の時間に合わてテキストを表示させたりするためのものですが、歌詞データにも利用できるようです。今は文字読み取りぐらいしかできませんが、文字修飾等も定義しやすいため、時間があればこの辺を色々弄り回して色々表示できるようにしてみたいところ。

プロパティ情報のファイルパスをフォルダとファイルに分割

プロパティリストで「ファイルパス」となっていた所を、「フォルダパス」と「ファイル名」に分割しました。理由は、そちらの方が利用しやすいからです。
主な利用は、次の項目を参照。

フォルダの共有を追加

上記で追加したフォルダパスについて「共有」アクションを行うことができます。対応するアプリに共有すると、該当のフォルダパスを閲覧することができます。現在対応を確認しているアプリは、「ES ファイルエクスプローラー 」と、「Solid Explorer File Manager 」です。
フォルダを共有する際、MIME Typeに「resource/folder」を設定しています。上記以外にこのMIME Typeに対応したアプリであれば、共有を受け取る事ができるはずです。

余談ですが RFC2425 によると、フォルダ(ディレクトリ)のMIME Typeは「text/directory」らしいのですが、これを設定しても上記のアプリは受け取ってくれませんでした。Linuxだと「inode/directory」の模様。Androidだと、特定の機能ディレクトリを開くために「vnd.android.cursor.dir/*」というMIME Typeを利用するようですが、ストレージフォルダを開くための使い方がよく分かりません。

上記のように、正しいディレクトリのMIME Typeが特定できなかったため、設定からMIME Typeの変更ができるようにしています。

2014-11-20 Ver. 1.7.6

– プレイリストのダイアログ修正 (一部機種で開けない問題に恐らく対応)
– スリープ復帰時にダイアログのボタンを押すとエラーとなる問題の対応追加
– 再生キューのドラッグ&ドロップ処理修正
– SDカード未認識時のエラー処理修正

プレイリストのダイアログ修正 (一部機種で開けない問題に恐らく対応)

これは、アプリのエラーレポートにあがっていました。
プレイリストを開こうとすると落ちるとのこと。エラー内容を見ると、どうもプレイリストの一覧を開く時にエラーが発生しているような様子なのですが、私の端末では発生しないため、どうも特定の機種で発生する事象のような感じです。調べてみると、同様の事象がヒット。

技なれど波高し 【解決】android ListViewのonTouchにてNullPointerException

要するに、きちんとリストを実装しなさい…と。確かに、ここについては標準のリストをそのまま使っており、特別な実装を何もしていなかった。そんなわけで、ここもきちんと実装を行うように修正。

ただ、この問題についてはこちらで修正されたかどうかの確認ができないため、このエラー報告をあげて頂いた SoftBank 201M (MOTOROLA RAZR M) を利用されている方、 もしエラーが直ったという場合は御一報いただけると幸いです。もし、まだ直っていない場合は再度エラーレポートをあげていただけると助かります。

追記

報告された方から連絡があり、プレイリストはきちんと開けたきちんと読み込めたそうです。
というわけで、リストはAndroidのデフォルトのやり方( android.R.layout.simple_list_item_1 等を使うやり方 )でやると危険なようです。アダプタのgetViewをオーバーライドして、自分で処理を書くようにした方が無難かと思います。

スリープ復帰時にダイアログのボタンを押すとエラーとなる問題の対応追加

これはAndroidの仕様なのですが、ダイアログを開きっぱなしの状態でスリープに入って、復帰した際に、ダイアログ上に保持していた情報が欠落してしまいます。その状態で処理を続けると、NullPointerException等のエラーが発生します。
正攻法としては、そうならないようにダイアログを作るのが筋なのですが、正直物凄く面倒臭いので、「情報が欠落したらその時はメッセージ出すから再操作してくれ」というスタンスで作ってます。その処理に漏れがあったため、エラーが発生していました。

再生キューのドラッグ&ドロップ処理修正

再生キューを「編集モード」にした際、順番を入れ替える事ができますが、ここの描画更新処理がおかしかったので修正しました。単純に、ライブラリの使い方を間違ってました。

SDカード未認識時のエラー処理修正

SDカードがアンマウントされた状態でエラーが発生すると、エラーを繰り返してしまい、物凄い勢いでバッテリーが消費されていくという最悪のバグがあったので、修正しました。…多分。
以前直したはずなのですが、ギャップレス再生対応した際に復活してしまった模様です。

Medoly Ver. 1.7.0, 1.7.1

2014-10-17 Ver. 1.7.0

– 歌詞の表示スタイル設定追加
– 設定画面を画面分割化
– 表示タブのメニュー一部修正
– 表示タブのボタン配置一部修
– 再生・停止ボタン連続押しの挙動変更
– スリープ時にCPUに負荷がかかる問題修正
– 停止時のオフセット調整時に歌詞が追従しない問題修正
– メディアエラー時の処理修正
– 未選択状態の曲送りボタン押下時動作修正
– 設定の文言修正

歌詞の表示スタイル設定追加

歌詞の表示について、以下の項目を設定できるようにしました。これらは設定画面から変更できます。
  • 背景色
  • 歌詞テキストの影色
  • 未再生歌詞のテキスト色
  • 再生済歌詞のテキスト色
  • 再生中歌詞のテキスト色
  • 再生中歌詞の背景色
  • 再生中歌詞のボーダー色
  • アルバムアートの透明度
  • フォント種別(Sans-serif, Serif, Monospace)
  • フォントスタイル(太字、斜体)
  • 表示位置(左寄せ、中央寄せ、右寄せ)
また、スタイルのプリセットを選択することで、初期表示に戻すことができます。
なお、フォント種別、フォントスタイルについては、使用するフォントが対応していない場合は変化しません。特に日本語フォントについては、対応していない場合が多いと思います。というか、太字以外に変化してるのを見たことないです。恐らく、ほとんどの人がそうだと思います。そんなわけで、実質英語歌詞向けの設定になってます。
この設定、本当は各自でプリセットを保存できるようにして、メイン画面のタブメニューからプリセットを一発で切り替えられるような機能を持たせたかったのですが、作るのが大変だったので今のところはこの辺で妥協。そのうち作るんじゃないかと思います。

なお、これに伴い以下のライブラリを追加しています。

attenzione/android-ColorPickerPreference · GitHub

設定画面を画面分割化

歌詞スタイル関連の設定が増えすぎたので、流石に1画面で表示させるのは辛くなってきました。そんなわけで、従来の1画面から種別ごとに画面分割するようにしました。

表示タブのメニュー一部修正

表示タブをタップした時に表示されるメニューのうち、歌詞文字サイズの変更と歌詞同期オフセットの変更について、メニューを修正しています。

表示タブのボタン配置一部修

表示タブをタップした時に表示されるボタンのうち、文字サイズのアイコンの左右を入れ替えてま
す。
今まで、 左側がサイズ拡大、右側がサイズ縮小だったのですが、これが逆転しています。理由は、通常は右側が+方向、左側が-方向に値が増減する方が一般的であると考えられるため、それに倣うようにしました。
表示タブのメニューを修正した際に色々ボタン配置を見直した結果を反映しています。

再生・停止ボタン連続押しの挙動変更

再生・停止ボタン(再生と停止を兼ねる単一のボタン)を押した際、ヘッドセットのボタンと同じ動作をさせていたのですが、これを切り分けるようにしました。理由は、再生・停止ボタンの連続押しで曲送り・曲戻し動作が発生してしまうためです。
ロック画面の再生・停止ボタンで曲送り・曲戻し動作が発生してしまう事象への対策です。

スリープ時にCPUに負荷がかかる問題修正

これは昔から存在していた問題。何も弄ってない夜中に突然CPU使用率が跳ね上がり、ずっとCPUリソースを消費し続けるという問題がありました。これは毎日起こるわけではなく、たまに発生する上に、どのタイミングで起こるか分からない、充電中しか発生せずバッテリー稼働の際は起こらないといった症状があり、原因がよく掴めてませんでした。
これについて完全に把握したわけではないのですが、この事象はアクティビティのonResumeイベントにあった、歌詞更新ループ開始処理をはじめとした各種処理を、onStartイベントに持ってきたところ、(恐らく)発生しなくなりました。
恐らく、意図しないタイミングで歌詞更新のループ処理が走っていたものと思います。また、ループ処理も一部見直して、起動してない場合は確実に停止させるようにしました。
とりあえず、onResumeイベントを使うのは最小限に抑えた方が良さそう、という事は分かりました…。

停止時のオフセット調整時に歌詞が追従しない問題修正

以前の修正で、歌詞の更新処理を見直していたのですが、オフセット調整時に歌詞スクロール位置が反映されなくなっていたので修正しました。

メディアエラー時の処理修正

メディアエラーが発生した際の処理を修正しました。これは、ギャップレス再生を追加したことに伴う修正漏れです。

未選択状態の曲送りボタン押下時動作修正

曲が未選択状態で曲送りボタンを押した場合、本来は先頭の曲が選択されるのですが、ギャップレス再生処理を追加した際にその動作が消えてしまい、メディアが存在しないと判定されていました。

設定の文言修正

設定画面を画面分割化に伴い、メニュー項目や分類を一部変更しています。

ちなみに、表には出てこないので利用者には全く関係無い話ですが、今まで設定項目の見出しや説明文の文字列を設定XMLに直接書いていたのですが、これだと
日本語・英語で同じXMLを2つ用意しないといけないという問題があり、設定項目の食い違いに気付きにくいという問題があったため、文字列は全部別の
XMLに外だしするように変更しました。これが結構な大仕事でしたが、あくまでもユーザーには全く関係無い部分。

2014-10-26 Ver. 1.7.1

– メイン画面に再生キューの合計曲数、合計時間、再生済み曲数、再生済み合計時間の表示を追加

メイン画面に再生キューの合計曲数、合計時間、再生済み曲数、再生済み合計時間の表示を追加

タブの下側に、現在の再生曲No、再生済曲数、再生キュー曲数、再生済合計時間、再生キュー合計時間を表示するようにしました。ふと思いついて、適当に実装してみました。これに伴い、コントロール部分のレイアウトを多少詰めています。

曲数、再生時間の表示

Medoly Ver. 1.6.8

久々に変更内容の詳細でも…。

2014-10-01 Ver. 1.6.8

– 音声フォーカス取得時にエラーとなる場合がある問題修正
– アプリ再開時に歌詞再生位置が先頭に戻される問題修正

音声フォーカス取得時にエラーとなる場合がある問題修正

Ver.1.6.5でオーディオフォーカスの処理を変更しましたが、その際にnullチェックが漏れていたため、NullPointerExceptionが発生してました。
メディアがセットされていない状態でオーディオフォーカスの変更が発生した場合、存在しないメディアプレイヤーオブジェクトにアクセスしようとしていたためです。
 

アプリ再開時に歌詞再生位置が先頭に戻される問題修正

再生を中断した状態からアプリを再開した時に歌詞のスクロール位置が先頭に戻されてしまい、シークバー上は再生途中になっていても歌詞が先頭位置になるという状態が発生していたため、その修正です。

総ダウンロード数が500を越えた

Medolyは現在の所、総ダウンロード数が528、総インストール数が151。

アプリ情報
インストール数

総ダウンロード数

ちなみに、総ダウンロード数が500を越えると、Google Playに表示されるアプリの「インストール」項目が100~500 → 500~1000に切り替わるので、記念してここで書いてみた次第。

Google Play 情報

まぁ、ダウンロード数はさておき、これからものんびり作っていきます。

Medoly Ver. 1.6.5, 1.6.6, 1.6.7

ここ最近の変更について解説

2014-09-22 Ver. 1.6.5

– ギャップレス再生対応 (Android 4.1 以降)
– メイン画面点灯の設定追加(デフォルトで再生時のみ点灯とする)
– オーディオフォーカス処理の設定追加
– 曲戻し時に再生キューを未再生状態とする(設定で切換可)
– 本バージョンより、 android.permission.WAKE_LOCK パーミッションが追加されています

ギャップレス再生対応 (Android 4.1 以降)

このバージョンから、ギャップレス再生に対応しました。ライブ音源収録CD等の、連続した音楽がトラックで分割されている曲について、切れ目無く再生することができます。対応はAndroid 4.1以降となります。ただし、端末によっては対応されていない場合があります。AndroidのMediaPlayer標準のギャップレス再生方式を使用していますので、他のアプリでギャップレス再生できなければ、本アプリでも出来ないと思います、多分。
ギャップレス再生に対応するに当たり、内部の処理をかなり大きく見直しています。今までは、曲の切換をした際にMediaPlayerオブジェクトに対してファイルをセットし直すという処理を行っていました。今回の変更では、現在再生しているMediaPlayerオブジェクトに加え、次の曲をセットしたMediaPlayerオブジェクトの2種類を用意し、曲の切換時にMediaPlayerオブジェクトを入れ替えるという処理を行っています(入れ替えた時に、更に次のMediaPlayerオブジェクトを作成しています)。
これは、ギャップレス再生に対応する上で必要な変更なのですが、この結果として内部の処理を大幅に見直す必要がありました。
そんなわけで、かなり入念に確認をしたつもりなのですが、今回の変更で問題が発生する可能性は高いです。何かあれば、ご報告頂けると幸いです。
テストに使ってた曲

メイン画面点灯の設定追加(デフォルトで再生時のみ点灯とする)

今まで、メイン画面の点灯にチェックを入れると、メイン画面を表示している時は常に画面が点灯する(消灯しない)動作となっていましたが、これを設定画面で「常に点灯」「再生中のみ点灯」「歌詞表示中のみ点灯」「歌詞再生中のみ点灯」という4種類から選択できるようにしました。デフォルトは「再生中のみ点灯」となります。
これは、点灯状態で携帯を放置すると画面が表示されたままバッテリーを大きく消耗してしまうためです。これにより、電池が尽きてしまう状況に何度か遭遇したため、再生中のみ点灯するオプションを追加した次第。

オーディオフォーカス処理の設定追加

設定画面に、オーディオフォーカス(音声フォーカス)についてのオプションを追加しました(これに伴い、一部設定を削除しました)。オーディオフォーカスとは、アプリが音声についての各種操作を受け付けるために必要な設定です。これは、Android上で動作する何れか一つのアプリが持っており、アプリがオーディオフォーカスを取得すると、別のアプリのオーディオフォーカスが外れる、という動作をします。リモコンのボタンや、ロック画面のコントロールを受け付けるのは、オーディオフォーカスを持つアプリとなります。
今回、本アプリがオーディオフォーカスを取得するタイミングと、オーディオフォーカスが外れた場合の動作についての設定を追加しました。
オーディオフォーカスを取得するタイミングは、「取得しない」「アプリ起動時」「再生開始時」「アプリ起動時&再生開始時」の4種類から選択します。デフォルトは「アプリ起動時」です。「取得しない」とすると、オーディオフォーカスを取得しないためリモコン関係の設定は無効になります。「アプリ起動」とすると、アプリを起動した時にオーディオフォーカスを取得しますが、音楽再生中に別のアプリにフォーカスを奪われると、アプリを再起動するまでリモコン操作を受け付けなくなります。
オーディオフォーカスが外れる場合、一時的に外れる場合と、永続的に外れる場合があり、それぞれについての動作を設定できます。動作は、「再生を停止する」「音量を下げる」「何もしない」の3種類から選択します。それぞれ、メッセージを表示することができます。

曲戻し時に再生キューを未再生状態とする(設定で切換可)

本アプリは、曲を再生すると曲が「再生済」状態となります。従来はこの状態から曲戻しをすると、再生済状態のままとなっていました。今回の変更では、曲戻しをすると未再生状態に戻されます。
この理由は、一度「曲戻し」をした後に「曲送り」をすると、再生済みの曲がスキップされるため、「曲戻し」前の曲には戻る事ができなかったためです。聞きたい曲を探して曲送りを連打する→行きすぎたので曲戻しをする→やっぱり行きすぎた先の曲も聞きたい、という事がしょっちゅうあったので、このような動作に変更しました。


本バージョンより、 android.permission.WAKE_LOCK パーミッションが追加されています

今まで、MediaPlayerオブジェクトに setWakeModeでWakeModeを設定していなかったのですが、今回、PowerManager.PARTIAL_WAKE_LOCK を設定するようにしました。この変更に伴い、android.permission.WAKE_LOCKパーミッションが必要となっています。
正直、これの効果はよく分かっていません。ただ、これが無いと音楽再生中にアプリが中断してしまうことがあるようです(私の環境では発生していないのですが)。再生を維持させるための設定のようなのですが、効果を確認する方法がわかりません。まぁ、おまじないみたいなものと考えています。

2014-09-24 Ver. 1.6.6

– リモート操作が復帰しない場合がある問題修正
– 曲切換時に再生キューがスクロールしない問題修正
– 終了時にメディア状態が保存されない問題修正
– 設定文言一部修正

リモート操作が復帰しない場合がある問題修正

音声フォーカスの取得処理がおかしかったバグの修正です。

曲切換時に再生キューがスクロールしない問題修正

曲が切り替わった際に、再生キューの自動スクロールをしてもスクロールが発生しないバグの修正。ギャップレス再生の対応に伴い、処理を入れ忘れました。

終了時にメディア状態が保存されない問題修正

メニューの「終了」から終了させた場合、メディアの再生位置等が保存されない問題があったので修正。これは既存バグ。

設定文言一部修正    

設定画面の文言を一部修正しています。

2014-09-26 Ver. 1.6.7

– 単体再生時の曲送り・曲戻し動作を修正

単体再生時の曲送り・曲戻し動作を修正

単体再生時、曲送りを押した際に次メディアがあっても「メディアがありません」と言われてしまう問題修正。ギャップレス再生対応に伴うバグです。