自分のアプリ、UsbWebCamera/UsbWebCameraProのコメントを見てるとどうもGALAXY S4, S5, S6あたりでうまく動かないってのが増えてきた。全然動かないというのもあるし、音声を有効にするとだめってのも。まぁ作ってる側からすれば「だめ」って言われてもなぁって感じで、クラッシュレポートでもよくわからない。でもAudioRecordがらみらしい感じがする。システムのJNIライブラリ(音声)からエラーコード-20が返って来たのがわかったってそんな内部エラーコードなんて聞いても見ても何のこっちゃわっかりませーん(●`ε´●)
買ってみた
しょうがないのでAu版の中古だと2万ほどまで下がってきたので買ってみた^^海外版ともDocomo版ともSocが少し違うけどCPUとGPUは同じらしいのでまぁ大丈夫でしょう。で試した結果…
結果
動かしてみた結果、AudioRecordの初期化でずっこけてました。例外生成すると想定される所は例外ハンドラで囲ってるつもりだったんだけどなぁ(汗)
なんでやねん
映像と同時に録音出来るように設定するとAudioRecordを使って録音します。
このクラスは色々機種依存があって面倒なんで色々ゴニョゴニョしないといけないのです。最初はいつもの様にバッファサイズが特殊なんかなとか思ってたんですが…今回の原因は音声入力ソースでした。えっ?そこっ?って感じ。
Android DevelopersのAPIレファレンスによるとAudioRecorderの音声入力ソースには次の定数が指定可能です。
MediaRecorder.AudioSource:
- DEFAULT(0)
- MIC(1)
- VOICE_UPLINK(2)
- VOICE_DOWNLINK(3)
- VOICE_CALL(4)
- CAMCORDER(5)
- VOICE_RECOGNITION(6)
- VOICE_COMMUNICATION(7)
- REMOTE_SUBMIX(8)
それぞれの定数の意味は省略することにして、普通はMediaRecorder.AudioSource.MICかまたはMediaRecorder.AudioSource.DEFAULTを音声入力ソースに指定します。ネット上に有るサンプルコードでもMICとDEFAULT以外になっているのはほとんどありませんよね(通話録音のサンプルは別にして)。
なんちゅう悪い仕様やねん
自分のアプリではMICにしてました。でもS5だと動かないんですガ━━(;゚Д゚)━━ン!!ちなみに、DEFAULTにしても動きませんでした。DEFAULTが動かないなんてなんちゅう悪い仕様やねん。というかDEFAULTの意味判っとらんやろ。債務不履行やで。ギリシャ大丈夫かなぁって違う〜。
ちなみにエラーログを見る限りDEFAULTは内部的にはMICと同じ値で初期化しようとしているみたいでした。
自分のアプリでは通話の録音は対象外なので、使えるのは次の5つぐらいかな?
DEFAULT, MIC, CAMCORDER, VOICE_COMMUNICATION, VOICE_RECOGNITION
この内S5で動いたのはCAMCORDERだけでした(´・ω・`)
一応指定可能な9つ全部試してみたところ、VOICE_CALLとREMOTE_SUBMIXもだめでしたが、VOICE_UPLINKとVOICE_DOWNLINKはOKでした。
もしかするとS4やS6も同じ仕様なのかも(゜レ゜)
しょうがないなぁ〜
workaroundとして上の5つの音声入力ソースを順繰り試して初期化成功したのを使うことにしました。バッドノウハウやね。でもまぁ実機を買っちゃったから10分程で動くようになったけど、実機なければわからんやろなぁ。
ちなみに、Au版のGALAXY S5にはクレードルがついててUSBを繋がなくても乗せると充電できるようになってました。おぉ〜Qiじゃなくても線を繋がんでも充電できるってのはやっぱり便利やね。でも1つ残念な仕様が…せっかくのクレードルなんだけどUSBに線をつないでいる時にクレードルに載せても充電してくれません(;_;) PCと繋いでいる時はともかくとしてホストとして動いてる時はクレードルから充電できればいいのにぃ〜(´・ω・`)って思ったら、クレードルで充電している最中にOTGケーブル繋ぐと給電が継続しているかも。これなら長期ライブストリーミング出来るようになるかもp^_^q
お疲れ様でした。
2015/05/21追記:
GALAXY S5でAudioRecordを使う際にDEFAULTとMICが指定できないというのは上に書いたとおりですが、logCatを見ててもう一つ新発見^^v 正確にはUAC(USB Audio Class)対応の機器が繋がっているとおかしくなるみたいなのです。普通のWebカメラなら大抵マイクを内蔵しててUAC対応なのでWebカメラを繋ぐとDEFAULTもMICも使えなくなるのです ガ━━(;゚Д゚)━━ン!! UAC機器を取り外せば元に戻ります。この機種はAndroid4.xでは公式にはサポートしていないUACをどうにかしようとして失敗してるんでしょうかねぇ。それはそれで悪仕様というかバグだよね。でもCAMCORDERだけでも動いてよかったぁ–;
ちなみに、Googleアプリ(OK Googleとしゃべると音声認識と検索してくれる青いアイコンのやつね)でもマイク内蔵のWebカメラ繋ぐと動かなくなります^^
またまたレアなバグを引き当ててしまいました(´・ω・`)
あぁ〜!!、昨日ブログにAndroid5にしたらGALAXY TABでUsbWebCameraが動かへんってコメントが来てたのも同じかも。最新版なら動くと信じよう。だめでもAndroid5なら開発者向けオプションにUSBオーディオルーティングを無効にする設定があるから…
コメント
[…] 以前の記事でGALAXY S5でAudioRecordを使った音声入力がうまく動かないってのとそのworkaroundを書いたんですけど、Android5にアップデートしたところ極悪仕様に更に磨きがかかってました(UAC対 […]