Я пытаюсь заставить свой андроид webview приложение открывать телефон: ссылки на телефон. Каждый раз, когда я открываю линию телефонной связи, она работает отлично и открывает телефон. Однако, после того как я сделан с моим вызовом и возвращаюсь к приложению, это на уровне страницы, которая говорит "Веб-страницу Не Найденный tel:0000000000". Затем я должен поразить кнопку "Назад" еще раз для получения до страницы, на которую я нажал номер телефона.
Существует ли способ заставить это открывать ссылку ТЕЛЕФОНА, не пытаясь найти страницу в 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 часа, обыскивая положительного героя и не удался произвести любые ответы.
Хорошо, таким образом, я решил проблему, я думаю. Я просто должен был разделить переопределения 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;
}
Теперь мои обычные ссылки работают, а также ссылки телефона. Я могу также добавить там для гео-: ссылки, если я должен и это не даст мне проблему, которую я имел прежде для открытия карт по телефону.
Вместо того, чтобы звонить 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;
}
я нашел телефон ПРОСМОТРА: работы как ожидалось над всеми телефонами мы попробовали его. Никакая потребность к особому случаю это из-за действия НАБОРА.
я заметил, что видео YouTube и т.п. не работают в WebViews, таким образом, можно хотеть обнаружить их также.
целый процесс мог, вероятно, быть обобщен для всех видов URIs запросы PackageManager для Операций, которые обрабатывают Ваш URI, которые являются также не встроенным браузером. Это могло бы быть излишеством и запутаться другими установленными браузерами.
Согласно документация и на основе моего опыта, Intent.ACTION_VIEW
превосходна для парсинга tel:
, sms:
, smsto:
, mms:
и mmsto:
ссылки.
Вот 5 в 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;
}
Примечание:-После 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;
}
Если не будет никакого WebViewClient, присвоенного веб-представлению, то веб-представлением по умолчанию попросит, чтобы менеджер по Действию выбрал надлежащий обработчик для 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;
}
}
public class MainActivity extends Activity {
private static final String HTML ="<!DOCTYPE html><html><body><a
href='tel:867-5309'>Click here to call!</a></body></html>";
private static final String TEL_PREFIX = "tel:";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView wv = (WebView) findViewById(R.id.webview);
wv.setWebViewClient(new CustomWebViewClient());
wv.loadData(HTML, "text/html", "utf-8");
}
private class CustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView wv, String url) {
if(url.startsWith(TEL_PREFIX)) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
}
return false;
}
}
}
Это было фиксацией, которую я нашел. Необходимо использовать этот метод.
wv.setWebViewClient(new CustomWebViewClient());
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;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView wv = (WebView) findViewById(R.id.webview);
wv.setWebViewClient(new CustomWebViewClient());
wv.loadData(HTML, "text/html", "utf-8");
}
private class CustomWebViewClient extends WebViewClient {
@SuppressWarnings("deprecated")
@Override
public boolean shouldOverrideUrlLoading(WebView wv, String url) {
if(url.startsWith(TEL_PREFIX)) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
}
return false;
}