Tuesday, August 26, 2014

ファイル選択ダイアログでフォルダを複数選択できるようにしました

「フォルダを選択したら、そのサブフォルダも検索してほしい」
という要望があるのだけど、これは非常に難しく、実装はたやすいけど、そのあとのフォローが難しいとおもっています。
なぜなら、SDカードならフォルダ内の一覧を取得するのは一瞬だけど、クラウド上のフォルダはその取得に10数秒かかる場合があります、それを再帰的に取得するとファイルの取得にすごく時間がかかってしまう。

プログレスバーは表示しないといけないし、途中で停止も実装しないといけないし、失敗した場合の例外処理もしないといけないしで手間だけ増えてくる。

これは、旧JUST PLAYERの仕様であり、悩みのたねでした。
旧JUST PLAYERではこれを何度もしないように一番最初に痛みをお願いするという形でフォルダのスキャンを行いインデックスを作ることで逃げましたが、この手法では、フォルダ状態が変わったときに再スキャンをしないといけないという欠点がありました。
クラウドサービスによってはフォルダの変更日付を取得できるものもあるのでそのようなサービスだけは起動時にチェックをすることも可能なのですが、取得できないものもあります。
なので、統一的なインターフェースを実装する場合、最小のサービスに合わせるしかないのが悩ましい点です。

新JUST PLAYERでは、これはもう面倒だってんでもう毎回フォルダを選択してファイルをいれてくださいという仕様にしたのですが、やっぱりいちいち選択するのが面倒臭いんですよね。

というわけで冒頭の要望がでているのです。

今回のバージョンでは、そのサブフォルダを自動で追加する機能はひとまずペンディングにし、複数のフォルダをまとめて選択し、追加できるようにしました。

これなら、アーティストのフォルダにあるアルバムを全選択するという手順だけど、いっぺんに曲を追加できることになります。
これでも不便なのかどうか、ちょっと様子を見たいとおもっています。

あと、今日アップロードしたバージョンで、AQUOSPADで落ちる不具合が治っているといいな。
いちおうそれっぽいところを修正してみたのだけど。
手元で再現をしないので、よくわからないです。

GooglePlaySeviceのDevelopderConsoleに下記のエラー報告がありました。
これは、AquosPadのエラーだったので多分これだとおもう。

java.lang.RuntimeException: Unable to create service jp.co.kayo.android.localplayer.service.MediaPlayerService: java.lang.UnsupportedOperationException: Effect library not loaded
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2627)
at android.app.ActivityThread.access$1700(ActivityThread.java:150)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5159)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:810)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:577)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsupportedOperationException: Effect library not loaded
at android.media.audiofx.AudioEffect.(AudioEffect.java:384)
at android.media.audiofx.Equalizer.(Equalizer.java:146)
at jp.co.kayo.android.localplayer.media.AudioEffect.attach(AudioEffect.java:120)
at jp.co.kayo.android.localplayer.media.MediaController$GaplessMediaPlayer.setTrack(MediaController.java:736)
at jp.co.kayo.android.localplayer.media.MediaController.init(MediaController.java:90)
at jp.co.kayo.android.localplayer.service.MediaPlayerService.onCreate(MediaPlayerService.java:57)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2617)
... 10 more

このエラーの原因自体はサポートされていないAudioEffectを使ったからおちていますがエラーの内容と、原因がずれているとおもいます。
プログラムのバグではスタックトレースと、エラーの原因が直結していないことはよくあることです。
多分ですが、EqualizerのAudioEffectのReleaseが正常にされていないのに、生成がされたためだと思われますので、終了処理の箇所を見なおしてみました。
これで治ってもらえると助かるんですが。。。



No comments:

Post a Comment