Frage

Ich habe ein Web-Ansicht App erstellt, die Seite, die Funktionen Markt angezeigt wird: // Links aber sie beim Klicken erhalte ich den 404-Bildschirm zusammen mit dem Fehler, dass das Protokoll nicht unterstützt wird. Ich habe versucht, durch Dokumentation suchen, aber konnte nichts diesbezüglich finden. Jede Hilfe ist sehr geschätzt.

War es hilfreich?

Lösung

Für mich ist die JavaScript Sache war keine Lösung, wie die HTML nicht unter meiner Kontrolle. Also, wenn Sie dieses von der Anwendungsseite steuern müssen, dann ist es eine relativ einfache Lösung: Derive von WebViewClientand inject der Umsetzung mit WebView.setWebViewClient(). Alles, was Sie in Ihrem WebViewClientimplementation außer Kraft setzen müssen, ist die shouldOverrideUrlLoading Methode wie hier gezeigt:

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

Für mich funktioniert.

Andere Tipps

Für die Links arbeiten Sie den Market-App auf Ihrem Gerät / Emulator installiert haben müssen. Auch Ihre Anwendung Notwendigkeit, eine Berechtigung zum Zugriff auf Netzwerk anzufordern.

UPD: Zur Umgehung des Problems Sie Java-Code aus der Webansicht, zum Beispiel aufrufen können, wenn Sie Links wie folgt erzeugen:

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

Definieren Sie einen JavaScript-Funktion namens go ():

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

Sie können dann in einem Handler-Objekt in die WebView übergeben:

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

Handler-Schnittstelle kann wie folgt definiert werden:

   public interface Handler{

    public void go(String url);

}

this helps YOU

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

Arbeit für mich:

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

It is important to understand how the webview and its clients (webviewclient and webchromeclient) works. Please go through the http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html

In the webviewclient's shouldOverrideUrlLoading() method, you can decide if you want to open the link in new browser or within the webview. If you don't override this method, it will by default open the link in a new browser outside of the your android application. If you want to open within webview, override the method as below

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
    }

Schemes like whatsapp://send?text=Hello%20World! or market://details?id=xx.xx.xx will open the corresponding apps automatically if they are opened outside the webview and if that app is installed on the handset.

If you want to open certain links within webview and specific schemes outside webview, you need to override WebChromeClients onCreateWindow() method as explained in the link provided above. It should solve the purpose.

Instead of adding check for particular scheme, Modifying @sven solution, this will work for all schemes

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

Simplest solution

 Intent newApp = new Intent(Intent.ACTION_VIEW,  Uri.parse(URL));
startActivity(newApp);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top