2017-06-30

Twitter はじめました

今さらなのですが、Twitterに少し開発情報をのせるようにしました。

理由は、全然開発情報を発信できてないためです。

現在、Medolyの開発は進めているのですが、状態が中途半端なのでブログに書くほどのものでもなく、かといって全く発信してないと全然開発してないと思われそうなので、Twitter側に簡単な情報を少しずつ載せていこうと思っています。

Twitterアカウントは、「@wa2c_medoly」となります。もしご興味があればフォローいただけると助かります。よろしくお願いします。

Twitter アカウント


2017-03-21

Scrobbler for KbMedia Player

Medolyと全然関係無いのですが、Windowsアプリケーションを一つ作りました。

Scrobbler for KbMedia Player



プログラムのダウンロードは以下のURLより。

https://github.com/wa2c/scrobbler-for-kbmedia-player/releases



これは、Kobarin様が開発する「KbMedia Player」というメディアプレイヤーアプリケーションで再生中のメディア情報を、Last.fmに通知(Scrobble)するためのアプリケーションです。起動するとタスクトレイに格納され、Windows起動中に常駐します。

使い方は付属のReadme.mdに色々書いてありますが、大して機能も多くないので、何となく感覚で使えると思います。

KbMedia Playerとの通信にはDDEを使用しています。Unicode文字にも対応しているので、文字化け等はないかと思います。


なお、今回はリポジトリにBitbucketではなく、GitHubを使ってます。理由は、Visual Studioが標準でサポートしてて楽だったのと、何となく使ってみたかったからです。あまり深い意味はありません。


以下余談。


何故このようなアプリケーションを作ったのかと言えば、私が昔からWindows上で音楽を再生する際に、このKbMedia Playerを使っていたためです。Medoly開発において、Last.fmへのScrobble用プログラムを開発していたところ、Windowsでも同様の事が行いたくなりました。しかし、KbMedia Playerではそのような機能は無く、それを実現するためのアプリケーションもありませんでした。無いなら作ってしまえ、というわけで実際に作ってしまった次第です。

ちなみに、Medolyの設計思想はKbMedia Playerにだいぶ影響を受けています。Windowsで散々使い続けてきたプレイヤーなので、その不満点を解消したい(歌詞をもっときちんと表示したい、年やアーティストで検索したい、細かい再生順序を制御したい、等)、という発想で作ってたりします。

あと、できることならKbMedia Player同様にプラグインで再生可能メディアを増やすような機能も作りたいと思ってたのですが、Androidの仕様ではちょっと無理そうなのでその辺は諦めてます。

2017-03-01

Medoly LRC Lyrics Plugin 1.0.0

Medoly LRC Lyrics Plugin

2017-02-28に、Medoly LRC Lyrics Pluginというプラグインをリリースしました。



本アプリは、LRCフォーマットの歌詞を取得するためのプラグインです。主な機能としては、LRC歌詞の検索、取得、保存、Medolyから自動的に歌詞を取得する機能等です。本アプリは「ViewLyricsOpenSercher」のソースを参考にして、ViewLyrics.com を検索しています。Minilyricsで使われてるサイトなので、検索結果はMinilyricsと同様となります。


検索画面より歌詞の検索をすることができます。Medoly本体より「歌詞検索」を実行することで、現在選択中の曲のタイトルとアーティストで検索することができます。検索した歌詞は、ファイルへの保存および「キャッシュ」への保存を行うことができます。

「キャッシュ」とは、検索条件に一致する歌詞をアプリ内に保存しておく機能で、Medolyから自動的に取得する際に使用されます。Androidのアプリキャッシュとは無関係です。キャッシュ画面から、現在保持してるキャッシュ内容を確認、ファイル保存、削除することができます。

Medolyから「歌詞取得」を実行すると、歌詞を自動的に取得し、Medoly上に表示します。また、プラグイン側で「実行イベント」を「メディア開始」または「再生開始」にすると、該当するタイミングで歌詞を自動的に取得しに行きます。

歌詞の自動取得は、まず最初にメディアのタイトルおよびアーティストに一致する検索条件で保存されたキャッシュが存在するか確認し、存在すればキャッシュの情報を使用します。もし存在しなければ、ViewLyricsのサイトを検索し、自動的にダウンロードします。この時、設定の「優先言語」(第1~第3)が設定されている場合、優先する言語を探索しに行きます。これにより、日本語歌詞なのにローマ字で書かれている歌詞等、期待する内容以外の歌詞を取得することを避けやすくなります。また、ダウンロードされた歌詞は自動的にキャッシュに保存します。

補足情報ですが、アプリ起動直後における自動取得は少し時間がかかります。これは、言語判定に用いられるプロファイル情報を読込むのに時間がかかるためです。歌詞の取得が早かったり遅かったりするのはそのためです。

本プラグインの主な動作は上記のようになります。なお、これらの動作は設定で変更することができます。 (詳細は割愛)

そんな感じで、このようなプラグインを実験的に作ってみました。ソースコードは公開しています。興味がある方は以下の場所にあるのでご自由に。

wa2c / Medoly LRC Lyrics Plugin — Bitbucket


なお、これは自分が勝手に作ったアプリなので、ある日唐突にサイトにアクセス出来なくなる、公開が停止される等のリスクがありますし、自分はその覚悟で作ってます。なので、その辺りを理解できる方のみご利用いただければと思います。

あと、このアプリはAndroid 4.4以降が必要です。古い端末サポートするのが正直面倒くさいので、動作環境を一気に引き上げてます。出来る事なら5.0以降にしたかったのですが、4.4のユーザがかなり多いので、流石に踏み止まりました。

Medoly Ver. 2.9.5, 2.9.6

2017-02-27 Ver. 2.9.5

- プロパティリスト、再生履歴ダイアログリストの見出しを固定
- プラグインメニューを折り畳みリストに変更
- 行内に複数の時間進行が混在する同期歌詞に対応
- 電話ステータス取得権限を削除
- オーディオフォーカスイベント、ヘッドセットイベント見直し
- 一部ダイアログ修正
- notification一部修正
- スクロール処理一部修正
- LRC読み取り処理修正
- その他いくつかの問題修正




プロパティリスト、再生履歴ダイアログリストの見出しを固定



プロパティタブのリストおよび再生履歴ダイアログの見出しにおいて、区切となる見出しが上部に固定されるようにしました。上部に固定される見出しは現在表示している内容に対する見出しで、下部にスクロールしていくと見出しが切り替わります。これは、 StickyListHeadersListView を用いています。



プラグインメニューを折り畳みリストに変更


プラグインのメニューを折り畳み式に変更しました。これは、メニュー内容増えた際にスクロールするのが煩わしかったからです。今後もいくつかプラグインを追加していきたいので、それに備えたという理由もあります。
このメニューの操作は次の通り。
  • アプリアイコン部をタップすると、プラグインが起動します。
  • チェックボックスの切替えをすると、イベントアクションの有効/無効を切り替えます。
  • アプリ名をタップすると、メニューの開閉をします。
  • どこでもいいので長押しすると、該当アプリに関するダイアログを表示します。




行内に複数の時間進行が混在する同期歌詞に対応


これは実にマニアックな機能です。例えば、タイムタグ歌詞において以下のように、1行の中に先頭から末尾に向かって増えていく時間が途中で逆転している歌詞が存在するとします。

[00:01:00]a[00:02:00]b[00:03:00]c[00:04:00]d[00:02:50]e[00:03:50]f[00:04:50]

従来の場合、「先頭から再生時間以下の最大時間までの範囲」の文字に対して再生中を示す色が塗られていました。そのため、2.5秒の再生地点ではa-eの範囲、3秒の再生地点では、a-cの文字が再生中となるという逆転が起こりました。今回の変更によって、3秒地点ではa-cとeが再生中となり、d(=00:04:00地点)は未再生扱いとなります。
該当する歌詞を見かけることは少ないと思いますが、実際にこういった歌詞は存在しますし、作れます。なお、タイムタグ仕様書では、「タイムタグの逆転はあってはならない」と定義しているので仕様範囲外なのですが、まぁ実装できるし、面白いので。LRCフォーマットでも問題ありません。
余談ですが、この対応には歌詞の読取処理を大きく変える必要がありました。その処理は他に比べて負荷がやや大きくなり、消費電力の増加が懸念されたため、その処理が適用されるのは時間の逆転がある行のみとなっています。他は従来通りです。



電話ステータス取得権限を削除


少し前、GoogleからAndroidアプリ開発者に向けて、「[要対応] Google Play デベロッパー ポリシー違反に関わる警告」というメールが届けられました。この内容は、「ユーザの個人情報を読み取る権限を要求するアプリは、Webとアプリ内にプライバシーポリシーを明記しなさい」といった要請が書かれていました。対応期限は3月15日まで。
本アプリでは以前まで、「android.intent.action.PHONE_STATE」(通話状態の読取)という権限を要求していました。この権限があると、電話の着信や発信の状態に加え、電話番号を読み取ることができるため、これが引っかかっていた模様です。
そもそもこの権限は、着信があった際に再生を停止させるためのものでした。私自身は、他人の電話番号なんかにこれっぽっちも興味はありません。そもそもこのアプリ、(今のところは)ネットワーク接続権限が無いですし。個人的には発信・着信はもっとゆるい権限で対応してほしいのですが…。
この要請への対応は2種類ありました。1つはきちんとプライバシーポリシーを掲げること、もう1つは、該当の権限を削除すること。私は後者を選択しました。理由としては、通話状態の検出は代用手段(オーディオフォーカスの切替)で対応できそうだったこと、こういう個人情報に結びつく権限は後々また面倒臭い対応を迫られると予想されること、プライバシーポリシーはアプリ上で目立つように表示しなくてはいけない(恐らく、起動時のダイアログ等)のが鬱陶しかったこと、等が挙げられます。
まぁついでに、せっかくなのでプライバシーポリシーも作成してみました。多分こんな感じで良いのではないかと思います。

余談ですが、このGoogleの方針に従うなら、3/15以降にほとんど更新されていない怪しいアプリが一気に消失するのではないかと思います。



オーディオフォーカスイベント、ヘッドセットイベント見直し


上記の電話ステータス取得権限にも関わるのですが、端末のイベント処理を少し見直しました。具体的には、オーディオフォーカスの変化、ヘッドセットの接続/切断時の動作です。

  • 通話状態の監視は廃止し、オーディオフォーカスの処理に統合しました。
  • ヘッドセットおよびBluetoothの接続/切断イベントを統合しました。
理由は、通話状態の監視を廃止しなければならなかったことと、設定が多すぎて、普通の人に把握が困難であると思われたためです。恐らく、この2種類があれば通常の用途では問題ないと思います。
ちなみに、これを直している最中に、再生開始時のオーディオフォーカス取得が実行されていなかったバグを見つけました。一体いつから…。



一部ダイアログ修正


ダイアログ周りを一部見直しました。あと、Aboutダイアログの中身を少し整理しました。



Notification一部修正


画面上の通知バーに表示される通知の内容で、Android 7.0でアイコンがずれていたのを直しました。これはとりあえずの応急処置です。次のバージョンで見直します。



スクロール処理一部修正


再生画面のプロパティリストで、スクロールがすぐ戻されてしまう問題等の修正です。



LRC読み取り処理修正


LRCフォーマットファイルにおいて、時間が正しく読み取れない場合がある問題を修正しました。一番最初に作ってからずっと手を加えてないはずなので、多分最初から存在するバグです。ちなみにこれは、HUAWEIのP9 Liteという端末に初期状態で保存されている「Dream_It_Possible」という曲に付属されているLRCファイルへの対応です。具体的に言うと、ミリ秒が無いタイムタグの読み取り処理を直してます。




歌詞の影の設定追加


すいません、これ書くの忘れてました。以前のバージョンで歌詞の文字をアウトライン文字に変更しましたが、以前の影表示タイプにも変更できるようにしました。これはユーザ様からの要望です。
メイン画面 - 表示タブ - 表示スタイルにある「外観」タブで切り替えることができます。




その他いくつかの問題修正


その他細かい部分を色々直してます。検索画面のストレージタブを開くとにトップまで戻されてしまう問題とか、プラグインのイベントが動いてなかった問題とか、その他諸々。



2017-03-01 Ver. 2.9.6

- アプリ終了時に状態が保存されない問題修正
- ストレージ書込み権限が取得できない問題修正




アプリ終了時に状態が保存されない問題修正


画面の「アプリ終了」よりアプリを停止すると、状態がリセットされてしまう問題を修正しました。これは、状態が保存がされていなかったのではなく、最後にクリアされた状態が保存されてしまったためです…。
  


ストレージ書込み権限が取得できない問題修正 


Android 7.0でストレージの書込み権限が取得できなくなっていた問題を修正しました。この問題は6.0では起こらなかったような…。


2017-01-26

総ダウンロード数が5000を超えました

1/24で、合計ダウンロード数が5000を超えました。



この数値は、総インストール数の合計値なので、複数端末でダウンロードしても同一アカウントの場合は1とカウントされるはずです。公開してから今までだいたい5000人以上がダウンロードしているということです。

この5000という数値は、Google Play上で区切りの数値となります。Google Playのアプリのページでは5000ダウンロードからは以下のように表示されるようになります。


増加率を見ると、驚くほど変化がありません。まぁ徐々に増えているという感じではあります。



ちなみに、開発者向けに公開されているアクティブなユーザ端末数(1ヶ月以内に使用されたインストール端末数)は931台です。この全員が使用しているのかどうかは分かりませんが、アプリをバージョンアップすると800台ぐらいはバージョンアップされていくので、実際にはそれぐらいが利用されているのではないかと思ってます。

そんなこんなで、ぼちぼち開発を続けていきたいと思いますので、今後ともよろしくお願いします。





2017-01-21

Medoly Ver. 2.9.0

Ver. 2.9.0

2017-1-21 Ver. 2.9.0
- 表示タブ内のコントロールバー追加
- ストレージアクセス処理変更(Android 7.0対応)
- 編集モードのサムネイルタップで再生/未再生切替え
- 外部ファイルのキュー追加がエラーとなる問題修正
- その他各種修正

表示タブ内のコントロールバー追加

表示タブ内に、コントロールバーを表示するようにしました。可能な操作は、再生コントロールバー(メイン画面最下部のバー)の内容です。

これは、レイアウト設定のチェックボックスをONにした上で、タブ内のボタンを表示状態する必要があります。表示タブのダブルタップまたは、ピンチアウト操作で表示タブを拡大した際、再生コントロールバーが非表示になると、自動的にタブ内に表示します。
これは、画面を最大化した際に再生コントロールボタンが非表示になってしまい、再生操作が行えなかったという問題に対応したものです。
また、コレに合わせて内部のクラス構成を色々弄ってます。もし以前と挙動が変わった部分があれば報告いただけると助かります。


ストレージアクセス処理変更(Android 7.0対応)

ストレージアクセス処理を見直しました。

ユーザストレージ(内蔵ストレージまたは外部ストレージ)のみアクセス可能で、その他にはアクセスできません。これは、最近の端末だとユーザが操作可能なストレージ以外にアクセスすると、エラーとなってファイル操作ができなくなる場合があるためです。
一部端末には、初期状態でユーザストレージ領域外にメディアが配置されているものがありますが(Huawei P9 Liteで、/system/media/Pre-loaded/Music フォルダに「Dream It Possible」という曲が置いてあるのを確認しました。ちなみに、LRCファイル付き。)、今回の変更でストレージからアクセスすることはできなくなります。こうした曲を再生した場合は、タグ情報の検索から取得するようにしてください。


編集モードのサムネイルタップで再生/未再生切替え

再生キューの編集モード時、サムネイルをタップすると、メディアの再生/未再生を切り替えられるようにしました。従来通り、ドラッグ&ドロップによる順序の変更やメディアの削除もできます。


外部ファイルのキュー追加がエラーとなる問題修正

他のアプリからメディアをMedolyに渡した場合、エラーとなる場合があった問題を修正しました。


その他各種修正

その他諸々修正しました。

  • 再生キュー完了時に通知が消せなくなる問題修正。
  • 表示タブのメニューをタップした際にタップ音が2重に鳴る問題修正。
  • 表示タブ内の文字をアウトライン文字に変更。
  • 検索画面でLoading...が表示される条件を、メディア100個以上→500個以上に変更。
  • 検索画面でメディアがない場合のメッセージを追加。
  • ファイル共有の動作一部変更。

2017-01-16

Android 7.0におけるストレージアクセス

現在、Android 7.0でMedolyを使用すると、ストレージのフォルダが一部見えなくなる問題があります。これは、Android 7.0においてセキュリティ上の関係か、ストレージのアクセス処理が一部変更になっているためのようです。
また併せて、プロパティから「開く」や「共有」が使用できなくなっている問題も発生しています。これはAndroid 7.0における同様の問題です。

現在対策を練っているところなので、 しばらくお待ち頂ければと思います。正直、Android のストレージアクセス処理はクソ面倒臭いのですが、個人的にもよく利用するため必ず対応します。ただ、一部制限が発生する可能性もありますので、その辺はご了承いただければと思います。

2017-01-01

Medoly 課題管理の公開

あけましておめでとうございます。
本年もよろしくお願いします。

唐突ですが、以下のページにMedolyの課題管理ページを公開しました。
ここには、課題、問題点、バグ報告、要望など、何かしら報告があった場合にご書き込んでいただけると助かります。
言語は日本語、英語何れでも構いません。


wa2c / medoly2 / 課題 - Bitbucket
https://bitbucket.org/wa2c/medoly2/issues


現在、ソースコードのリポジトリにBitbucketを利用しているので、そこにあるサービスをそのまま使用しています。bitbucketの利用には、アカウント登録が必要になります (Googleアカウントでもログインできたはず)。

ちなみに、ソースコードは公開されていないのでご了承ください…。

2016-12-27

Medoly Ver. 2.8.5


久々の更新となります。難しい更新を行っていたとかそういうわけでもなく、ただ単に他の作業をしていて更新が停滞しているだけです。


Ver. 2.8.5

2016-12-21 Ver. 2.8.5
- 歌詞表示をアウトライン文字に変更
- メディアの長さから再生中アクション実行時間を設定する機能追加
- ウィジットのレイアウト追加・変更
- 言語の変更設定追加
- タブの表示を保持するように変更
- メッセージ一部修正
- ヘッドセット接続時のみ再生を行う設定追加
- シャットダウン時にメディアが破損状態となる問題修正
- 歌詞スクロールが再生位置とずれる問題修正
- 1曲も存在しない場合に検索がエラーとなる問題修正


歌詞表示をアウトライン文字に変更



今まで、歌詞のテキストに影を表示していました。これは、歌詞のテキストが背景に表示されるアルバムアートの内容によって見えにくくならないようにするためのものでした。今回、この影をやめて、アウトライン文字(文字の周囲を線で囲んだ文字、囲い文字、袋文字とも呼ばれる)に変更しました。
変更理由…というか、そもそも3年前の一番最初の開発段階でアウトライン文字にする予定でした。ところが、やり方が分からず断念していたというのが本当のところです。最近、少し落ち着いたところで色々調べていると、MagicTextView というライブラリを見つけ、こちらを参考にしてアウトラインテキストを実装してみた次第です。

変更前

変更後


 

メディアの長さから再生中アクション実行時間を設定する機能追加


プラグインのイベントアクション(自動的に実行されるアクション)に「再生中」イベントというものがあります。これは、メディアをある程度の時間再生し続けると「再生中」であると判断し、イベントを実行します。これは、ザッピング再生や頭出し再生で逐一実行されてほしくないアクションを実行するためのものです。例えば、再生時にTwitterに自動投稿したり、Last.fmに再生中を通知をする、といった使い方を想定しています。
この「再生中」イベントを実行するための時間は、今まで固定時間でした。初期値は30秒です。ところが、これでは30秒未満の曲では実行されません。そこで、今回の変更で全体の再生時間の割合からイベントの実行時間を設定できるようにしました。例えば、4分の曲で50%に設定すると、2分間続けて再生した時点で「再生中」イベントを実行します。(なお、途中で停止した場合はリセットされます。)
加えて、再生終了時点でイベント未実行だった場合は強制的に実行するオプションを追加しています。


ウィジットのレイアウト追加・変更


ウィジェットのレイアウトを追加・変更しています。具体的に言うと、レイアウト構成を1つ追加(4番目)し、従来の1番目のレイアウトと3番目のレイアウトを交換しています。現在のレイアウトは以下の4種類です。全てサイズは可変(最小サイズ:2x1)のため、サイズを変更してご利用ください。

追加したレイアウトは、以下のようなテキストのみのウィジェット表示を想定した物です。(画面のサイズによってはこの通りの表示にならない可能性があります。)



レイアウトの交換については、(旧)3番目のレイアウトは他3つとは少し毛色の異なるレイアウトなので、特別扱いで先頭に持ってきています。



言語の変更設定追加


設定画面に[その他] > [言語] 設定を追加し、言語の変更が行えるようにしました。従来、言語設定はシステム環境の言語設定に応じて変更していましたが、手動で切り替えられるようにしました。
まぁ、今のところは日本語と英語しかありませんが。英語に関しては内容が非常にダメな感じですが
 

タブの表示を保持するように変更


アプリをバックグラウンドから再表示した際に、タブの表示(再生キュー、表示、プロパティ)を保持するようにしました。これはどちらかと言えば、保持する方法(起動時に切り替える方法)が分かった、と言った方が良いかもしれません。


メッセージ一部修正


メッセージ内容を一部修正しています。文言の見直しです。


ヘッドセット接続時のみ再生を行う設定追加


設定画面の[操作] > [操作] に「ヘッドセットのみ再生」を追加しています。これは、イヤホンやBluetoothが接続されていない場合、再生を開始させないようにするための設定です(メッセージが表示されます)。スピーカーから音を鳴らしたくない場合に使用します。


シャットダウン時にメディアが破損状態となる問題修正


従来、端末をシャットダウンした際に、選択中のメディアが破損状態になっていました。これは、シャットダウンの際に、何故か標準のメディアプレイヤーライブラリからエラーが返ってくるためです。何故このような挙動をするのかは知りません。
この対策として、シャットダウン時にシステムからブロードキャストされるシャットダウンメッセージを受信すると、アプリを強制終了する処理を加えました。


歌詞スクロールが再生位置とずれる問題修正


非同期歌詞メディアを再生して、表示タブでスクロール位置を強制的に変更した後、同期歌詞を再生した際に前回の非同期歌詞のスクロール位置がリセットされずに保持されてしまう問題がありました。
長らく謎だったこの原因を究明したところ、メディアが切り替わり、歌詞が切り替わる間に僅かなタイムラグが生じており、その間にスクロールが割り込むと、とリセットされたスクロール位置が現在のスクロール位置で上書きされてしまうために問題が発生していました。
処理の関係上これを変更することが難しかったので、現在選択中のメディア情報を歌詞側に保持しておき、相違があった場合にスクロール位置の設定を無効にするという処理を加えています。



1曲も存在しない場合に検索がエラーとなる問題修正


これは、メディアが1件も存在しない場合に検索画面でエラーが発生するという問題があったため、ちょっと修正しました。まぁ、メディアが1つも存在しない人間がこのアプリを使うか、という話ではあるのですが…。

2016-11-09

旅行中

大変私的な話で恐縮ですが、現在フランスを旅行中です。
色々見て回ってます。

2016-10-01

Medolyプラグインのソースコードを公開しました

本日、MedolyプラグインのソースコードをBitbucketに公開しました。


Medoly Last.fm Scrobbler Plugin

Medoly Twitter Plugin

Medoly Lyrics Scraper Plugin


ライセンスはMITです。

元々ソースは公開するつもりでいたのですが、インターフェース部分の見直しをしてから公開しようと思っていました。ところが、その見直しを今までズルズルと先延ばしにしていたため、こんなタイミングになってしまいました。

もし興味があればどうぞご参考ください。


ちなみに、Last.fmプラグインとTwitterプラグインは、APIキーが含まれているソースファイルが欠けた状態になっています。Token.java.rename ファイルをを Token.java にリネームするとビルドできると思いますが、APIキーが含まれていないため、このままでは動作しません。動かしたい場合は、別途自分でLast.fmやTwitterのサイトからAPIキーを取得してコードに埋め込む必要があります。

元々、APIキーが含まれるソースコードをどうやって公開したものかと悩んでいたのですが、結局こんなやり方になってしまいました。どなたか、もっと上手い方法があれば教えていただけると幸いです。そこまでしてAPIキーを非公開にしても、アプリが偽装されるぐらいなのでそこまで大した影響はないかと思っているのですが、念のためです。所詮、apkファイルを展開されて強引に見ようと思えば見られる代物ですしね。


Bitbacketの公開サイトに課題も書き込めるようになっているので、もし何かバグとかあれば報告していただけると助かります。

ちなみに、Medoly本体は公開しないのかと思われそうですが、内部的に色々見せたくない恥ずかしいコードもあるので、もうしばらく先になりそうです…。

2016-09-28

インストール端末数が1000を超えました



去る9/17に、アプリのインストール数が1000を超えました。このインストール数というのは、同時にインストールされている端末の数を示すため、1つのアカウントが複数の端末に同時にインストールしても、その分加算されます。アンインストールすると減算されます。恐らく、ずっと使われていない端末は破棄されたものと判定されて減算されていっている模様ですが、詳細は不明です。
この数値は表に出てこないので、普通の人が目にする機会はあまり無いかと思いますが、個人的には同時に1000端末にインストールされているということに結構ビックリしています。
ちなみに、今までの総インストール回数は4101と書かれた方の数字で、この数字はGoogle Playの画面に大まかに表示される値です。よくダウンロード数と言われてる値はこちらの値です。

ちなみに、最初のリリースから現在までのインストール数推移のグラフは以下のような感じになります。



これからも少しずつ開発を続けていきたいと思いますので、どうぞよろしくお願いします。


2016-10-01 追記 

9/29に、Googleより次のアナウンスがありました。



 
[アクティブなインストール端末数] という新しい指標を導入します。当面の間、この指標は、9 月 1 日まで遡ったデータに基づき、アプリの [統計情報] ページに表示されます。
年内に、現在のすべてのレポートで [現在のインストール数(端末数)] と [現在のインストール ユーザー数] はこの新しい指標に置き換えられます。置き換えられた指標の履歴データは、グラフと CSV 形式のダウンロードで引き続きご利用になれます。

インストール数の指標が変更される理由

[アクティブなインストール端末数] には、過去 30 日間に 1 回以上オンラインになった端末(アクティブな端末)のうち、アプリがインストールされている端末の数が表示されます。
アプリの [現在のインストール数(端末数)] と [現在のインストール ユーザー数] のデータには、最後にアクティブだったのが数か月前まで遡る端末も含まれていました。[アクティブなインストール端末数] に切り替えることで、過去 30 日間に使用された端末のみを対象として、アプリの最近のユーザー エンゲージメントを確認できるようになります。

指標への影響

[現在のインストール数(端末数)] と [現在のインストール ユーザー数] の方がアクティビティの期間が長かったため、アプリの [アクティブなインストール端末数] の方がデータの値は小さくなる見込みです。

というわけで、せっかく 1000を超えたインストール数ですが、標準の指標ではなくなり、値のサポート自体も終了してしまうそうです。今後は30日以内に動作した端末を基準とする「アクティブなインストール数」が標準となるそうです。ちなみに、Medolyの現在値は825となります。



また1000になった辺りで何かお知らせするかと思います。

2016-09-25

Medoly Ver. 2.8.0, 2.8.1, 2.8.2


Ver. 2.8.0



2016-08-22 Ver.2.8.0
- プラグイン通信データ変更に伴う修正
- 検索画面のレイアウト変更
- 文字列検索でスペース区切りをAND検索に変更
- 数値キーから再生番号を指定する昨日追加
- Bluetoothレイテンシの初期値を0に変更
- 歌詞の文字サイズ初期値及び上限を変更
- 起動時にレジュームされない問題修正
- SDカード書き込み権限でエラーが発生する問題修正
- その他修正



複数の値のタグに対応


メディアのタグは、一つのタグに複数の値を持つ場合があります。本バージョンで複数の値を持つタグに対応しました。この変更のため、内部的なデータ構造を大幅に見直しています。
対応とは、プロパティ情報への複数の値の表示、プラグインへのデータ送信等です。検索については、Android標準のデータベースを利用しているため、現状では残念ながら対応不可能です。
またこの変更に伴い、設定画面の[機能]カテゴリに、以下の2項目が追加されています。

[プロパティの分割]
特定の文字列で分割し、プロパティを複数の値として扱います。対象の文字は「;」、「/」、「,」、「&」、改行の5種類です。

[プロパティの結合]
複数のプロパティを特定の文字列で結合します。対象の文字は分割と同じです。

「プロパティの分割」と「プロパティの結合」を両方してした場合は、値を分割した後に結合が行われます。

プラグイン通信データ変更に伴う修正


複数の値のタグに対応した事に伴い、プラグインとの通信周りを大幅に見直しました。そのため、本バージョンより前にリリースされたバージョンのプラグインは使用する事ができなくなります。


検索画面のレイアウト変更


検索画面のレイアウトを変更し、検索ボタンを左側に移動させました。 


何故このような変更を加えたのかというと、リストに表示されるスクロールのつまみとの競合対策です。検索画面の内容が長くなると、画面の右側に素早くスクロールするための「つまみ」アイコンが表示されます。画面右端のタップは、このつまみの操作が優先されてしまうため、画面右端にあるボタンが押しにくくなるという問題がありました。
最近、使用する端末のOSをAndroid 6.0に変更したところ、つまみに反応するタップ範囲が拡大されたためか、右端ボタンが完全に押せなくなってしまいました。そのため、ボタンを全部左側に寄せるように変更しました。
従来の操作に慣れていた方には申し訳ありませんが、よろしくお願いします。


文字列検索でスペース区切りをAND検索に変更



検索画面のテキスト検索フォームにおいて、スペースで区切りがあるとAND検索となるようにしました(従来はただの部分一致検索でした)。


数値キーから再生番号を指定する昨日追加


物理キーボードを接続し、キーボードから数値を入力してEnterを押すと、対応する再生キュー番号のメディアを再生する機能を追加しました。入力は、すべての画面で有効です。
入力時、タイトル部分に入力文字が表示されます。Escを押すか、2秒経過すると元の表示に戻ります。

タイトルに表示される番号

Bluetoothレイテンシの初期値を0に変更


Medolyでは、Bluetooth機器で再生する場合にレイテンシを設定することで、メディア再生と歌詞の表示のズレを補正することができます。従来、このレイテンシの値は、220msが初期値にになっていました。この値は、SBCコーデックにおけるレイテンシの値に合わせてあります。
ところが最近、端末のOSをAndroid 6.0に変更したところ、内部で自動的にレイテンシが補正されている様子で、レイテンシを設定すると再生と歌詞の表示が逆にズレてしまう事象が発生しました。そのため、レイテンシの初期値を0に変更しました。

歌詞の文字サイズ初期値及び上限を変更


歌詞の文字サイズの初期値を24sp、最大値を50spに変更しました。タブレットで表示させることも想定した場合、従来の初期値と上限は少し小さいように感じたためです。

起動時にレジュームされない問題修正


起動時に再生位置が元に戻らない場合がある問題を 修正しました。

SDカード書き込み権限でエラーが発生する問題修正


SDカードの書き込み権限がエラーとなる場合があったため、権限取得の処理を一部変更しました。

その他修正


その他諸々のエラー等を修正しました。



Ver.2.8.1



2016-09-25 Ver. 2.8.1
- 端末によってループが正しく実行されない問題修正
- 通知の背景を修正



端末によってループが正しく実行されない問題修正


ループが正しく動作しない場合がある問題を修正しました。これは、とあるループ条件が成立しない場合に発生し、端末によって条件が成立しない場合があることを確認しました。そのため、条件を外してループが動作するようにしました。


通知の背景を修正 


通知背景が白くなってしまい、文字が読めなくなる問題を修正しました。
公開の少し前にSDKのバージョンアップをしたのですが、それが影響してしまったようです。
ちなみに、新しいAndroidは基本的に背景が白色なので、それに合わせた方が良いのでしょうが、その辺は今後のバージョンで対応します。




[追加] Ver.2.8.2


頻繁な修正で申し訳ありません…。


2016-09-27 Ver. 2.8.2
- 新規インストール時に各種権限を取得するように変更
- Android 4.4において、設定画面で落ちる問題修正
- 一部設定の変更で落ちる問題修正


新規インストール時に各種権限を取得するように変更





実は、Ver.2.8.0 のリリースにおいて、ビルドターゲットのSDKバージョンをうっかり変更してしまったのですが、その影響でAndroid 6.0以降において新しく追加された権限の取得処理を、新たに追加しなくてはいけなくなりました。
これは、いくつかの権限についてユーザの承認を得るというもので、起動時に権限を要求するダイアログが表示されるようになります。ちなみに、既にインストール済の状態でバージョンアップされた方はそのまま利用できるのですが、アプリを新規にインストールすると権限がクリアされてしまうため、権限が必要になります。権限の承認が拒否されると、そのままプログラムを終了します。
具体的な権限は、外部ストレージへの読み書きと、電話の状態へのアクセスの2つです。外部ストレージはメディアファイルの読み込みや、プレイリストファイルの書き出し等に必要となるため、本アプリには絶対に必要な権限です。電話の状態へのアクセスは、電話がかかってきた時に再生を停止する機能に使用するので範囲は限定的なのですが、別々に作るのが面倒くさいので、起動時に一括で要求しています。
ちなみに、 最初はSDKバージョンを元に戻そうと思ったのですが、一度新しいバージョンにしてアプリを登録してしまうと、ダウングレードはできないようで…。迂闊にバージョン番号なんて弄るものではないな、と思い知りました。まぁやってしまったものは仕方ない、という事で、Android 6.0から追加された新しい権限取得の処理を追加しました。
ちなみに、Android 6.0未満の機種には影響ありません。

Android 4.4において、設定画面で落ちる問題修正


Android 4.4(もしくは、それ以下)において、設定画面で落ちる問題が発生していたため、修正しました。
これは、複数選択リストの MultiSelectListPreference において、初期値
 ( defaultValue )を指定していなかったため、画面構築時にInflateException が発生してクラッシュするというものです。Android 5.0以降は問題ないようです。ダミーの空の初期値を設定して対応しています。

一部設定の変更で落ちる問題修正


これは、設定変更時に変更をプレイヤーに通知する処理が入ってる一部設定項目で問題が起こっていました。プレイヤーにIntentで変更を通知する際に、パッケージ名を指定していないと、「Service Intent must be explicit」というエラーと共にアプリが落ちるという事象です。
ちなみにこれは、SDKバージョンを不用意に変更してしまった影響です…。






Medoly Ver. 2.8.0, 2.8.1


Ver. 2.8.0



2016-08-22 Ver.2.8.0
- プラグイン通信データ変更に伴う修正
- 検索画面のレイアウト変更
- 文字列検索でスペース区切りをAND検索に変更
- 数値キーから再生番号を指定する昨日追加
- Bluetoothレイテンシの初期値を0に変更
- 歌詞の文字サイズ初期値及び上限を変更
- 起動時にレジュームされない問題修正
- SDカード書き込み権限でエラーが発生する問題修正
- その他修正



複数の値のタグに対応


メディアのタグは、一つのタグに複数の値を持つ場合があります。本バージョンで複数の値を持つタグに対応しました。この変更のため、内部的なデータ構造を大幅に見直しています。
対応とは、プロパティ情報への複数の値の表示、プラグインへのデータ送信等です。検索については、Android標準のデータベースを利用しているため、現状では残念ながら対応不可能です。
またこの変更に伴い、設定画面の[昨日]カテゴリに、以下の2項目が追加されています。

[プロパティの分割]
特定の文字列で分割し、プロパティを複数の値として扱います。対象の文字は「;」、「/」、「,」、「&」、改行の5種類です。

[プロパティの結合]
複数のプロパティを特定の文字列で結合します。対象の文字は分割と同じです。

「プロパティの分割」と「プロパティの結合」を両方してした場合は、値を分割した後に結合が行われます。

プラグイン通信データ変更に伴う修正


複数の値のタグに対応した事に伴い、プラグインとの通信周りを大幅に見直しました。そのため、本バージョンより前にリリースされたバージョンのプラグインは使用する事ができなくなります。


検索画面のレイアウト変更


検索画面のレイアウトを変更し、検索ボタンを左側に移動させました。 


何故このような変更を加えたのかというと、リストに表示されるスクロールのつまみとの競合対策です。検索画面の内容が長くなると、画面の右側に素早くスクロールするための「つまみ」アイコンが表示されます。画面右端のタップは、このつまみの操作が優先されてしまうため、画面右端にあるボタンが押しにくくなるという問題がありました。
最近、使用する端末のOSをAndroid 6.0に変更したところ、つまみに反応するタップ範囲が拡大されたためか、右端ボタンが完全に押せなくなってしまいました。そのため、ボタンを全部左側に寄せるように変更しました。
従来の操作に慣れていた方には申し訳ありませんが、よろしくお願いします。


文字列検索でスペース区切りをAND検索に変更



検索画面のテキスト検索フォームにおいて、スペースで区切りがあるとAND検索となるようにしました(従来はただの部分一致検索でした)。


数値キーから再生番号を指定する昨日追加


物理キーボードを接続し、キーボードから数値を入力してEnterを押すと、対応する再生キュー番号のメディアを再生する機能を追加しました。入力は、すべての画面で有効です。
入力時、タイトル部分に入力文字が表示されます。Escを押すか、2秒経過すると元の表示に戻ります。

タイトルに表示される番号

Bluetoothレイテンシの初期値を0に変更


Medolyでは、Bluetooth機器で再生する場合にレイテンシを設定することで、メディア再生と歌詞の表示のズレを補正することができます。従来、このレイテンシの値は、220msが初期値にになっていました。この値は、SBCコーデックにおけるレイテンシの値に合わせてあります。
ところが最近、端末のOSをAndroid 6.0に変更したところ、内部で自動的にレイテンシが補正されている様子で、レイテンシを設定すると再生と歌詞の表示が逆にズレてしまう事象が発生しました。そのため、レイテンシの初期値を0に変更しました。

歌詞の文字サイズ初期値及び上限を変更


歌詞の文字サイズの初期値を24sp、最大値を50spに変更しました。タブレットで表示させることも想定した場合、従来の初期値と上限は少し小さいように感じたためです。

起動時にレジュームされない問題修正


起動時に再生位置が元に戻らない場合がある問題を 修正しました。

SDカード書き込み権限でエラーが発生する問題修正


SDカードの書き込み権限がエラーとなる場合があったため、権限取得の処理を一部変更しました。

その他修正


その他諸々のエラー等を修正しました。



Ver.2.8.1



2016-09-25 Ver. 2.8.1
- 端末によってループが正しく実行されない問題修正
- 通知の背景を修正



端末によってループが正しく実行されない問題修正


ループが正しく動作しない場合がある問題を修正しました。これは、とあるループ条件が成立しない場合に発生し、端末によって条件が成立しない場合があることを確認しました。そのため、条件を外してループが動作するようにしました。


通知の背景を修正 


通知背景が白くなってしまい、文字が読めなくなる問題を修正しました。
公開の少し前にSDKのバージョンアップをしたのですが、それが影響してしまったようです。
ちなみに、新しいAndroidは基本的に背景が白色なので、それに合わせた方が良いのでしょうが、その辺は今後のバージョンで対応します。

2016-08-23

Medoly Ver. 2.7.5

久しぶりの更新です。仕事や生活やイース8が忙しくて少し開発から離れてしまっていたのですが、少し開発に時間を戻していきたいと思います。


2016-08-22 Ver.2.7.5
- 出力デバイスの設定画面変更
- 設定画面に説明を追加
- 設定が保存されない問題修正


出力デバイスの設定画面変更




出力デバイスダイアログからレイテンシの設定ボタンを削除し、デバイス別ダイアログを開くボタンを追加しました。 このダイアログでは、表示上のデバイス名変更、自動再生の抑止チェック、レイテンシの設定があります。

デバイス名の設定は現在のところ、出力デバイスリストの表示上の名前が変わるだけです。
レイテンシの設定は従来と同様、デバイス別の再生遅延を設定し、同期歌詞の表示誤差を補正します。(再生遅延その物が変わるわけではありません)
そして今回、新たに「自動再生を抑止」の設定を追加しました。世の中にある一部のBluetoothデバイスは、接続すると勝手に再生開始命令を送ってきます。これにチェックを入れることで、この再生命令を無視するようになります。この設定は、接続後最初に送られてくる再生命令を無視する動作をしますので、自動的な再生を行わないデバイスでここにチェックを入れると、最初の再生操作が無視されるのでご注意ください。(ただし、Android画面上からの再生操作はこの設定を無視します。)



設定画面に説明を追加


設定画面の各項目に説明を追加しました。何となく、分かりやすくしたつもりです。


設定が保存されない問題修正


各種設定が保存されない場合がある問題を修正しました。
これは、以前のバージョンアップで設定の保存方法を大幅に変更しており、その際に設定保存のタイミングを調整した結果、アプリが途中で中断した際に長時間設定が保存されない場合が発生していました。設定保存のタイミングを調整して、細かく設定が保存されるように変更しました。


2016-05-16

Medoly Ver. 2.7.0, 2.7.1

2016-05-09 Ver. 2.7.0
- パラメータ保存機能追加
- 設定の保存処理を全体的に変更
- 表示タブの画面保持ボタンを表示スタイルボタンに変更
- 検索画面でフォルダ階層を戻った際に先頭に戻らないように変更
- Bluetoothで再生時間が正しく表示されない問題修正
- 共有メディアの生成キュー追加でエラーとなる問題修正
- 非同期歌詞をループさせるとスクロールが追従しない問題修正
その他諸々


2016-05-10 Ver. 2.7.1
- Android 4.2以前の機種でエラーが発生する問題を修正しました
- プレイリストが存在しない場合のエラーを修正しました


Ver. 2.7.0


パラメータ保存機能追加


今回追加したこの機能は、現在の再生パラメータを保存し、次回再生時に同じパラメータを適用するための機能です。再生パラメータとは以下のものを指します。
  • ループ種別(ループ無し/単体ループ/区間ループ)
  • ループ回数
  • 区間ループ位置(サンプリング位置)
  • アプリ音量(0~1.0)
  • アルバムアート表示状態(ON/OFF)
  • 歌詞表示状態(ON/OFF)
  • 歌詞同期状態(ON/OFF)
  • 歌詞オフセット(ms)
  • 歌詞サイズ(sp)
  • 表示スタイル(レイアウト、外観)
  • プラグインイベント状態(ON/OFF)
パラメータ保存機能では、これらの状態を保存しておくことができます。具体的には、以下のような利用を想定しています。

  • 区間ループの位置を保存する。
  • 音量の大きい曲の音量を抑える(音量を高める設定は、現在のところできません…)
  • 同期歌詞のズレを調整する
  • 特定のフォルダの曲に対し、Last.fmへの通知を行わないようにする
[設定方法]

パラメータを保存する最小の手順は以下の通りです。
  1. 曲を選択
  2. プロパティタブメニューの「パラメータ保存」を選択
  3. 「対象パラメータ」の項目タップし、保存対象となるパラメータにチェックを入れる
  4.  「OK」ボタンを押す。


パラメータ保存ダイアログ

パラメータ保存ダイアログでは、保存対象パラメータの選択と、パラメータの適用条件を設定します。
「対象パラメータ」は、保存対象となるパラメータです。現在設定されている値が保存されます(この画面でパラメータを変更することはできません)。
「プロパティ条件」は、このパラメータを適用する条件となるパラメータの値です。ここに加えられた全ての条件に一致するメディアに対して、自動的にパラメータが適用されます。初期値では、現在選択されているメディアのフォルダとファイル名が入力されています。例えばここで「アルバム」プロパティを対象にすれば、そのアルバム全てに同じパラメータが適用されることになります。
「追加」ボタンで条件の追加、「削除」ボタンで条件の削除ができます。また、条件をタップするとダイアログから条件の編集を行うことができます。

プロパティ条件ダイアログ
プロパティ条件ダイアログからは、プロパティの条件を設定することができます。プロパティの種別と、その値を入力しします。「一致条件」は「部分一致」「前方一致」「後方一致」「完全一致」「正規表現」から選択できます(動作の違いは名称の通りなので、詳細は省略します。正規表現はJavaの動作と同一です)。「あいまい一致」は、文字列を補正してある程度の相違を吸収します。どの程度補正されるかの詳細はどこか別の場所で説明するかもしれません。「否定一致」の場合は、このプロパティ条件に一致しない場合に条件が成立するようになります。

なお、こうして保存されたパラメータは、メイン画面右上のメニューから「パラメータ」を選択すると一覧表示することができます。

パラメータ一覧ダイアログ


この一覧では、現在適用対象の保存パラメータがハイライト表示されます。パラメータは複数同時に適用されることはありません(今のところは)。このリストは上の方が優先されるため、同一の条件のパラメータが複数存在した場合、上の方が優先されます。リスト左側のつまみで順序を変更することができます。つまみを横方向に動かすと項目が削除されます。
項目をタップすると、適用するパラメータを変更することができます。「編集」ボタンを押すとダイアログが開き、パラメータの条件を変更することができます(チェック項目は変更できません) 。

[適用パラメータの状態]

パラメータが適用された状態では、適用中パラメータに関連するアイコンや文字列等やが緑色に変わります。例えば、「アルバムアート表示状態がON」の状態となるパラメータが適用されている場合、メイン画面のアイコンが緑色になります。

アルバムアート表示ONのパラメータ適用中
この緑色が、パラメータ適用中であることを示します。この状態でアルバムアートの表示状態を切り替えると、現在の状態が上書きされます(パラメータ適用状態が解除されます)。

そんな感じで、パラメータ機能を簡単に解説してみましたが、思ってた以上に複雑な機能になってしまいました。本来これは、区間ループの保存をするための機能のみを持たせる予定だったのですが、構想が膨らんでこんな過剰な機能になってしまいました。ただ、汎用性に優れている分、応用が利きやすく、例えば将来的にイコライザの機能を持たせた場合、「○○のジャンルではこの音、○○のアルバムではこの音の設定にする」という感じの使い方もできるはずです。
現状、同時に一つのパラメータ設定しか適用されないことは課題として認識しています。 複数同時に適用される場面も想定されるはずですが、その辺を作るのが大変だったので妥協しているところです。ユーザ様からの要望があれば、同時に複数適用する処理も入れるかもしれません。ただ、機能が複雑すぎて誰も使わなかったらどうしよう…と思ってるのが正直なところです。
あと、作るの凄く大変だったので、とんでもなく時間かかりました…。
 

設定の保存処理を全体的に変更


 パラメータ保存機能を追加したことに伴い、パラメータの保持方法を大幅に変更しています。というか、全くの別物になっています(おかげでとんでもなく時間が かかりましたが…)。従来の設定値を新しい保存方法に移行させるための変換処理が行われています。なお、設定のエクスポート/インポートにも対応していま すが、旧設定をインポートした際も同様の変換処理が行われるため、一応インポートは出来るはずです。ただ、あまり真面目に検証していないため、出来れば今 回のバージョンで設定を再度エクスポートしておいていただけると助かります。
 

表示タブの画面保持ボタンを表示スタイルボタンに変更


表示タブに初期バージョンからずっと鎮座していた「画面の点灯」切替えボタンですが、今回このボタンを表示スタイル設定ダイアログを表示するためのボタンに変更しました。理由は、「そもそもこれ独立したボタンにするほど頻繁に使わないよね」っていう至極真っ当な感覚です。
この画面点灯の設定は、表示スタイルダイアログの中に組み込んでしまいました(それに伴い、ダイアログの内容が少し変更されています)。

 

検索画面でフォルダ階層を戻った際に先頭に戻らないように変更


これはずっと気になっていたのですが、以前は検索画面のストレージタブで、フォルダの階層を上に上がった際に、一覧の先頭まで戻ってしまっていました。そのため、ファイルやフォルダが大量に存在している場合に「フォルダを開く→一旦上位フォルダに戻る」という操作を行うと、一々上に戻されてしまって非常に苦痛でした。
そのため、フォルダの上位階層に移動した場合は、移動前のフォルダが画面の中央の位置に来る座標までスクロールさせるようにしました。これで比較的操作しやすくなったと思います。


Bluetoothで再生時間が正しく表示されない問題修正


AVRCPで再生タイトル等を表示させる事の出来るBluetooth機器、具体的にはカーナビやAVアンプ等になりますが、これらにおいて音楽の再生時間が正しく追従しないという問題がありましたので、そのバグ修正です。
ちなみに、Bluetooth機器に表示される現在の再生時間は随時送信しているわけではなく、特定のタイミング(シーク時など)で再生時間を送信し、あとは機器側が勝手にカウントアップしていくようになっています。


共有メディアの生成キュー追加でエラーとなる問題修正


これはユーザ様からの報告です。
外部のアプリから共有されたメディアの再生キュー登録に失敗する問題がありました。これは、いつの間にか紛れ込んだバグによるものでした。


非同期歌詞をループさせるとスクロールが追従しない問題修正


非同期歌詞をループさせた際、ループ位置が先頭に戻らない問題があったため、修正しました。



Ver. 2.7.1



Android 4.2以前の機種でエラーが発生する問題を修正しました



今回のパラメータ機能の追加に伴い、内部的な処理を大きく見直しました。その際、データベース読込み処理にも手を加えたのですが、その変更の一つがちょっと不味かったため、Android 4.2以前のAndroidでDB読込ができなくなるという問題が発生していました。

原因を簡単に説明します。AndroidのAPIに引数として与えられたURIがどのURIに属するかを判定するための「UriMatcher」というクラスがあります。ここには事前にURIのパスを登録する必要があります。このパスの先頭に「/」は不要なのですが、Android 4.4以降だと先頭に「/」が入っても自動的に省いてくれているようです。ところがそれより前のAndroidでは、「/」が挿入されているとURIが一致しなくなり、URI不一致エラーとなってしまいました。
今回、開発でAndroid 4.4、5.1、6.0で確認はしていたのですが、それより前のAndroidでの動作を確認していなかったため、発見が遅れてしまいました。


プレイリストが存在しない場合のエラーを修正しました


プレイリストが存在しない場合に、再生キューメニューの「プレイリスト操作」を開こうとするとエラーメッセージが表示されていたため、修正しました。まぁ、修正しても空のダイアログが表示されるだけなのですが…。

2016-05-15

Medoly Ver. 2.6.5, 2.6.6

2016-01-31 Ver. 2.6.5
- 再生順序コントロール全体を変更
- ループコントロール変更
- 歌詞の空白表示タイミング変更
- Android 5.0以降でキー操作が正しく行われない問題修正
- 再生中歌詞の背景がずれる問題修正

2016-02-07 Ver. 2.6.6
- Android 6.0でポップアップが正しく表示されない問題修正
- Bluetooth非搭載機種でエラーとなる問題修正



Ver. 2.6.5



再生順序コントロール全体を変更



変更前

変更後


メイン画面左下のボタンを押して表示される再生順序コントロールポップアップメニューの内容を整理し、大きく変更しました。具体的な変更は以下の通り。

  •  「再生キュー完了」を「再生完了」に変更、メニュー名を一部変更しました。
    メニュー再整理です。「単体停止」のメニューを追加するためのグループ名変更です。
  •  「単体再生」を「ループ」に変更しました。
    ループのみでグループ化しました。これは、ループカウンタを追加するための変更です。
  • 一曲毎に停止する 設定を「再生完了」に移動しました。
    グループの変更です。ループ処理周りの変更のためです。
  • 区間ループ設定を削除しました(ループコントロールに移動しました)。
    区間ループの設定を別に独立させました。従来のコントロールは操作がし辛かったためです。
  • ループ回数の設定を追加しました。
    ループ回数設定を追加しました。全体ループ、区間ループ両方のループにおいて有効です。ループ回数が設定値を超えると、それ以上ループせず最後まで再生され、次の曲に移動します。ゲームの曲を1回ループさせて順次させていくとか、ヒアリング学習において数回ずつループして流すような使い方を想定しています。
    なお、ループ回数は、メイン画面上に表示され、ループ回数を超えた際に文字色が青く表示されます。
  • 「R:再開」を「F:埋める」に変更しました。
    これは、以前から分かりにくいなぁと思っていたので、今回に合わせて変更しました。頭の「F」は「Fill」だと思ってください。ちなみに、前回の「R」は「Recover」でした。
ちなみに、名前やグループが変更されたものについて挙動自体は変わりません。


ループコントロール変更


区間ループコントロール


再生順序コントロールに存在した区間ループコントロールを独立させました。再生順序コントロールで「区間ループ」を選択すると、シークバーの上に一段バーが増えます。
三角形とA/Bが書かれているボタンを押すと、現在の再生位置を区間ループ開始位置/終了位置として設定します。ちなみに、このボタンを長押しすると初期位置に戻ります。初期位置は通常、メディアの先頭/末尾になりますが、LOOPSTART/LOOPLENGTHが設定されたメディアはそれに合わせた位置になります。
両端にあるボタンにはループ位置(ms)を示す時間が書かれていますが、これを押すと、その時間を微調整するポップアップが表示されます。前後に10ms/1s(1000ms)調整できるボタンと、直接ミリ秒の時間を入力できる枠がありますので、お好みで調整してください。ポップアップを閉じた時点で確定されます。ちなみに隠し機能…というわけではなく単に分かりにくいだけですが、ポップアップのテキスト入力エリアを長押しすると、調整時間がリセットされ現在値に戻ります。


歌詞の空白表示タイミング変更


以前、同期歌詞において歌詞の空白行を歌詞の一部とするように変更しましたが、空白行における進行タイミングを少し調整しました。空白行の進行が少し前倒しになってます。



Android 5.0以降でキー操作が正しく行われない問題修正


Androd 5.0以降で、ヘッドセットのボタン等を初めとする各種操作が正しく処理できていなかったため、修正しました。



再生中歌詞の背景がずれる問題修正


これは少し細かくて難しい話です。
以前は、同期歌詞において複数行が同時にアクティブとなっている状態において、アクティブ行の背景のサイズは、後からアクティブになった行の背景のサイズに強制的に変更されていました。例えば、1行目が2行で表示、2行目が1行で表示されている歌詞において、両方がアクティブになると、1行目の背景が1行のサイズに縮小されてしまう事象が発生していました。
これは以前から気付いていたのですが、影響も少なく原因もよく分からなかったので放置していました。ところが、Webで色々調べ物していると、たまたま原因となる情報が出てきたのでこの原因が分かりました。
Y.A.M の 雑記帳: Android Drawable Mutations
つまるところ、Androidのレンダリング処理の特性の問題です。同一リソースから生成すると通常は共有されてしまうconstant stateを、個別に与えてやることで、別々のサイズを保有できるようになる、という理屈でした。




Ver. 2.6.6



Android 6.0でポップアップが正しく表示されない問題修正


Android 6.0より、ポップアップの座標計算が変更されたらしく、Androidでポップアップの表示位置がとんでもない場所に表示され、まともに操作できない状況になっていました。座標計算処理を修正し、正しい位置に表示されるようにしました。



Bluetooth非搭載機種でエラーとなる問題修正


Bluetoothが非搭載の機種において、最初の起動の際にBluetooth関連の設定を初期化するところでエラーとなり、起動できなくなっていましたので、その修正です。久々にエミュレータでデバッグを行ったところ、アプリの起動に失敗してしまったことで気付きました。




Medoly Ver. 2.6.0

2015-12-25 Ver. 2.6.0
- デバイス切断・接続イベント処理見直し、各種問題修正
- スピーカー出力時のイベントを追加
- プロパティタブのスクロール位置を保存する処理追加
- プロパティタブの情報が多重登録される問題修正


 Ver. 2.6.0



デバイス切断・接続イベント処理見直し、各種問題修正


Bluetoothと接続/切断、イヤホンの接続/切断を行った際に、再生を停止する/音量を下げる等の処理を行うことができますが、この辺の処理が正しく機能していなかったため、修正しました。
特に、音量が正しく戻らず音量が下がった状態で確定してしまう問題があったため、その修正が主です。

 

スピーカー出力時のイベントを追加


元々、Bluetoothの切断イベントやイヤホンの切断イベントで再生停止等を行うことができましたが、どうにもこのイベントが受け取れず、再生がそのまま継続してしまう場合がある、という問題がありました。 これの原因がよく分かっていないのですが、イベントが受け取れない以上は、こちらで対策の打ちようがありません。
そのため、「音声が外部出力に切り替わるタイミング」イベントでも同様の処理を行えるようにしました。世の中にある数多くのプレイヤーはこのイベントを使う場合が多いようですね。Medolyでは現状、両方のイベントで動作を設定することができます。ちょっとややこしいですが、デフォルトの状態では再生停止が設定されているので、特に問題がなければそのままで良いです。




プロパティタブのスクロール位置を保存する処理追加


プロパティタブのリストのスクロールの位置を保存するようにしました。 メディアが切り替わったり、アプリを再起動した際に、一々先頭に戻るのが煩わしかったからです。


プロパティタブの情報が多重登録される問題修正


プロパティタブの中に情報が多重に登録されてしまうバグがあったため、その修正です。タブの処理周りを修正していたため、その時に少し処理を間違っていました。

Medoly Ver. 2.5.5, 2.5.6, 2.5.7

2015-12-19 Ver. 2.5.5
- シークバーまたは早送り・巻戻しボタンの上下スライドによるシーク量調整機能追加
- ドロワーメニューの内容が表示されない問題を修正
- プロパティ読込でエラーとなる問題修正
- タグが読込まれない場合がある問題修正

2015-12-19 Ver. 2.5.6, 2.5.7
- シーク処理の問題を修正


Ver. 2.5.5


シークバーまたは早送り・巻戻しボタンの上下スライドによるシーク量調整機能追加


このバージョンより、シークバーをタップした際に上下に三角形のアイコンが表示されます。シークバーを押したまま、タップした指を上または下にスライドさせると、シークバーの移動量が調整できます。上方向で移動量が少なく、下方向で移動量が大きくなります。シークバーの移動を微調整したい場合や、シークバーの横が長すぎて一気に移動させたい場合等にご利用ください。iPhoneにも同様の機能があるそうですが(向きは逆らしいですが)、使った事ないのでよく知りません。
なお、早送り/巻戻しボタンも同様に、上方向で速度減、下方向で速度増となります。


ドロワーメニューの内容が表示されない問題を修正


ドロワーメニューの内容が、特定のタイミングで表示されない場合があるバグを修正しました。


プロパティ読込でエラーとなる問題修正


メディアのプロパティが正しく読込まれず、エラーとなる問題を修正しました。


タグが読込まれない場合がある問題修正


タグが正しく読込まれない場合がある問題を修正しました。


Ver. 2.5.6, 2.5.7


シーク処理の問題を修正


追加したシークバーの上下方向の処理で、エラーとなる場合や正しく処理が行われない場合がある問題を修正しました。修正は2回入って、2回バージョンが上がってます。

Medoly Ver. 2.5.0, 2.5.1

2015-12-04 Ver. 2.5.0
- ドロワーメニューにプレイリスト追加
- 歌詞の空白の取り扱い変更
- 内蔵歌詞読み込み処理修正
- MP3の文字コード判定処理修正
- スクロール処理調整
- プロパティ情報修正
他修正

2015-12-08 Ver. 2.5.1
- JoyHackフォーマット対応
- UNSYNCED LYRICSフィールド対応


Ver. 2.5.0



ドロワーメニューにプレイリスト追加


Ver. 2.4.5でプラグイン向けに追加したドロワーメニューですが、ここにさらにプラグイン選択メニューを追加しました。プレイリスト/プラグインの切替えは上部のタブから行います。
現状でもプレイリストは再生キューメニューの「プレイリスト操作」から選択できていました。ここに更に、ドロワーメニューからプレイリストを選択できるようにした理由ですが、ユーザビリティ上の理由によるものです。
従来は、「再生キュー選択→再生キューメニュー→プレイリスト操作→プレイリストにチェック→開く」という流れの操作を行う必要がありましたが、今回は「ドロワーメニュー開く→プレイリスト→プレイリスト選択」という簡易な操作になります。また、初期設定ではプレイリストを選択した時点で再生キューが更新され、楽曲の再生を開始します。これによって「プレイリストを切り替えて音楽を聞く」という操作が極めて簡易になります。
また、以前も書きましたが私は車のダッシュボードに携帯のクレードルを置いて、そこで操作を行うようにしています。そういう状況では、簡単な操作でプレイリストを切り替えられるというのは、非常に重要な要素です。実際、これを追加したことで再生キューの入れ替えが簡単になり、長距離ドライブも苦にならなくなった、という個人的に極めて高い実効性(?)を示しています。



歌詞の空白の取り扱い変更



同期歌詞において、今までは単純にテキストの行の頭にタイムタグが存在していたらそれは歌詞の行、それ以外は歌詞の行ではない、という判定をしていました。ところが、同期歌詞においては単純な空行を歌詞の空行として扱うことを期待している場合があります。その場合、当然本来期待されている空行が詰まってしまい。 文字の詰まった見辛い歌詞表示となってしまいます。そんなわけで、単純な空行を歌詞の空行として扱うようにしてみました。
 …などと簡単に書いていますが、 実はこれ、単純に空行を歌詞の一部として扱うだけでは済みませんでした。行単位の同期歌詞は別に何の問題もありません。問題は文字単位の同期歌詞です。通常は、単純に最後に再生された歌詞行の末尾の時間を空行の頭に割り当てれば良いです。ただ、文字単位の同期歌詞においては、前回の行が進行中に次の行に移動し、複数行が同時に進行する状態があり得ます。その間に空行が挟まった場合、通常と異なる処理が必要になってきます。まぁ色々割愛しますが、思った以上に面倒臭かったです、これ。



内蔵歌詞読み込み処理修正


 ユーザ様より、読み取れない内蔵歌詞があるとのご意見をいただきましたので、それに合わせて修正してみました。具体的に言うと、 foobar2000のプラグインで編集した歌詞とのことでした。この編集によって、MP3に通常の「USLT」タグではなく、「UNSYNCEDLYRICS」というタグに歌詞が書込まれた状態となっていた様です。ここで終わったと思ったのですが、実は終わっていませんでした…。次のバージョンへ続く。



MP3の文字コード判定処理修正


MP3が文字化けするというユーザ様の報告があったため、文字コード判定を修正しました。
個人的なMP3の文字コードについての文句は、この辺をどうぞ。
この変更によって、UTF-16とShift_JISが混在しているタグでも何とか読み取れるようになっています。内部的な処理としては、文字コードが「ISO-8859-1」に設定されたタグを全部掻き集めて、タグの内容を一つのバイト配列に固めて、自動文字コード判定ライブラリに送り込むという力業を行っています。ユーザ様のタグは読み取れたそうですが、正直、これ以上はお手上げです。
ちなみに、 文字コード混在タグの場合、プロパティの文字コードには「UTF-16(改行)Shift_JIS」みたいな感じで2種類の文字コードが入っています。
なお、そうなっているMP3は全部UTF-16に置換える努力をした方がいいです。ここまで頑張ってタグを読み取ってくれるアプリばかりではないゆえ…。



スクロール処理調整



再生キューのスクロールの処理を少し調整しました。
画面の表示タイミングで自動スクロールが実行されないなどの問題があったのですが、タイミングを調整して実行されやすくしました。これを確実にスクロールさせる方法がよく分からない…。



プロパティ情報修正


プロパティタブの中に表示する情報を少し変更しています。著作権タグに対応しました。



Ver. 2.5.1



JoyHackフォーマット対応


JoyHackというのは、 カラオケを行うためのフリーソフト及びそのシステムです。「女医ハック」という名前の方が通りが良いようです。カラオケJoysoundのHyperJoy システムを利用していたためにそういう名前がついています。昔はカラオケに入る曲も少なく、自分の歌いたい曲がなかなかなかったため、自前で曲を用意して歌うという文化があったようです(自分はあまり知りませんが…)。その際、HyperJoyという機種において、ビデオ入力/音声入力の端子があり、利用には最適だったようです。
ちなみに、今となってはカラオケには液晶TVが配置され、当たり前のようにHDMI端子が存在しているため、ビデオ/音声入力はかなり簡単になっています。というか、スマートフォンからHDMI出力もできるので、Medolyを用いた簡易カラオケも出来たりします。まぁそもそも、今はカラオケの曲もかなり充実しているため、そこまでする必要はないかもしれませんが…。
前置きが長くなりましたが、Joyhackで用いられている歌詞データも、文字単位の同期歌詞データとなるので、適当にフォーマット見て対応させてみました。読み取り処理はかなり適当なので、もしかしたら正しく読み取れないかもしれません。また、Joyhackは歌詞データに音楽ファイルのファイル名が記述され、歌詞ファイルが主・音楽ファイルが従、という位置付けなのですが、Medolyでは他の歌詞ファイルと同様に、音楽ファイルに対して同名の歌詞ファイルを読み取る、という処理になっています。ちなみに、拡張子は.txtです。



UNSYNCED LYRICSフィールド対応


前回のバージョンで内蔵歌詞のタグ「UNSYNCEDLYRICS」に対応しましたが、どうやら「UNSYNCED LYRICS」(スペースの有無の違い)が正しいタグの名前だったようで、こちらにも対応いさせました。
ちなみに、「UNSYNCEDLYRICS」はMp3tagによってタグが付与される場合があるようですが、詳細はよく分かりません。とりあえず、現状ではどちらでも読み取れると思います。