Avec le simple code ci-dessous, je peux obtenir mon URL chargée correctement, mais je reçois le message "ERR_UNKNOWN_URL_SCHEME" lorsque j'essaie d'exploiter les liens html commençant par mailto: whatsapp: et tg: ( Télégramme).
Quelqu'un peut m'aider à résoudre ce problème s'il vous plaît? Malheureusement, je ne connais pas du tout Java :(
Merci.
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");
}
}
Vous devez définir un client dans la vue Web et les transmettre à une intention.
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;
}
});
}
Vous pouvez avoir une méthode pour vérifier si l'application est installée
private boolean appInstalledOrNot(String uri) {
PackageManager pm = getPackageManager();
try {
pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException e) {
}
return false;
}
En fait, WebView ne fonctionne pas avec les schémas d'URL tels que mailto, tg, sms, phone. Vous devez remplacer la méthode shouldOverrideUrlloading () et faire ce que votre vue Web doit faire lorsque ce type de système est trouvé.
@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 (vue WebView, String url) était obsolète dans le niveau 24 de l'API.
Donc, remplacez public boolean shouldOverrideUrlLoading (vue WebView, demande 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;
}
Personnalisez le code si vous créez vos propres schémas . Plus d'infos [Code Kotlin & Java]
Vous devez remplacer la méthode shouldOverrideUrlLoading
de WebViewClient dans laquelle vous pouvez contrôler vous-même le transfert de lien.
Étant donné que html links that starts with mailto: whatsapp: and tg: (Telegram).
n’est pas une URL commune, commencez par «http: //» ou «https: //». WebView ne peut donc pas l’analyser au bon endroit. Nous devrions utiliser l’intention de rediriger l’URL.
Par exemple:
@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;
}
}
puis définissez WebViewClient sur votre WebView, comme ceci:
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");
}}
Les liens mailto
ne seront pas chargés dans votre webview
.Vous devez le vérifier comme ceci dans shouldOverrideUrlLoading
et le manipuler avec 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;
}
}
Question similaire Android Webview ERR_UNKNOWN_URL_SCHEME Erreur