Android WebViewの他のプロトコルのサポート
-
01-10-2019 - |
質問
表示されているページである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);