web-dev-qa-db-ja.com

Android webviewでの他のプロトコルのサポート

Webビューアプリを作成しました。表示されるページにはmarket://リンクがありますが、それらをクリックすると、プロトコルがサポートされていないというエラーとともに404画面が表示されます。ドキュメントを調べてみましたが、これに関連するものは見つかりませんでした。どんな助けでも大歓迎です。

19
user319940

HTMLは私の管理下にないので、私にとってJavaScriptのことは解決策ではありませんでした。したがって、これをアプリケーション側から制御する必要がある場合は、比較的単純な解決策があります。WebViewClientから派生し、WebView.setWebViewClient()を使用して実装を挿入します。 WebViewClientimplementationでオーバーライドする必要があるのは、次に示すようにshouldOverrideUrlLoadingメソッドだけです。

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url != null && url.startsWith("market://")) {
        view.getContext().startActivity(
            new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        return true;
    } else {
        return false;
    }
}

私にとってこれはうまくいきます。

40
sven

これがあなたを助けることを願っています

public boolean shouldOverrideUrlLoading(WebView view, String url) 
{
    if (url.startsWith("market://")||url.startsWith("vnd:youtube")||url.startsWith("tel:")||url.startsWith("mailto:"))
    {
        Intent intent = new Intent(Intent.ACTION_VIEW); 
        intent.setData(Uri.parse(url)); 
        startActivity(intent);
        return true;
     }
    else{
        view.loadUrl(url);
        return true;
        }
}
1
Sathish Kumar

リンクを機能させるには、デバイス/エミュレーターにマーケットアプリをインストールする必要があります。また、アプリはネットワークにアクセスするための許可を要求する必要があります。

UPD:回避策として、たとえば次のようなリンクを生成する場合、Webビュー内からJavaコードを呼び出すことができます。

<a href="javascript:go('market://your.path.to.market.app')">..</a>

Go()という名前のJavaScript関数を定義します。

<script type="text/javascript">
   function go(link) {
     if (handler) {
           handler.go(link);
         } else {
           document.location = link;
         }
   }
</script>

次に、ハンドラオブジェクトをWebViewに渡すことができます。

webview.addJavascriptInterface(new Handler() {
        @Override
        public void go(String marketUrl) {
                         //start market intent here
        }
    },  "handler");

ハンドラーインターフェイスは次のように定義できます。

   public interface Handler{

    public void go(String url);

}
1

Webviewとそのクライアント(webviewclientとwebchromeclient)がどのように機能するかを理解することが重要です。 http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html を通過してください

WebviewclientのshouldOverrideUrlLoading()メソッドで、リンクを新しいブラウザで開くか、Webview内で開くかを決定できます。このメソッドをオーバーライドしない場合、デフォルトでは、Androidアプリケーションの外部の新しいブラウザでリンクが開きます。Webビュー内で開きたい場合は、以下のようにメソッドをオーバーライドします。

public boolean shouldOverrideUrlLoading(WebView view, String url) { <br>
    Log.v("activity", "INSIDE WEBVIEW CLIENT ON shouldOverrideUrlLoading");
        view.loadUrl(url);
        return false; //need to understand return value based on usage
    }

whatsapp:// send?text = Hello%20World!またはmarket:// details?id =のようなスキームxx.xx.xxは、対応するアプリがWebビューの外部で開かれ、そのアプリがハンドセットにインストールされている場合、それらを自動的に開きます。

Webビュー内の特定のリンクおよびWebビュー外の特定のスキームを開きたい場合は、上記のリンクで説明されているように、WebChromeClients onCreateWindow()メソッドをオーバーライドする必要があります。それは目的を解決するはずです。

0
Tarang Zilpe

私のために働く:

webView = (WebView) findViewById(R.id.webView);
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND);

webView.setWebViewClient(new MyWebViewClient());
webView.getSettings().setJavaScriptEnabled(true);

webView.loadUrl("http://myweb.com");

private class MyWebViewClient extends WebViewClient {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url != null && url.startsWith("whatsapp://")) {
            view.getContext().startActivity(
                    new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        } else {
            return false;
        }
    }
}

特定のスキームのチェックを追加する代わりに、@ svenソリューションを変更すると、これはすべてのスキームで機能します

public boolean shouldOverrideUrlLoading(WebView view, String url) {
 String Host= Uri.parse(url).getHost();
 if (Host == null) {
    view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
    return true;
   }

   view.loadUrl(url);
   return false;
 }
0
Sumit