Pregunta

He creado una vista de aplicación web, la página que se muestra características de mercado: // enlaces, pero al hacer clic en ellas me sale la pantalla 404 junto con el error de que el protocolo no es compatible. He intentado buscar a través de documentación, pero no pudo encontrar nada relacionado con este. Cualquier ayuda es muy apreciada.

¿Fue útil?

Solución

Para mí lo JavaScript no era una solución como el HTML no está bajo mi control. Así que si usted necesita para controlar esto desde el lado de la aplicación, entonces no es una solución relativamente simple: Derivar de WebViewClientand inyectar la implementación usando WebView.setWebViewClient(). Todo lo que necesita para anular en su WebViewClientimplementation es el método shouldOverrideUrlLoading como se muestra aquí:

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

Para mí esto funciona muy bien.

Otros consejos

Para los enlaces de trabajar que tiene que tener la aplicación Market instalado en el dispositivo / emulador. También su necesidad aplicación solicite un permiso para el acceso a la red.

UPD: Para solucionar este problema se puede llamar el código de Java desde dentro de la vista web, por ejemplo, si se generan enlaces de esta manera:

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

Definir una función de JavaScript llamado Go ():

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

A continuación, puede pasar de un objeto en el controlador de vista Web:

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

interfaz Handler se puede definir como sigue:

   public interface Handler{

    public void go(String url);

}

Espero que esto ayude

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

El trabajo para mí:

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

Es importante entender cómo funciona la vista web y sus clientes (webviewclient y webchromeclient). Por favor, vaya a través de la http://therockncoder.blogspot.in/2014/04 /understanding-androids-webchromeclient.html

En el método de la webviewclient shouldOverrideUrlLoading (), puede decidir si desea abrir el enlace en una nueva navegador o dentro de la vista web. Si no reemplazar este método, será por defecto abierto el enlace en una nueva fuera del navegador de la aplicación de Android. Si desea abrir en vista web, reemplazar el método de la siguiente manera

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
    }

Esquemas como WhatsApp: // enviar texto = Hola% 20World o mercado: // details? Id = xx.xx.xx se abrirán las aplicaciones correspondientes de forma automática si se abren fuera de la vista web y si esa aplicación está instalada en el teléfono.

Si desea abrir ciertos enlaces dentro de los planes específicos y WebView WebView exterior, se debe redefinir WebChromeClients onCreateWindow () método como se explica en el enlace que aparece más arriba. Debe resolver el propósito.

En lugar de añadir cheque de esquema en particular, la modificación de solución @sven, esto funcionará para todos los esquemas

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

solución más simple

 Intent newApp = new Intent(Intent.ACTION_VIEW,  Uri.parse(URL));
startActivity(newApp);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top