sistema - permisos android 8 android studio
Soporte para otros protocolos en webview de Android. (6)
He creado una aplicación de vista web, la página que se muestra en el mercado cuenta con // enlaces, pero al hacer clic en ellos aparece la pantalla 404 junto con el error de que el protocolo no es compatible. He intentado buscar en la documentación pero no he podido encontrar nada relacionado con esto. Cualquier ayuda es muy apreciada.
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;
}
}
Es importante comprender cómo funciona la vista web y sus clientes (webviewclient y webchromeclient). Vaya a la http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html
En el método shouldOverrideUrlLoading () de webviewclient, puede decidir si desea abrir el enlace en un nuevo navegador o dentro de la vista web. Si no anula este método, abrirá el enlace de forma predeterminada en un nuevo navegador fuera de la aplicación de Android. Si desea abrir dentro de webview, anule el método como se muestra a continuación
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: // 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 webview y esquemas específicos fuera de webview, 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);
Para que los enlaces funcionen, debe tener la aplicación Market instalada en su dispositivo / emulador. También su aplicación necesita solicitar un permiso para acceder a la red.
UPD: como solución alternativa, puede llamar al código Java desde la vista web, por ejemplo, si genera enlaces como este:
<a href="javascript:go(''market://your.path.to.market.app'')">..</a>
Defina una función javascript llamada go ():
<script type="text/javascript">
function go(link) {
if (handler) {
handler.go(link);
} else {
document.location = link;
}
}
</script>
A continuación, puede pasar un objeto de controlador a la vista web:
webview.addJavascriptInterface(new Handler() {
@Override
public void go(String marketUrl) {
//start market intent here
}
}, "handler");
La interfaz del controlador se puede definir de la siguiente manera:
public interface Handler{
public void go(String url);
}
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;
}
}
}
Para mí, lo de JavaScript no era 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: Derive de WebViewClient
e inyecte la implementación utilizando WebView.setWebViewClient()
. Todo lo que necesita para anular 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.