Поддержка других протоколов в Android WebView

Я создал приложение для веб-просмотра, на странице которого отображаются ссылки market market://, но, щелкнув по ним, я получаю экран 404 вместе с ошибкой, что протокол не поддерживается. Я пытался просмотреть документацию, но не смог найти ничего, что связано с этим. Буду признателен за любую оказанную помощь.

7 ответов

Решение

Для меня JavaScript не был решением, так как HTML не находится под моим контролем. Так что если вам нужно контролировать это со стороны приложения, то есть относительно простое решение: WebViewClientи внедрить реализацию, используя WebView.setWebViewClient(), Все, что вам нужно переопределить в вашем WebViewClientреализация является shouldOverrideUrlLoading метод, как показано здесь:

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url != null && url.startsWith("market://")) {
        view.getContext().startActivity(
            new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        return true;
    } else {
        return false;
    }
}

Для меня это работает нормально.

НАДЕЖДА ЭТО ПОМОГАЕТ ВАМ

public boolean shouldOverrideUrlLoading(WebView view, String url) 
{
    if (url.startsWith("market://")||url.startsWith("vnd:youtube")||url.startsWith("tel:")||url.startsWith("mailto:"))
    {
        Intent intent = new Intent(Intent.ACTION_VIEW); 
        intent.setData(Uri.parse(url)); 
        startActivity(intent);
        return true;
     }
    else{
        view.loadUrl(url);
        return true;
        }
}

Чтобы ссылки работали, на вашем устройстве / эмуляторе должно быть установлено приложение market. Также вашему приложению необходимо запросить разрешение на доступ к сети.

UPD: в качестве обходного пути вы можете вызвать java-код из веб-просмотра, например, если вы генерируете ссылки вроде этого:

<a href="javascript:go('market://your.path.to.market.app')">..</a>

Определите функцию JavaScript с именем go():

<script type="text/javascript">
   function go(link) {
     if (handler) {
           handler.go(link);
         } else {
           document.location = link;
         }
   }
</script>

Затем вы можете передать объект-обработчик в WebView:

webview.addJavascriptInterface(new Handler() {
        @Override
        public void go(String marketUrl) {
                         //start market intent here
        }
    },  "handler");

Интерфейс обработчика может быть определен следующим образом:

   public interface Handler{

    public void go(String url);

}

Работа для меня:

webView = (WebView) findViewById(R.id.webView);
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND);

webView.setWebViewClient(new MyWebViewClient());
webView.getSettings().setJavaScriptEnabled(true);

webView.loadUrl("http://myweb.com");

private class MyWebViewClient extends WebViewClient {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url != null && url.startsWith("whatsapp://")) {
            view.getContext().startActivity(
                    new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        } else {
            return false;
        }
    }
}

Вместо добавления проверки для конкретной схемы, модификации решения @sven, это будет работать для всех схем

public boolean shouldOverrideUrlLoading(WebView view, String url) {
 String host= Uri.parse(url).getHost();
 if (host == null) {
    view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
    return true;
   }

   view.loadUrl(url);
   return false;
 }

Важно понимать, как работает webview и его клиенты (webviewclient и webchromeclient). Пожалуйста, пройдите http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html

В методе mustOverrideUrlLoading() веб-клиента вы можете решить, хотите ли вы открыть ссылку в новом браузере или в веб-представлении. Если вы не переопределите этот метод, он по умолчанию откроет ссылку в новом браузере вне вашего приложения для Android. Если вы хотите открыть внутри веб-просмотра, переопределите метод, как показано ниже

public boolean shouldOverrideUrlLoading(WebView view, String url) { <br>
    Log.v("activity", "INSIDE WEBVIEW CLIENT ON shouldOverrideUrlLoading");
        view.loadUrl(url);
        return false; //need to understand return value based on usage
    }

Такие схемы, как whatsapp://send? Text=Hello%20World! или market://details?id=xx.xx.xx автоматически откроет соответствующие приложения, если они открыты вне веб-просмотра и если это приложение установлено на телефоне.

Если вы хотите открыть определенные ссылки в веб-просмотре и конкретные схемы вне веб-просмотра, вам необходимо переопределить метод WebChromeClients onCreateWindow(), как описано в приведенной выше ссылке. Это должно решить цель.

Самое простое решение

 Intent newApp = new Intent(Intent.ACTION_VIEW,  Uri.parse(URL));
startActivity(newApp);
Другие вопросы по тегам