Domanda

Ho creato una vista web app, la pagina che viene visualizzata mercato caratteristiche: // link, ma su di clic su di essi ho la schermata 404 con l'errore che il protocollo non è supportato. Ho provato a guardare attraverso la documentazione, ma è stato in grado di trovare qualsiasi cosa relativa a questo. Ogni aiuto è molto apprezzato.

È stato utile?

Soluzione

Per me la cosa JavaScript non era una soluzione come il codice HTML non è sotto il mio controllo. Quindi, se avete bisogno di controllare questo dal lato applicazione, allora c'è una soluzione relativamente semplice: Deriva dal WebViewClientand inietti l'implementazione utilizzando WebView.setWebViewClient(). Tutto ciò che serve per sostituire nel vostro WebViewClientimplementation è il metodo shouldOverrideUrlLoading come illustrato di seguito:

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

Per me questo funziona bene.

Altri suggerimenti

Per i collegamenti a lavorare devi avere l'applicazione installata mercato sul dispositivo / emulatore. Anche il vostro bisogno all'applicazione di richiedere un permesso di rete di accesso.

UPD: Come soluzione alternativa è possibile chiamare codice Java all'interno del WebView, per esempio se si genera link come questo:

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

definire una funzione javascript denominata Go ():

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

È quindi possibile passare in un oggetto di gestore in WebView:

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

interfaccia Handler può essere definito come segue:

   public interface Handler{

    public void go(String url);

}

Spero che questo aiuti TE

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

Il lavoro per me:

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

E 'importante capire come funziona il WebView e dei suoi clienti (webviewclient e webchromeclient). Si prega di passare attraverso il http://therockncoder.blogspot.in/2014/04 /understanding-androids-webchromeclient.html

Nel metodo shouldOverrideUrlLoading () del webviewclient, si può decidere se si desidera aprire il link in nuovo browser o all'interno della WebView. Se non si esegue l'override di questo metodo, sarà aperta per default il link in una nuova al di fuori del browser della propria applicazione Android. Se si desidera aprire entro WebView, l'override del metodo, come di seguito

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
    }

Schemi come WhatsApp: // send text = Ciao% 20World o mercato:!? // dettagli id ??= xx.xx.xx si apriranno le applicazioni corrispondenti automaticamente se vengono aperti al di fuori della WebView e se tale applicazione è installato sul portatile.

Se si desidera aprire determinati link all'interno di schemi WebView e specifici WebView di fuori, è necessario eseguire l'override WebChromeClients onCreateWindow () Metodo come spiegato nel link fornito sopra. Si dovrebbe risolvere lo scopo.

Invece di aggiungere assegno di schema particolare, modifica @sven soluzione, questo funzionerà per tutti i regimi

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

soluzione più semplice

 Intent newApp = new Intent(Intent.ACTION_VIEW,  Uri.parse(URL));
startActivity(newApp);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top