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を表示しないといけません。(注:とはいっても、システムによって殺されにくくなるというだけです)