[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 メーリングリストの案内