Подтвердить что ты не робот

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 и не дал никаких ответов.

4b9b3361

Ответ 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;
       }