[Armadillo:05991] Re: Armadillo-440 & Froyoでの音声検索(VoiceSearch.apk)を動作させたい

imudak email@hidden
2010年 10月 26日 (火) 17:24:32 JST


岡野です。

お忙しい中、ソースの中まで見ていただきありがとうございました。>古賀さん

> ここで、mAssets は android.content.res.AssetManager クラスの
> インスタンスを指しています。AssetManager クラスの openNonAssetFd()
> は、内部で、openNonAssetFdNative() という native method を呼び出し、
> これが null を返すと、FileNotFoundException を throw します。

native methodというところで、大事なことを思い出しました。
大分前ですっかり忘れてたのですが、インストールしたapkが他にもあります。

下記が現象に至る最小インストールです。
☆が追記部分です。

環境等詳細>
・Armadillo-440
・Android 2.2_r1.1 ( solaさんのgitからビルド )
   http://goo.gl/5P3H
・上記にalsa-lib、alsa-utils、alsa_soundを加えてビルド。
・NexusOne(2.2.1)のVoiceSearch.apk&VoiceSearch.odexを吸出し、
・smaliでodex->dex変換->apk作り直し。
 http://code.google.com/p/smali/
・インストール
 apk push VoiceSearch.apk /system/app
☆NexusOneの/system/app/GoogleServicesFramework.apkをsmali/baksmaliで作り直し。
☆インストール
 apk push GoogleServicesFramework.apk /system/app
☆nexusoneの/system/lib/libspeech.soを/system/libにインストール。
・ VoiceSearchを起動→
「Voice Search(com.google.android.voicesearch)が予期せず停止しました。やり直してください」

今、まっさらな状態からやり直して確認しました。

GoogleServicesFramework.apkのインストールを省くと以下のエラーになります。


D/AndroidRuntime(  371): Shutting down VM
W/dalvikvm(  371): threadid=1: thread exiting with uncaught exception
(group=0x4001d7d8)
E/AndroidRuntime(  371): FATAL EXCEPTION: main
E/AndroidRuntime(  371): java.lang.RuntimeException: Unable to start
activity ComponentInfo{com.google.android.voicesearch/com.google.android.voicesearch.RecognitionActivity}:
java.lang.UnsupportedOperationException: GoogleSettingsProvider not
found
E/AndroidRuntime(  371):        at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime(  371):        at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(  371):        at
android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(  371):        at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(  371):        at
android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  371):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  371):        at
android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(  371):        at
java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  371):        at
java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  371):        at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(  371):        at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(  371):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(  371): Caused by:
java.lang.UnsupportedOperationException: GoogleSettingsProvider not
found
E/AndroidRuntime(  371):        at
com.google.android.voicesearch.LocationUtils.createLocationUtils(LocationUtils.java:45)
E/AndroidRuntime(  371):        at
com.google.android.voicesearch.WebSearchUtils.<init>(WebSearchUtils.java:45)
E/AndroidRuntime(  371):        at
com.google.android.voicesearch.RecognitionActivity.onCreate(RecognitionActivity.java:486)
E/AndroidRuntime(  371):        at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(  371):        at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime(  371):        ... 11 more


GoogleSettingsProviderがないと言われています。
OHAのソースにGoogleSettingsProviderがなかったので、NexusOneのを拝借しました。

  $ cd $ANDROID
  $ find $ANDROID -iname "*.java" -exec grep -Hn GoogleSettingsProvider {} \;
  $

他のアプリでは画像などのリソースを表示できているので大丈夫かと思ったのですが…

以上よろしくお願いします。
---
OKANO

2010年10月26日15:33 Shin-ya Koga <email@hidden>:
> サムシングプレシャスの古賀です。
>
> 岡野さん([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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>



armadillo メーリングリストの案内