Wednesday, July 30, 2014

VisualizerのReleaseで苦しみ中

これ、
http://stackoverflow.com/questions/14302825/fatal-signal-11-android-visualizer

Visualizerの生成、破棄を繰り返し行うと落ちる問題で苦しんでる。
Activityの生成時、というかOnResumeでVisualizerを生成し、OnPauseで破棄をするのは一般的な実装だとおもうんだけど、Activityの表示、非表示を何度も繰り返すと上記リンクと同じLogが出力されおちてしまう。
Visualizerを使わないと発生しないので戦犯はVisualizerで間違いないとおもう。

僕がテストしているコードではMediaPlayerの再生を一時停止していても上記問題が発生するのでAudioSesssionが変わったとかそう言う問題ではないだろう。

Visualizerの生成と破棄の間隔が短いと発生するようだ、これは端末によっては発生しないものもあるかもしれない。

Thread.sleep(100)をいれると落ちにくくはなる。


RecyclerViewをICSで使う方法

Android-Lの発表と同時に追加されたRecyclerViewですが、こちらListViewよりもパフォーマンスが良く、またHorizontalScrollとVerticalScrollの使い分けや、GridView、ListViewの使い分けをしやすいといったメリットがあります。
早速つかいたいのですが、Android-Lでないとコンパイルエラーがでるのでどうしたものかとおもっていたけど、解決方法があったのでメモ。

タイトルにはICSと書いていますが、テストをしたのがISC端末なだけなので、KitKatでも多分大丈夫だと思う。

まず、Gradleの指定、こいつをdependenciesに追加。

    compile 'com.android.support:support-v4:20.0+'
    compile 'com.android.support:recyclerview-v7:+'

それから、レイアウトファイルはとくに仕掛けは必要ありません。
    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_above="@+id/controlLayout"/>

こんな感じでいれればよいとおもいます。

だいじなのはAndroidManifest.xmlファイル、こちらは以下の1文を追加する必要があります。

    <uses-sdk tools:node="replace" />

これは、uses-permitsionタグと同じ階層であるルートタグの子チャイルドとして追加してください。また、

xmlns:tools="http://schemas.android.com/tools"

これをいれておかないとエラーになります。
DragListViewをやめて、RecyclerViewにおきかえる作業にとりかかるよー
CardViewもつかえるのかな?

NavigationDrawerとDragListViewは相性が悪いと思う

ListViewを編集可能にするためのDraggableListViewの実装はすぐ思いつく機能の一つだけど、NavigationDrawerと相性がわるいなぁと使っていて思った。
黄色枠のところの判定で、緑のNavigationDrawerをひっぱるつもりが誤タッチでリストの並び替えになってしまったりする。
間隔をひろげればミスはすくなくなるけど、画面を窮屈にするか、別画面にするかの二択だ。

Monday, July 28, 2014

KitKat用にビルド

ブランチ管理が面倒臭いんだけど、一旦Android−Lを別ブランチして、本流をKitKat用にしてみました。

それで、とりあえず動くようになったので、APKを作成しアップロードしました。
ちなみに、Lでしか動かないFABやCarViewは表示されません。
はやくSupportLibraryリリースしてほしいよー。

APKは以下からダウンロード、もしくはベータ版で(こっちは反映されるまで時間かかるとおもう)

https://bitbucket.org/yokmama/just-player/downloads/JUSTPLAYER3_v4.0_314190004.apk

UIをちょこちょこ変更しているところなんだけど、余計なボタン、余計な機能をどんどん省いていくと、見た目よくなるけど、使い勝手は前のに慣れていると使いにくい、特に以前はどこの画面でもPlay、Pause、Skip、Back、Seekといった基本的な操作はやれていたので、それらのボタンがないとすっごく使いにくい。
でもこれらのボタンを配置すると画面が狭くなるので置きたくはない。

標準プレイヤーの場合、それらを割りきっているため、ボタンがある画面とない画面があるのだけど、なんだか、JUST PLAYERで同じようにしてると、使いにくくかんじる。この違いはなんなんだ、、
(標準プレイヤーが使いやすいかどうかは別としてですが。)


Reverbいらないよね?だって動いてないもん

AndroidのAudioEffectにReverbっていう機能があるんだけど、これの効果が全然わからない。

楽器のエフェクターでは、Reverbってのはめちゃかっこいいエフェクトの一つなので、すっごく期待してんだけど、全然効果を感じられないので、使い方が間違ってんのかなぁとずっと疑問におもってました。
また、端末によっては動いているものもあるんだろうと、、
だけど、テスト用に売られているNexusシリーズで動いていることを実感できないとなっては、これサポートする意味あんの?と思う次第です。

ちなみに、公式サイトによると、Reverbは他のEffectとは異なり次のような点で注意しなければならないようです。

1AudioSessionは0で生成しないといけない。
2SendLvelを設定しておかないといけない。
3EffectをMediaPlayerにAttachしないといけない。

上記のルールを守ると次のようなコードになります。

PresetReverb mReverb = new PresetReverb(1, 0);
mReverb.setPreset(PresetReverb.PRESET_LARGEROOM);
mReverb.setEnabled(true);
mp1.attachAuxEffect(mReverb.getId());
mp1.setAuxEffectSendLevel(1.0f);

しかし効果は分からない、あとはMediaPlayerを生成しDataSourceを設定するまえに設定するのか?その後なのか?ぐらいだけど、両方ためしてみたけど効果を感じられなかったです。
そもそも、DataSourceに前に設定とか、後とかの設定が本当に意味があるのだったら、すっごくステート管理が面倒になるのでやりたくはない。
あと、ほかにもフェフェクトとしてEnvironmentalReverbまであるので、これとの組み合わせによる管理も必要だし、ただでさえ、Effect周りは何度もOn/Offをしたり曲をきりかえたりすると稀にフリーズしたり落ちたりするので、これ以上面倒な実装をいれたくないというのが本音です。

こんなのに頭使うぐらいなら、Gain操作をしてReplayGapの実装をしたほうがどんだけ有意義かわからないですよね。
てわけで、Reverb機能は実装しない方向で考えてます。

もし、こうやったら良いという情報があればご一報をください。
そのときは喜んで実装いたします。




Sunday, July 27, 2014

Android-Universal-Image-Loaderの日本語ファイルの扱いでハマる

Android-Universal-Image-Loaderはとっても高機能で積極的に使っているのですが、ファイルは存在するのエラーがでていて困っていました。
下記はそのときのエラーログです。

07-27 13:11:40.254  11037-11104/? E/ImageLoader﹕ /sdcard/Music/supercell%20Discography/supercell%20Discography/1st%20single%20%5B%E5%90%9B%E3%81%AE%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E7%89%A9%E8%AA%9E%5D/cover.jpg: open failed: ENOENT (No such file or directory)
    java.io.FileNotFoundException: /sdcard/Music/supercell%20Discography/supercell%20Discography/1st%20single%20%5B%E5%90%9B%E3%81%AE%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E7%89%A9%E8%AA%9E%5D/cover.jpg: open failed: ENOENT (No such file or directory)
            at libcore.io.IoBridge.open(IoBridge.java:456)
            at java.io.FileInputStream.(FileInputStream.java:76)
            at java.io.FileInputStream.(FileInputStream.java:103)
            at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromFile(BaseImageDownloader.java:158)
            at jp.co.kayo.android.localplayer.MyApplication$MyImageDownloader.getStreamFromFile(MyApplication.java:176)
            at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(BaseImageDownloader.java:86)
            at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.downloadImage(LoadAndDisplayImageTask.java:290)
            at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryCacheImageOnDisk(LoadAndDisplayImageTask.java:273)
            at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:229)
            at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:135)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

これは、ファイル名の取得処理で日本語処理に誤りがあったからなので修正方法をメモしておきます。

Friday, July 25, 2014

AndroidWearのNotificationで若干ハマりました

MediaPlayerのようなServiceで処理をする場合に表示するNotificationは、Serviceが処理が終わるまでシステムに勝手に殺されないようにするためsetOngoing(true)をNotifiationに設定し、且つContextのstartForegroundでNotificationを表示しないといけません。(注:とはいっても、システムによって殺されにくくなるというだけです)


Tuesday, July 22, 2014

ボタンをFabに置き換えてみた

配色が難しい、
MaterialDesginのガイドラインではLightThemeをベースにした配色例は多くあるけど、DarkThemeの配色例は少ないきがする、だからJUST PLAYERのように黒をベースにした配色の場合のFabの色はどれがいいのか困っています。

旅する配色見本
http://ironodata.info/travel/

このサイトを参考に、プライマリ、アクセント、コントラストの色を参考にとりあえず赤にしてみたけど、しばらく使ってみて違和感がないか調べてみる。

このFabを使ったバージョンはAndroid−Lでないと動かないので、開発中ビルドとしてアップロードできません。
どちらでも動くSupportLibraryがそのうちでるとおもうのですが、しばらくはなさそうです。だからといって、それまでずっとアップロードなしというわけにもいかないので、デザインが一段落したら、Android-L以下でもとりあえず動くようにしたバージョンを作る予定です。
もうすこしお待ちください。


こうしてみると、Fabのアイコンが大きすぎて変だなぁ、色ももうちょっとトーンを落としたほうがよいようなきもする。

※Fabというのは、右下の赤色の丸いボタンのことで、FloatingActionButtonの略です。

Thursday, July 17, 2014

メイン画面のUIをひとまず実装してみた

メインの再生リストを表示する画面を実装してみました。
MaterialDesignに対応するといっても、どこまで実装すればよいのか難しいです。


左上のActionBarのタイトル文字の左側の隙間が微妙にきになる。
カスタムレイアウトをなるべく使いたくないので設定でなんとかならないか工夫しているのですがうまくいかない。
それから下の操作部分をスッキリさせるためにボタンは一個だけにしました。
標準プレイヤーがこうなっているので不都合はないはずですが、早送りボタンをおいたほうが便利なんじゃないのかと思ったりしています。

しかし、両方おいた場合のデザインがださいんですよねー。

■ ▶ hohogehoge ▶▶ 

上記のように▶が複数ならぶので見た目がださい。
(早送りボタンは長押しで5秒スキップを持続する機能です。)

あと、操作部分がびっちり隙間なくくっついているので広告っぽくみえる。
これも隙間をちょっといれたほうがよいのかなと思った。

ボタンのデザインも、MenuButtonみたいにフレームのようなデザインのほうがよかったかなぁ。



Friday, July 4, 2014

Ampache対応しました

Ampacheの実装をしました。
といっても最低限です。
WIFIと3Gでホスト名が違う場合入力しなおしが発生するため面倒です。
利便性を考えれば、WIFI用と3G用で設定を自動できりかえる仕組み、もしくは、コンボボックスなので簡単に切り替えあできるようにしたいところです。

https://bitbucket.org/yokmama/just-player/downloads/JUSTPLAYER3_v4.0_314190001.apk

必要最低限の機能まで実装したので、ひとまずAmpache対応はここまでとして、UIの見直しをしたいとおもっています。
Android−Lが発表され、MaterialDesignの利用が推奨されるようになりました。
ですのでUIはこれを踏襲して実装する予定です。