これはここでの最初の質問ですが、素晴らしいアドバイスを常に読んでいます。私の問題はこれです-すべてのローカルファイルを含む WebView 内に HTML アプリがあります。それは正常に動作します。JS インターフェイスを介してサービスを呼び出そうとすると、問題が発生します。JS インターフェイスは正しく機能しており、Toast で成功する可能性がありますが、startService(intent) を実行しようとするとアプリがクラッシュします。同じ startService がメインの Java ファイルから正常に機能します。問題は文脈にあると思いますが、よくわかりません。表示されるエラーは次のとおりです。
04-25 21:09:55.923: W/dalvikvm(1516): threadid=9: thread exiting with uncaught exception (group=0x40015560)
04-25 21:10:20.033: E/AndroidRuntime(1516): FATAL EXCEPTION: WebViewCoreThread
04-25 21:10:20.033: E/AndroidRuntime(1516): java.lang.NullPointerException
04-25 21:10:20.033: E/AndroidRuntime(1516): at android.content.ContextWrapper.startService(ContextWrapper.java:336)
04-25 21:10:20.033: E/AndroidRuntime(1516): at com.tour.giants.JavaScriptInterface.playMedia(JavaScriptInterface.java:40)
04-25 21:10:20.033: E/AndroidRuntime(1516): at android.webkit.WebViewCore.nativeTouchUp(Native Method)
04-25 21:10:20.033: E/AndroidRuntime(1516): at android.webkit.WebViewCore.nativeTouchUp(Native Method)
04-25 21:10:20.033: E/AndroidRuntime(1516): at android.webkit.WebViewCore.access$3300(WebViewCore.java:54)
04-25 21:10:20.033: E/AndroidRuntime(1516): at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:1159)
04-25 21:10:20.033: E/AndroidRuntime(1516): at android.os.Handler.dispatchMessage(Handler.java:99)
04-25 21:10:20.033: E/AndroidRuntime(1516): at android.os.Looper.loop(Looper.java:123)
04-25 21:10:20.033: E/AndroidRuntime(1516): at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:630)
04-25 21:10:20.033: E/AndroidRuntime(1516): at java.lang.Thread.run(Thread.java:1019)
04-25 21:10:20.103: I/Process(1516): Sending signal. PID: 1516 SIG: 9
問題のあるコードは次のとおりです。
public class JavaScriptInterface extends Activity{
Context mContext;
/** Instantiate the interface and set the context */
JavaScriptInterface(Context c) {
mContext = c;
}
/** Show a toast from the web page */
public void playMedia(String mediaUrl) {
//THIS WORKS!
Toast.makeText(mContext, mediaUrl, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(mContext, MyService.class);
// If this is AUDIO, play the audio in the background
if(mediaUrl.endsWith(".mp3")){
intent.putExtra("music_url", mediaUrl);
//THIS CRASHES!
startService(intent);
}
}
}
最後に、ほぼ同じコードを使用してリンクをインターセプトすることにより、WebView からこのサービスを正常に開始しました。
// Create Webview client to override browser rendering url and disable address bar
private class GWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// HTML5 Audio and Video give very mixed results. Let Android handle media player
Intent intent = new Intent(getBaseContext(), MyService.class);
// If this is AUDIO, play the audio in the background
else if(url.endsWith(".mp3")){
intent.putExtra("music_url", url);
startService(intent);
}
// This isn't a video or audio file - load normally
else {
view.loadUrl(url);
}
return true;
}
}
getBaseContext()
andなどのさまざまなコンテキストを使用してみましたgetApplicationContext()
...