Android WebView "tel:" ссылки показывают, что веб-страница не найдена
Я пытаюсь открыть приложение Android для Android, чтобы открыть tel: ссылки на телефон. Каждый раз, когда я открываю телефонную связь, он отлично работает и открывает телефон. Однако, как только я закончил свой звонок и вернусь к приложению, он находится на странице с надписью "Веб-страница не найдена тел: 0000000000". Затем мне нужно снова нажать кнопку "Назад", чтобы перейти на страницу, на которую я нажал номер телефона.
Есть ли способ заставить его открыть ссылку TEL, не пытаясь найти страницу в веб-браузере, а также открыть ее на телефоне?
Это код, который я использую в WebView для переопределения его обработки ссылок TEL и Mailto:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("mailto:") || url.startsWith("tel:")) {
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(url));
startActivity(intent);
}
view.loadUrl(url);
return true;
}
Любая помощь будет оценена по достоинству. Я провел последние 2 часа чистки goodle и не дал никаких ответов.
Ответы
Ответ 1
ОК, поэтому я решил проблему, я думаю. Мне просто нужно было отделить переопределения URL следующим образом:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("tel:")) {
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
startActivity(intent);
view.reload();
return true;
}
view.loadUrl(url);
return true;
}
Теперь мои регулярные ссылки работают так же, как и tel-ссылки. Я также могу добавить туда для geo: ссылки, если мне это нужно, и это не даст мне проблему, которую я имел раньше, чтобы открыть карты на телефоне.
Ответ 2
Вместо вызова loadUrl(url)
просто верните false для URL-адресов, которые не должны быть переопределены:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if( URLUtil.isNetworkUrl(url) ) {
return false;
}
// Otherwise allow the OS to handle it
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity( intent );
return true;
}
Я нашел ПРОСМОТР ТЕЛЕВИДЕНИЯ: работает так, как ожидалось, на всех телефонах, с которыми мы его пробовали. Нет необходимости в специальном случае из-за действия DIAL.
Я заметил, что видеоролики YouTube и т.д. не работают в WebViews, поэтому вы также можете их обнаружить.
Весь процесс, вероятно, может быть обобщен для всех видов URI запросов к PackageManager для действий, которые обрабатывают ваш URI, которые также не являются встроенными браузер. Это может быть излишним и запутать другие установленные браузеры.
Ответ 3
В соответствии с документацией и на основе моего опыта Intent.ACTION_VIEW
отлично подходит для синтаксического анализа tel:
, sms:
, smsto:
, mms:
и mmsto:
.
Здесь a 5 in 1:
@Override
public boolean shouldOverrideUrlLoading(WebView webview, String url)
{
if (url.startsWith("tel:") || url.startsWith("sms:") || url.startsWith("smsto:") || url.startsWith("mms:") || url.startsWith("mmsto:"))
{
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url));
startActivity(intent);
return true;
}
return false;
}
Ответ 4
Примечание. - После того, как Android Nouget shouldOverrideUrlLoading
устарел
Для лучшей поддержки вам нужно использовать shouldOverrideUrlLoading
вместе с shouldOverrideUrlLoading
. Также вы можете проверить, имеют ли url mailto:
или tel
:, которые используются в HTML5 для запуска почтового клиента и телефонного набора соответственно.
Теперь будет выполнено полное решение
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("mailto:")) {
//Handle mail Urls
startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse(url)));
} else if (url.startsWith("tel:")) {
//Handle telephony Urls
startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url)));
} else {
view.loadUrl(url);
}
return true;
}
@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
final Uri uri = request.getUrl();
if (uri.toString().startsWith("mailto:")) {
//Handle mail Urls
startActivity(new Intent(Intent.ACTION_SENDTO, uri));
} else if (uri.toString().startsWith("tel:")) {
//Handle telephony Urls
startActivity(new Intent(Intent.ACTION_DIAL, uri));
} else {
//Handle Web Urls
view.loadUrl(uri.toString());
}
return true;
}
Ответ 5
Если WebViewClient не присвоен WebView, по умолчанию WebView попросит Activity Manager выбрать правильный обработчик для URL-адреса. Если предоставляется WebViewClient, вы должны обрабатывать разные URL-адреса самостоятельно и возвращает true в WebViewClient.shouldOverrideUrlLoading(), в противном случае он попытается отправить запрос на URL-адрес и получить сообщение об ошибке, а затем вызывает onReceiveError().
Проверить документ: WebViewClient.shouldOverrideUrlLoading
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("tel:")) {
// ...TODO: launch a Dial app or send SMS or add to contact, etc...
return true;
}
else if (url.startsWith("mailto:")) {
// ...TODO: send email to someone or add to contact, etc...
return true;
}
else {
// ...TODO: Handle URL here
boolean handled = yourHandleUrlMethod(url);
return handled;
}
}
Ответ 6
public boolean shouldOverrideUrlLoading(WebView view, String url)
{Uri query_string=Uri.parse(url);
String query_scheme=query_string.getScheme();
String query_host=query_string.getHost();
if ((query_scheme.equalsIgnoreCase("https") || query_scheme.equalsIgnoreCase("http"))
&& query_host!=null && query_host.equalsIgnoreCase(Uri.parse(URL_SERVER).getHost())
&& query_string.getQueryParameter("new_window")==null
)
{return false;//handle the load by webview
}
try
{Intent intent=new Intent(Intent.ACTION_VIEW, query_string);
String[] body=url.split("\\?body=");
if (query_scheme.equalsIgnoreCase("sms") && body.length>1)
{intent=new Intent(Intent.ACTION_VIEW, Uri.parse(body[0]));
intent.putExtra("sms_body", URLDecoder.decode(body[1]));
}
view.getContext().startActivity(intent);//handle the load by os
}
catch (Exception e) {}
return true;
}