Android WebView err_unknown_url_scheme
С помощью простого ниже кода я могу правильно загрузить свой url, но я получаю "ERR_UNKNOWN_URL_SCHEME" при попытке использовать ссылки html, которые начинаются с mailto: whatsapp: и tg: (Telegram).
Кто-нибудь может помочь мне исправить это, пожалуйста? К сожалению, я вообще не знаю Java: (
Спасибо.
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");
}
}
Ответы
Ответ 1
Вы должны установить клиента в веб-браузере и передать его намерению
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;
}
});
}
У вас может быть способ проверить, установлено ли приложение
private boolean appInstalledOrNot(String uri) {
PackageManager pm = getPackageManager();
try {
pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException e) {
}
return false;
}
Ответ 2
Вам необходимо переопределить метод shouldOverrideUrlLoading
объекта WebViewClient, в котором вы можете самостоятельно управлять передачей ссылок.
Потому что html links that starts with mailto: whatsapp: and tg: (Telegram).
не является общим URL-адресом, начинающимся с "http://" или "https://", поэтому WebView не может разобрать его в нужном месте, поэтому мы должны использовать намерение для перенаправления URL-адреса.
Например:
@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;
}
}
затем установитеWebViewClient для вашего WebView, например так:
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");
}}
Ответ 3
На самом деле WebView не умеет работать со схемами URL, такими как mailto, tg, sms, phone. Вы должны переопределить метод shouldOverrideUrlloading() и делать то, что нужно вашему веб-представлению, когда найдены схемы такого типа.
@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 (представление WebView, URL-адрес строки) устарело на уровне API 24.
Поэтому переопределите общедоступный логический shouldOverrideUrlLoading (представление WebView, запрос 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;
}
Настройте код, если вы создаете свои собственные схемы. [ ERR неизвестная схема URL в Android WebView - код Kotlin & Java]
Ответ 4
mailto
ссылки не будут загружены в ваш webview
. Вы проверите его как это в shouldOverrideUrlLoading
и обработайте его с помощью 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;
}
}
Аналогичный вопрос Android Webview ERR_UNKNOWN_URL_SCHEME Ошибка
Ответ 5
@Override
public boolean shouldOverrideUrlLoading(WebView wv, String url) {
if(url.startsWith("tel:") || url.startsWith("whatsapp:")) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
}
return false;
}
Поместите этот код в свой mWebView.setWebViewClient (новый WebViewClient(). Он будет отлично работать для всех ссылок, таких как tel:, whatsapp:, mailto: и т.д.