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