Веб-просмотр на Android, запустите действие ACTION_VIEW, когда URL-адрес не может быть обработан веб-просмотром - PullRequest
10 голосов
/ 13 июня 2011

На самом деле я знаю, как запустить маркетинговое приложение с помощью фильтрации URL-адресов с помощью своего пользовательского клиента веб-просмотра, но я хочу сделать его более общим, то есть проверять каждый 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 Ответ

6 голосов
/ 15 июня 2011

Один из подходов, которые вы можете попробовать, - взглянуть на 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;
    }
});
...