Веб-представление Android “телефон”: ссылки показывают веб-страницу, не найденную

Я пытаюсь заставить свой андроид 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 часа, обыскивая положительного героя и не удался произвести любые ответы.

62
задан 2 December 2010 в 21:11

8 ответов

Хорошо, таким образом, я решил проблему, я думаю. Я просто должен был разделить переопределения 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;
}

Теперь мои обычные ссылки работают, а также ссылки телефона. Я могу также добавить там для гео-: ссылки, если я должен и это не даст мне проблему, которую я имел прежде для открытия карт по телефону.

105
ответ дан 31 October 2019 в 13:12

Вместо того, чтобы звонить 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, которые являются также не встроенным браузером. Это могло бы быть излишеством и запутаться другими установленными браузерами.

52
ответ дан 31 October 2019 в 13:12

Согласно документация и на основе моего опыта, 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;
   }
17
ответ дан 31 October 2019 в 13:12

Примечание:-После 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;
    }
9
ответ дан 31 October 2019 в 13:12

Если не будет никакого 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;
        }
    }
3
ответ дан 31 October 2019 в 13:12
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());
3
ответ дан 31 October 2019 в 13:12
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;
       }
1
ответ дан 31 October 2019 в 13:12
@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;
    }
0
ответ дан 31 October 2019 в 13:12

Другие вопросы по тегам:

Похожие вопросы: