Android webview, запустите действие ACTION_VIEW, когда URL-адрес не может обрабатываться веб-просмотром

На самом деле я знаю, как запустить торговое приложение с помощью фильтрации URL с моим пользовательским клиентом webview, но я хочу сделать его более общим, то есть проверить каждый URL-адрес, а не только URL-адрес рынка, но также и другой протокол URL-адресов, веб-просмотр не знал бы, как с этим справиться, и запустив намерение ACTION_VIEW справиться с этим.

Я подумал, может быть, я могу проверить, не запущен ли url с "http" "https" "ftp" "mailto", если URL-адрес в этом протоколе, веб-просмотр может обрабатывать его сам по себе, для других я буду запустите новое намерение, чтобы попытаться справиться с этим.

Что вы думаете? я прав? любой отсутствующий протокол, который может обрабатывать веб-просмотр?

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url != null && url.contains("://") && url.toLowerCase().startsWith("market:")) {
                try {
                    view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                    return true;
                } catch (Exception ex) {
                }
            }
            view.loadUrl(url);
            return true;
        }
    });

Ответ 1

Один из подходов, который вы можете попробовать, - это посмотреть PackageManager.queryIntentActivities(Intent, int). Этот метод дает вам информацию обо всех действиях, которые могут обрабатывать данный Intent. Вы можете просто создать Intent и посмотреть, что он возвращает. Если вы хотите, чтобы ваш WebView имел приоритет, когда он мог обрабатывать URL-адрес, вы могли бы опционально обрабатывать любые результаты, которые включают активность браузера. Я не пробовал этот код, но он может выглядеть примерно так:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));

        List<ResolveInfo> infos = getPackageManager().queryIntentActivities(intent, 0);

        if (infos.size() == 0) {
            // apparently nothing can handle this URL
            return false;
        }

        for (ResolveInfo info : infos) {
            if (info.activityInfo.packageName.equals("com.android.browser")) {
                view.loadUrl(url);
                return true;
            }
        }

        startActivity(intent);
        return true;
    }
});