質問

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

役に立ちましたか?

解決

私にとって、JavaScriptのことは解決策ではありませんでした。HTMLは私の管理下にありません。したがって、アプリケーション側からこれを制御する必要がある場合、比較的単純な解決策があります。 WebViewClient使用を使用して実装を挿入します WebView.setWebViewClient(). 。あなたがあなたを無効にするために必要なすべて WebViewClient実装はです 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;
    }
}

私にとってこれは正常に機能します。

他のヒント

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

UPD:回避策として、このようなリンクを生成する場合、WebView内から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);

}

これがあなたに役立つことを願っています

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;
        }
}

私のために働く:

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;
        }
    }
}

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

WebViewClientのsefloverrideurlloading()メソッドでは、新しいブラウザーまたはWebView内でリンクを開くかどうかを判断できます。このメソッドをオーバーライドしないと、デフォルトでは、Androidアプリケーションの外側の新しいブラウザでリンクを開きます。 WebView内で開きたい場合は、以下のようにメソッドをオーバーライドします

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! また 市場://詳細?id = xx.xx.xx WebViewの外側で開かれ、そのアプリがハンドセットにインストールされている場合、対応するアプリを自動的に開きます。

WebView内の特定のリンクとWebView外の特定のスキームを開く場合は、上記のリンクで説明したように、WebChromeClients OnCreateWIndow()メソッドをオーバーライドする必要があります。目的を解決する必要があります。

特定のスキームのチェックを追加する代わりに、@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;
 }

最も単純なソリューション

 Intent newApp = new Intent(Intent.ACTION_VIEW,  Uri.parse(URL));
startActivity(newApp);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top