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.

Était-ce utile?

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 WebViewClientand injectent en utilisant WebView.setWebViewClient(). Tout ce que vous devez remplacer dans votre WebViewClientimplementation 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top