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バージョンを不用意に変更してしまった影響です…。