[Armadillo:05987] Re: Armadillo-440 & Froyoでの音声検索(VoiceSearch.apk)を動作させたい
Shin-ya Koga
email@hidden
2010年 10月 26日 (火) 15:33:32 JST
サムシングプレシャスの古賀です。
岡野さん([Armadillo:05984]):
>>★の行で、'res/raw/disambig.wav' が無いと言っていますので、
>>disambig.wav がイメージに入っているのかどうかを確認してみる
>>のが良いかも知れません。
>
>イメージに入っている=apkの中に入っている、でよいのでしょうか?
>#この辺の理解がちょっと曖昧です…
ごめんなさい。それでよいと思います。
>実機に入れたapkを念のため再取得して展開してみましたが、ファイルは
>存在しています。
>
> adb pull /system/app/VoiceSearch.apk
> unzip VoiceSearch.apk
> dir res/raw/
…
>2008/08/21 17:13 7,002 disambig.wav
…
とすると、なぜなんでしょうね。以下の箇所のソースを見てみました
が、android.content.res.AssetManager クラスの
openNonAssetFdNative() が null を返しているらしいことしか、分か
りませんでした。(ネイティブライブラリまでは、追っていません。)
>>> Resourcesエラー:
>>> E/AndroidRuntime( 367): FATAL EXCEPTION: main
>>> E/AndroidRuntime( 367):
>>> android.content.res.Resources$NotFoundException: File
>>> res/raw/disambig.wav from drawable resource ID #0x7f050002 ★
>>> E/AndroidRuntime( 367): at
>>> android.content.res.Resources.openRawResourceFd(Resources.java:860)
>>> E/AndroidRuntime( 367): at
>>> android.media.MediaPlayer.create(MediaPlayer.java:641)
>>> E/AndroidRuntime( 367): at
>>> com.google.android.voicesearch.RecognitionActivity.safeCreatePlayer(RecognitionActivity.java:699)
>>
>> ★の行で、'res/raw/disambig.wav' が無いと言っていますので、
>> disambig.wav がイメージに入っているのかどうかを確認してみる
>> のが良いかも知れません。
ちなみに、上の★の行付近のソースは、次のようになっています:
public AssetFileDescriptor openRawResourceFd(int id) throws
NotFoundException {
synchronized (mTmpValue) {
TypedValue value = mTmpValue;
getValue(id, value, true);
try {
return mAssets.openNonAssetFd(
value.assetCookie, value.string.toString());
} catch (Exception e) {
NotFoundException rnf = new NotFoundException(
"File " + value.string.toString()
+ " from drawable resource ID #0x"
+ Integer.toHexString(id));
rnf.initCause(e);
throw rnf;
}
}
ここで、mAssets は android.content.res.AssetManager クラスの
インスタンスを指しています。AssetManager クラスの openNonAssetFd()
は、内部で、openNonAssetFdNative() という native method を呼び出し、
これが null を返すと、FileNotFoundException を throw します。
openNonAssetFd() という名前からすると、該当するリソースファイル
が存在していれば良さそうな気はしますが、実際どうなのかは、
android.content.res.AssetManager.openNonAssetFdNative() の実装
を追わないと分かりませんね。
# お役に立ててなくて、ごめんなさい。
--
古賀信哉 (株)サムシングプレシャス
armadillo メーリングリストの案内