転職しました

私事ですが、先日転職しました。

前職は主に業務システムを開発する会社だったのですが、今度はモバイルアプリの開発ができる会社です。
Medolyを開発していく中で、やはりこちらの方面をのばしたいという思いが強くなり、アプリ開発ができる会社に移ることとしました。

転職活動は3月頃から始めており、わりと余裕が無かったのですが、転職と引越を終えて、少し落ち着いてきた感じです。
Medoly開発が完全に中断している状態だったのですが、少しずつ調子を取り戻したいと思います。メールや掲示板、コメント等でいただいた不具合や要望はとりあえずまとめて対応したいと思っていますので、今少しお待ち頂ければと思います。御迷惑をおかけして申し訳ありません。

これからもMedolyを愛用頂けるととても嬉しいです。

Medoly Ver. 3.1.0, 3.1.1, 3.1.2, 3.1.3

2017-12-10 Ver. 3.1.0**

  • Android 8.0 (Oreo) 対応
  • 再生ボタン長押しによる停止予約機能追加
  • いくつかの問題修正 (再生履歴の登録、ウィジェットレイアウト、標準サムネイル読込み、等)

Android 8.0 (Oreo) 対応

本バージョンより、Android 8.0 (Oreo) に対応しました。この前のバージョンでは、通知が正しく動作しなかったり、再生時に変な音が入り込んだり、挙動がおかしくなっていたはずです。
Android 8.0ではアプリのバックグラウンド動作に変更が入り、基本的にバックグラウンドで画面を出さずに動くアプリの動作を抑制する方針になっています。これはバッテリーの抑制や、セキュリティ対策といった面があるようです。アプリを動かす際は基本的に、画面を出すか(これはウィジェット等も含むようです)、通知欄にアイコンを出すか、という選択になります(開発SDKの’バージョンを上げなければ旧来の動作のままになりますが、私はウッカリ上げてしまったもので…。)。

バックグラウンド実行制限 | Android Developers
Android 8.0のNotification Badgesの仕組み – Qiita

音楽再生アプリは、バックグラウンドで動く動作が普通です。そのため、このAndoroid 8.0の仕様にかなり密接に関わります。そのため、通知表示周りをだいぶ色々弄っており、通知の出し方を一通り見直してみました。
その副作用として、前バージョンまで存在していた再生・停止時の通知アイコンのちらつきが解消されています。(これは、コードを作り直してたらそういうやり方が分かった、という話です。)

余談ですが、私が現在メインで使用している端末はAndroid 6.0です。別途タブレットに7.1の物があります。ところが、現状でAndroid 8を手に入れるアテが無いため、Andorid 8の対応は後手にまわる可能性があります。とりあえず、Android 8のエミュレータで動作は確認していますが、もし何かありましたらご連絡いただければ助かります。

再生ボタン長押しによる停止予約機能追加

これはちょっとした新機能です。

メディアの再生中に再生停止ボタンを長押しすると、停止ボタンアイコンが青くなります。この状態の場合、現在再生中のメディアの再生が完了した時に、再生が停止します。停止予約機能と思ってください。メディアを切り替えたり、再生が停止した場合に解除されます。
「今の曲が終わったらちょっと曲を止めたいな」ぐらいの感覚で使うイメージです。

いくつかの問題修正 (再生履歴の登録、ウィジェットレイアウト、標準サムネイル読込み、等)

今回の変更で多数のバグを修正しています。
* コンテンツプロバイダに未登録の曲も再生履歴から再生キューに追加できるようになりました。
* ウィジェットレイアウトが一部崩れていたので修正しました。
* アルバムアートが無い場合に再生キューのサムネイル画像がちらついていた問題を修正しました。
* 出力デバイスダイアログの内容を一部見直しました。

2017-12-12 Ver. 3.1.1

  • 再生終了時の不具合を修正

再生終了時の不具合を修正

再生停止時にアプリが落ちる問題があったので修正しました。

2017-12-17 Ver. 3.1.2

  • 共有向けURIを変更
  • 不具合を修正

共有向けURIを変更

Android 7.0以降では、ストレージのパスを外部のアプリに送る際に制限がつくようになりました。具体的にはfile://のURLは外部アプリに送ることができなくなり、代わりにconotent://を使用するようになります。このcontent://を取得するにはいくつかの方法があるのですが、基本的には「アプリ自身の管理可能なストレージパス」に限定されてしまいます。
ところが、Medoly内部はどうしてもfile://で扱うパスでないと各種操作を行うことができません。そこで、外部アプリにURIを送る際にfile://とcontent://の変換を行うのですが、この時にSDカードのパスを取得できず、SDカードのファイルを扱うためには「一旦自身の管理するパスにファイルをコピーした上で、そのURIをcontent://に変換する」という方法を取らざるを得ませんでした。以前この辺りの対応を行ったのですが、対応が曖昧になっていたところがあります。
ところが、最近色々調べていくうちに、file://のパスをそのままcontent://のパスに変換するという方法があることが分かり、実装してみた次第です。
具体的には、アプリのパスを定義するXMLファイルにfiles-path、cache-path。external-path等があるのですが、そこにroot-pathを設定する、というものです。

fileProvider – Any specific reason to use “root-path”? · Issue #129 · spacecowboy/NoNonsense-FilePicker

この辺はドキュメントに書かれていないので隠し技みたいな感じなのですが、とりあえずAndroid 8でも動いているようなので、一応有効なようです。ただあまり推奨されるやり方ではなさそうなので、いつ使えなくなるかは知りません。

不具合を修正

プロパティ情報に歌詞が含まれていなかったため、修正しました。

2017-12-21 Ver. 3.1.3 (2017-12-21 追記)

  • サムネイルのエラーを修正

サムネイルのエラーを修正

サムネイルを表示する際にエラーで落ちる場合がある問題を修正しました。

Medoly Ver. 3.0.5, 3.0.6

2017-10-23 Ver. 3.0.5
– アルバムアートのページスクロール機能追加
– メディア読込みの高速化
– ウィジェット調整
– 安定性向上
– いくつかの問題を修正

2017-11-04 Ver. 3.0.6
– ダイアログ調整
– 検索条件の削除機能追加
– ダウンロード歌詞が表示されない問題修正
– 画面表示修正

2017-10-23 Ver. 3.0.5

アルバムアートのページスクロール機能追加

タッチスクロールでアルバムアートを切り替えられる機能を追加しました。
アルバムアートが画面の前面にある状態(歌詞の裏に表示されていない状態)で、複数のアルバムアートを縦方向タッチスクロールで切り替えることができます。切り替えられるアルバムアートは、Ver.3.0.0で追加したアルバムアート切替え機能と同様となります。
なお、アルバムアートと歌詞が表示された状態では全面が歌詞スクロールになっていますが、レイアウトオプションで切り替えることで、アルバムアートのスクロールを行うことができます。

メディア読込みの高速化

メディアの読込み機能をやや高速化しました。
メディアを読込んだ際にタグ情報を一旦全部読込むのですが、これをメディア読込み時、アルバムアート読込み時、歌詞読込み時の3回行っていていました。Ver.1.0からずーっとこの状態だったのですが、完全に無駄な処理だったので、読込を最初の1度だけに変更することで高速化しました。
まぁ、ずっと潜在してた無駄な処理をやめただけです。

ちなみに、メディア読込みの高速化はまだ対策が一つ残っています。メディアを非同期で読込むことで、応答速度を高速化することが出来るのですが、かなり難しいのでまだ保留中です。

ウィジェット調整

ウィジェットのレイアウトを少し調整し、以前の変更でウィジェットのレイアウトがおかしくなっていたのを修正しました。
ウィジェットについては、今の可変レイアウトではなく、きちんとしたレイアウトが欲しいという要望があがっているのですが、固定レイアウトは全員を満足させるのは難しいし、作りすぎると管理が面倒なので、保留中です…。

安定性向上

動作安定性を向上させました。
素早く曲を切り替えると不安定になる問題や、通知領域の更新処理が改善されています。

いくつかの問題を修正

バグが色々あったので修正しました。
画面がうまく更新されない問題や、OutOfMemoryやRuntimeException等で、たまにアプリが落ちている問題が修正されたと思います。

2017-11-04 Ver. 3.0.6

ダイアログ調整

ダイアログを全体的に見直しています。
マテリアルデザインの変更によってダイアログのボタン位置がずれていたのですが、それを全て統一して整えました。基本的に、左側にキャンセル/閉じるボタン、右側にOK/開くボタンのようなスタイルで統一されています。ボタン位置がずれて御迷惑をおかけするかもしれませんが、これはAndroidのダイアログデザインに従った結果こうのようにしています。ご了承ください。
これに併せて、一部ダイアログにHoloスタイルの物が残っていたので、これをマテリアルデザインに置換えました。

検索条件の削除機能追加

検索条件の削除機能を追加しました。検索画面で検索をした際に表示される検索条件をタップすると、削除対象の検索条件メニューが表示されます。これをタップすると、該当の検索条件が削除され、メディアが再検索されます。

ダウンロード歌詞が表示されない問題修正

歌詞をダウンロードした際に画面の歌詞が更新されない問題を修正しました。

画面表示修正

画面のレイアウトや、アルバムアート表示ボタンが表示されたままになる問題等を修正しました。
また、画面を画面を最大化する時に落ちる問題を修正しました。

その他

余談ですが、このバージョンでバージョンコードが100になりました。

これは、バージョンアップ毎にカウントアップする内部的なバージョン番号です。表示上のバージョン番号(Ver. 3.0.6)と異なり、Android側で管理されます。バージョンアップ前の番号より大きい整数なら何でもいいのですが、自分は0からバージョンアップ毎に1ずつ増やしてたので、このバージョンで100回リリースしたことになります。思えば遠くに来たもんだ。
何はともあれ、これからもどうぞよろしくお願いします。

Medoly Ver. 3.0.0, 3.0.1, 3.0.2, 3.0.3

2017-08–18 Ver. 3.0.0
– Android 4.1以降の対応に変更
– マテリアルデザイン対応
– 複数のアルバムアートおよび歌詞に対応
– 標準の通知に対応
– 区間ループの処理を変更
– プラグインのインターフェースを変更 (アルバムアート取得・歌詞取得を追加)
– プラグインダイアログを変更
– タブ画面を変更
– jAudioTaggerライブラリを変更
– KRAフォーマットの読み取り処理変更
– いくつかの設定項目を変更
– いくつかの問題を修正

2017-08-23 Ver. 3.0.1
– 同期歌詞の行頭シーク設定追加
– プレイリストファイル保存の問題修正
– リソース管理処理修正
– メディア選択の高速化

2017-09-12 Ver. 3.0.2
– 画像表示処理変更
– 行頭シーク処理変更
– トラック情報読み込み修正
– その他処理修正

2017-09-16 Ver. 3.0.3
– 画像読み込み処理修正
– トラック番号が正しく表示されない問題修正
– 一部エラー修正

2017-08–18 Ver. 3.0.0

Android 4.1以降の対応に変更

本バージョンより、Androidの対応バージョンを4.1以降としました。以前はVer. 3.2以降だったため、今回のバージョンアップでVer. 3.2、4.0が動作対象外となります。
Androidの開発では、Androidのバージョンアップを経ていくと、古いAPIはどんどん非推奨となったり、新しいAndroidに対応した処理を追加していくといった作業が必要になります。そのため、アプリの開発を重ねていくと、古い機能に対応させるために、Androidバージョンによる分岐処理が増えることが避けられません。そういう分岐が増えていくと、徐々にソースコードが複雑になり、バグも混入しやすくなるといった問題が出てきます。(古いバージョンに対応されているアプリは、そういう部分に大きな労力を割いていることになります。)

そのため、現在では、Ver.3.2、4.0を利用する人もだいぶ少なくなってきたことを考え、今回のバージョンで切り捨てることとしました。利用されている方には大変申し訳ないのですが、あまり細かい部分に労力を割くと他の部分に手が回らなくなってしまうので、ご了承ください。

ちなみに、Android 4.1ではメディア操作関連のAPIがたくさん追加されており、このバージョンでの分岐処理が多いため、このバージョン以降の対応とした、という理由もあります。ちなみに、次に切り捨てるとすれば、APIの変更が多いAndroid 5.0以降となるかと思います。まだ当面先の話ですが。

マテリアルデザイン対応

本バージョンで、画面のUIをマテリアルデザインに対応しました。正確に言うと、マテリアルデザインのスタイルを適用しました。
マテリアルデザイン対応を正しく考慮すると、フラットなデザインの適用や、UIの設計の見直し等、色々な要素を考える必要があるのですが、真面目に取り組むと大変ですし、従来からUIの互換性もとれないので、現在のところはマテリアルデザインのスタイルを適用するに留めました(ちなみに、従来の画面スタイルは「Holo」といいます)。

ついでに、ActionBarのタブ等古くて既に非推奨となっているUIを見直して、現在利用が推奨されているパーツに置換えてます。既存のUIと同じインターフェースを備えたものに置換えているので、利用してる上であまり違和感は無いと思います。

元々、この辺りの更新は以前から考えていたので、Ver.3.0.0という節目のバージョンで一気に行ってしまいました。

複数のアルバムアートおよび歌詞に対応

外観的にはマテリアルデザインが一番大きな変更点ですが、内部的に一番大きく変わった部分がこちらです。
アルバムアートおよび歌詞について、複数のデータを読み込めるようにしました。メディアファイル内蔵、外部ファイル、コンテンツプロバイダ(Android内蔵の自動生成データベース)のデータを自由に切り替えられるようにしました。内蔵アルバムアート/歌詞について複数のデータが埋め込まれている場合がありますが、これらも全て読み込むようにしています。また、該当するファイル名の外部ファイルも全て読み込むことができます。(ちなみに、コンテンツプロバイダは常に一つだけです。)とにかく、読み込めるものは全部です。読込のON/OFFについては、設定画面(設定 → アルバムアート/歌詞 → 表示データ)で切替えることができます。

データの切替えは、プロパティのアルバムアート/歌詞の見出しをタップ→「変更」をタップするか、表示タブの表示ON/OFFアイコンを長押しすることで表示されるメニューから切り替えることができます。

現在のところ、データの選択は毎回リセットされてしまいます。荒削りな部分はありますが、少しずつ機能を増やしていければと思っています。

標準の通知に対応

Android標準の通知に対応しました。Android 5.0よりメディア再生用の標準通知スタイルが用意されているので、それを利用しています。設定画面の「通知」より、従来の独自スタイルの通知にも切り替えることができます。また、同じく設定画面より通知の色を設定することができます。設定の「通知色」で設定することができます。ただ、透明度を最大値(FF)に設定しないと色が適用されない点に注意してください。それ以外の透明度の場合は、標準色に設定されます。

区間ループの処理を変更

Android 7.0より、区間ループが動作しなくなっていたため、処理を変更しました。従来の実装では、ちょっと特殊なやり方でループを実現させていました。それは字幕機能を利用することです。字幕の表示タイミングでイベントが発生することを利用し、ループ時間を設定した字幕データを生成して読み込ませることで、任意のタイミングでのループを実現させていました(これ以外に正確な時間でループさせる方法がなかった)。ところが、これはAndroid 7.0で使えなくなりました。恐らく、動画を読み込まないと字幕が動作しないように仕様が変更された物と思われます。
仕方ないので、時間のカウンタによるループを行うようにしました。この変更に伴い、ループの位置が毎回微妙にずれるようになりました(ms単位で正確に実行させるのが難しいため)。これは仕様となりますのでご了承ください。

いつか、フレーム単位の正確なループを実装したいんですけどね…。

プラグインのインターフェースを変更 (アルバムアート取得・歌詞取得を追加)

プラグインのインターフェースを全面的に見直しました。それに伴い、各プラグインも全て更新されています。全てのバーションを上げないと、プラグインが利用できなくなります。

この変更の結果、アルバムアートの取得ができるようになっています。現在の所、「Medoly Last.fm Plugin」のみがアルバムアート取得機能の実装をしています。

プラグインダイアログを変更

プラグインの仕様を変更したことに併せて、プラグインのダイアログ、メニュー周りを全体的に見直しています。これに伴い、プラグインの動作ON/OFF設定がクリアされます。この変更で、ダイアログからプラグインのイベント単位の動作ON/OFFが出来る様になっています。

タブ画面を変更

各画面やダイアログに存在していたタブのパーツを置換えました。これは、非推奨となったパーツの置換えや、複雑になっていた処理の簡素化を目的にしています。
検索画面のタブ要素を完全に置換えた結果、スワイプでタブを切り替える操作のレスポンスが向上するという良い副作用が出ています。

jAudioTaggerライブラリを変更

今まで、タグの読み込みにjAudioTaggerを使用していました。バージョンは最新版ではなく、Ver.2.0.4。なぜこのバージョンを使用していたのかというと、これより後のバージョンではAndroidで使用するとエラーが発生する問題があったためです。Androidで使用できないライブラリ参照が含まれているようで、改修を試みるも上手く行かず、仕方なくずっとこのバージョンを使用していました。
ところが、最近jAudioTaggerからフォークしてAndroid向けに変更したJaudiotagger for Androidがあることを知ったため、こちらを採用することにしました。バージョンは、2.2.3相当です。
バージョンを変えて何が変わったのかよく分かっていないのですが、まぁ新しいバージョンの方が良さそう、ということで。

KRAフォーマットの読み取り処理変更

タイムタグ歌詞の読み込み処理を修正し、行頭にタイムタグがなくても歌詞として読み込まれるようにしました。
これは、RhythmicaLyricsで歌詞を作成した際、歌詞の行頭に記号が含まれると、デフォルトでタイムタグが記号が飛ばされて付与されてしまうため、その動作に合わせています。そもそもの仕様も行頭にタイムタグが付かなくても良い、という仕様であったので、本来の仕様に近づけた、という感じです。

いくつかの設定項目を変更

プラグインの仕様変更、標準の通知に対応、といった変更に合わせて、設定画面の内容を変更しています。見れば分かるかと思いますので、詳細は割愛します。

いくつかの問題を修正

その他、多数の問題を修正しています。
今回、内部処理を大幅に弄ったことに合わせて、いくつかのバグを修正しています。また、多少の高速化もされています。

2017-08-23 Ver. 3.0.1

同期歌詞の行頭シーク設定追加

同期歌詞において早送り/巻戻しボタンをタップした際、歌詞行の行頭にシークするようにしました。これは、設定画面の「再生」→「歌詞行単位でシーク」を有効にすると動作します。非同期歌詞の場合は無効で、通常のシークボタンタップ動作(設定時間だけ再生位置をシーク)になります。
早送りボタンを押すと現在の次の歌詞行の行頭、巻き戻しボタンを押すと現在の行の行頭または、前行の行頭に移動します。

ふと思い立って機能を追加してみましたが、これは言語学習等の繰り返し再生に有益かな、と思います。多分。

プレイリストファイル保存の問題修正

プレイリストファイルの作成でフォルダが作成されてしまう問題があったため修正しました。これは、ただの作りこみの際のバグです。

リソース管理処理修正

アプリ内部に抱えているリソースの解放タイミングを調整しています。これは、解放処理のタイミングによって、解放済みのリソースにアクセスしてアプリがエラーとなる場合があったためです。これに合わせて、その他諸々のバグを修正しています。

メディア選択の高速化

メディア選択時に同じ処理が2回連続で実行されてしまい、メディア再生までの時間が遅くなっていた問題を修正しました。高速化とは書いてますが、ただのバグ修正です。

2017-09-12 Ver. 3.0.2

画像表示処理変更

アルバムアートの表示処理を修正しました。
この辺では、アルバムアート読込みに関する修正ばかりしています。というのも、複数のアルバムアートを読込めるようになったことで、メモリ上に多数の画像が読み込まれる可能性があったため、画像の管理を見直していたためです。ところが、メモリから破棄された画像にAndroidがアクセスしてしまい、エラーが発生する事象が多発しているようで(通知やウィジェット関連の模様)、その辺りの処理を少し見直していました。

行頭シーク処理変更

Ver. 3.0.2で追加した行頭シーク処理を見直しました。具体的な変更は2つ。1つ目は、巻き戻しボタンで前の行に戻るための時間を、行頭の再生から1秒以内にしました(変更前は2秒)。これは、繰り返し再生を行う上で2秒は少し長すぎるように思えたためです。2つ目は、再生時間が1秒以内の行はスキップするようにしました。これは、0秒の空白行のような行があると、その部分から前の行に移動できなくなる問題があったためです。

トラック情報読み込み修正

トラック番号が数値ではなく「x / y」のような形で保存されていた場合、正常に再生できない問題を修正しています。

その他処理修正

シークバー操作中にドロワーメニューが開くと、シーク速度の表示が残ってしまう問題の修正とか、検索画面で「ストレージ」タブをタップしても、検索条件がクリアされない問題の修正とか、色々です。

2017-09-16 Ver. 3.0.3

画像読み込み処理修正

Ver. 3.0.2に続き、ここでも画像読込み処理の修正です。
ちなみに、色々調べた末、「あんまり変な画像破棄の処理はやらないでAndroidに任せた方がマシだった」という結論に至っています。

トラック番号が正しく表示されない問題修正

タグ上に合計トラック番号が存在しない場合、1で出力されてしまっていた問題を修正しました。
これは、ユーザ様からの報告で分かったため修正しています。

一部エラー修正

再生キューの先頭・末尾で曲戻し・曲送りを行うと、メディア読込がエラーとなる問題の修正、タイミングによってnull参照のエラーが発生する場合がある問題の修正、等になります。

まとめ

以上、ダラダラ書いてますが、徐々にバージョンアップを重ねて3.0という節目のバージョンを迎えたので、少し多めの変更を加えてみました。本当はもっと色々やってみたいことはあったのですが、多すぎて手が回らなかったので、今回はこの辺で。
3.0リリース時に多少多めにクラッシュが発生してしまいましたが、今のところやや落ち着いています。何か問題がありましたら、ご連絡をお待ちしています。

サイトのHTTPS化

先日サイトを移行したことに伴い、本サイトを全てHTTPS化しました。
HTTPでアクセスした場合、自動的にHTTPSにリダイレクトします。
前に使用していたレンタルサーバでは、独自ドメインでのSSL化が出来なかったため、移行に伴い全てSSLでアクセスできるようにしました。
近年では、HTTPは常時SSLで行う流れになっているので、それに倣ってみました。
SSLサーバ証明書は、Let’s Encryptを使用しています。

何か問題があればまた戻すかもしれませんが、とりあえずこれで運用してみます。

Blogger から WordPressに移行します

突然ですが、従来使用していたBloggerサービスをやめ、Wordpressに移行します。
理由は、Bloggerサービスがイマイチ使い勝手が悪い(拡張性が低い、投稿の編集が使いにくい、画像が扱いにくい、等)ためです。

また、最近AWSのLightsailを使い始めて、色んなサーバに持っていたデータを一元化してしまおうと目論んでいた、ということもあります。
そのため、現在このWordpressはAWS上で動いています。
初めて運用してみましたが、応答速度も速く結構良い感じです。

URLは、”http://blog.wa2c.com/”から”http://www.wa2c.com/wp”になります。
前URLにアクセスした場合は、自動的にトップページにリダイレクトされるはずです。

今後ともよろしくお願いします。

Twitter はじめました

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

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

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

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

Twitter アカウント

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の仕様ではちょっと無理そうなのでその辺は諦めてます。

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では起こらなかったような…。