Le support d'autres protocoles dans WebView Android
-
01-10-2019 - |
Question
J'ai créé une application d'affichage Web, la page affichée caractéristiques du marché: // liens, mais sur en cliquant dessus je reçois le 404 écran avec l'erreur que le protocole ne soit pas pris en charge. J'ai essayé de regarder à travers la documentation, mais a été incapable de trouver tout ce qui concerne ce sujet. Toute aide est très appréciée.
La solution
Pour moi, la chose JavaScript n'était pas une solution que le HTML n'est pas sous mon contrôle. Donc, si vous avez besoin de contrôler ce du côté de l'application, puis il y a une solution relativement simple: Derive de la mise en œuvre WebViewClient
and injectent en utilisant WebView.setWebViewClient()
. Tout ce que vous devez remplacer dans votre WebViewClient
implementation est la méthode shouldOverrideUrlLoading
comme indiqué ici:
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;
}
}
Pour moi, cela fonctionne très bien.
Autres conseils
Pour les liens pour vous travailler doivent avoir l'application du marché installé sur votre appareil / émulateur. De plus, votre besoin d'application pour demander une autorisation d'accès au réseau.
UPD: comme vous pouvez appeler solution de contournement du code Java à partir du WebView, par exemple, si vous créez des liens comme ceci:
<a href="javascript:go('market://your.path.to.market.app')">..</a>
Définir une fonction javascript go nommé ():
<script type="text/javascript">
function go(link) {
if (handler) {
handler.go(link);
} else {
document.location = link;
}
}
</script>
Vous pouvez alors passer dans un objet de gestionnaire dans le WebView:
webview.addJavascriptInterface(new Handler() {
@Override
public void go(String marketUrl) {
//start market intent here
}
}, "handler");
L'interface gestionnaire peut être définie comme suit:
public interface Handler{
public void go(String url);
}
L'ESPOIR CE QUE VOUS PERMET
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;
}
}
Le travail pour moi:
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;
}
}
}
Il est important de comprendre comment le WebView et ses clients (webviewclient et webchromeclient) fonctionne. S'il vous plaît passer par le http://therockncoder.blogspot.in/2014/04 /understanding-androids-webchromeclient.html
vous pouvez Dans la méthode shouldOverrideUrlLoading () de webviewclient, décider si vous voulez ouvrir le lien dans nouveau navigateur ou dans le WebView. Si vous ne remplacez pas cette méthode, elle par défaut ouvrir le lien dans une nouvelle en dehors du navigateur de votre application Android. Si vous souhaitez ouvrir dans les WebView, remplacer la méthode comme ci-dessous
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
}
Régimes comme WhatsApp: // Envoyer un message texte = Bonjour% 20World ou marché: // details? Id = xx.xx.xx ouvrir les applications correspondantes automatiquement si elles sont ouvertes en dehors de la WebView et si cette application est installée sur le combiné.
Si vous voulez ouvrir certains liens dans les régimes WebView et particuliers en dehors WebView, vous devez remplacer la méthode WebChromeClients onCreateWindow () comme expliqué dans le lien fourni ci-dessus. Il faut résoudre le but.
Au lieu d'ajouter chèque de régime particulier, la modification solution @sven, cela fonctionnera pour tous les régimes
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;
}
solution Simplest
Intent newApp = new Intent(Intent.ACTION_VIEW, Uri.parse(URL));
startActivity(newApp);