studio example codigo android html webview

example - Android WebView err_unknown_url_scheme



webview android youtube (4)

Con el siguiente código simple, puedo cargar mi url correctamente, pero obtengo "ERR_UNKNOWN_URL_SCHEME" cuando trato de tocar enlaces html que comienzan con mailto: whatsapp: y tg: (Telegram).

¿Alguien puede ayudarme a arreglar esto, por favor? Lamentablemente, no conozco Java en absoluto :(

Gracias.

import android.app.Activity; import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends Activity { private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = (WebView) findViewById(R.id.activity_main_webview); // Force links and redirects to open in the WebView instead of in a browser mWebView.setWebViewClient(new WebViewClient()); // Enable Javascript WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); // Use remote resource mWebView.loadUrl("http://myexample.com"); } }


Debe configurar un cliente en la vista web y pasarlos a un intento

webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if( URLUtil.isNetworkUrl(url) ) { return false; } if (appInstalledOrNot(url)) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity( intent ); } else { // do something if app is not installed } return true; } }); }

Puede tener un método para verificar si la aplicación está instalada

private boolean appInstalledOrNot(String uri) { PackageManager pm = getPackageManager(); try { pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); return true; } catch (PackageManager.NameNotFoundException e) { } return false; }


En realidad, WebView no funciona con esquemas de URL como mailto, tg, sms, phone. Debe anular el método shouldOverrideUrlloading () y hacer lo que su vista web debe hacer cuando se encuentran este tipo de esquemas.

@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if( URLUtil.isNetworkUrl(url) ) { return false; } try { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); }catch(ActivityNotFoundException e) { Log.e("AndroiRide",e.toString()); Toast.makeText(MainActivity.this,"No activity found",Toast.LENGTH_LONG).show(); } return true; }

shouldOverrideUrlLoading (vista WebView, String url) quedó en desuso en el nivel 24 de API.

Por lo tanto, anule public boolean shouldOverrideUrlLoading (vista WebView, solicitud WebResourceRequest)

@RequiresApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url=request.getUrl().toString(); if( URLUtil.isNetworkUrl(url) ) { return false; } try { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); }catch(ActivityNotFoundException e) { Log.e("AndroiRide",e.toString()); Toast.makeText(MainActivity.this,"No activity found",Toast.LENGTH_LONG).show(); } return true; }

Personalice el código si crea sus propios esquemas. [ ERR Esquema de URL desconocido en Android WebView - Kotlin y código Java]


mailto enlaces de mailto no se webview en su vista webview . webview verificarlo así en shouldOverrideUrlLoading y manejarlo con intent .

public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("mailto:")) { Intent share = new Intent(Intent.ACTION_SEND); share.setType("text/plain"); share.putExtra(Intent.EXTRA_TEXT, message); startActivity(Intent.createChooser(share, "Title of the dialog the system will open")); view.reload(); return true; } }

Pregunta similar Android Webview ERR_UNKNOWN_URL_SCHEME Error


shouldOverrideUrlLoading anular el método shouldOverrideUrlLoading de WebViewClient en el que puede controlar la transferencia de enlaces usted mismo.

Porque html links that starts with mailto: whatsapp: and tg: (Telegram). no es común que la url comience con "http: //" o "https: //", por lo que WebView no puede analizarla en el lugar correcto, debemos usar la intención de redirigir la url.

Por ejemplo:

@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url == null || url.startsWith("http://") || url.startsWith("https://")) return false; try { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); view.getContext().startActivity(intent); return true; } catch (Exception e) { Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e); return true; } }

luego establezcaWebViewClient en su WebView, así:

public class MainActivity extends Activity { private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = (WebView) findViewById(R.id.activity_main_webview); // Force links and redirects to open in the WebView instead of in a browser mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url == null || url.startsWith("http://") || url.startsWith("https://")) return false; try { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); view.getContext().startActivity(intent); return true; } catch (Exception e) { Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e); return true; } } }); // Enable Javascript WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); // Use remote resource mWebView.loadUrl("http://myexample.com"); }}