Soporte para otros protocolos en la vista web de Android

Creé una aplicación de vista web, la página que se muestra tiene las características market: // links pero al hacer clic en ellos aparece la pantalla 404 junto con el error de que el protocolo no es compatible. Intenté revisar la documentación pero no pude encontrar nada relacionado con esto. Cualquier ayuda es muy apreciada.

Para mí, lo de JavaScript no fue una solución, ya que el HTML no está bajo mi control. Entonces, si necesita controlar esto desde el lado de la aplicación, entonces hay una solución relativamente simple: derivar de WebViewClient e inyectar la implementación usando WebView.setWebViewClient() . Todo lo que necesita sobrescribir en su implementación de WebViewClient 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 bien.

Para que los enlaces funcionen, debe tener instalada la aplicación de mercado en su dispositivo / emulador. Además, su aplicación debe solicitar un permiso para acceder a la red.

UPD: como solución, puede llamar al código Java desde la vista web, por ejemplo, si genera enlaces como este:

 .. 

Defina una función javascript llamada go ():

  

Luego puede pasar un objeto controlador a WebView:

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

La interfaz del manejador se puede definir de la siguiente manera:

  public interface Handler{ public void go(String url); } 

ESPERO QUE ESTO TE 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; } } 

Trabaja para mi:

 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 comprender cómo funciona la vista web y sus clientes (webviewclient y webchromeclient). Por favor, vaya a través del http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html

En el método de webViewclient shouldOverrideUrlLoading (), puede decidir si desea abrir el enlace en un navegador nuevo o dentro de la vista web. Si no anula este método, abrirá de forma predeterminada el enlace en un nuevo navegador fuera de la aplicación de Android. Si desea abrir dentro de la vista web, anule el método de la siguiente manera

 public boolean shouldOverrideUrlLoading(WebView view, String url) { 
Log.v("activity", "INSIDE WEBVIEW CLIENT ON shouldOverrideUrlLoading"); view.loadUrl(url); return false; //need to understand return value based on usage }

Esquemas como whatsapp: // send? Text = Hello% 20World! o market: // details? id = xx.xx.xx abrirá las aplicaciones correspondientes automáticamente 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 la vista web y esquemas específicos fuera de la vista web, debe anular el método WebChromeClients onCreateWindow () como se explica en el enlace proporcionado anteriormente. Debería resolver el propósito.

La solución más simple

  Intent newApp = new Intent(Intent.ACTION_VIEW, Uri.parse(URL)); startActivity(newApp);