Поддержка других протоколов в Android WebView - PullRequest
19 голосов
/ 27 августа 2010

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

Ответы [ 7 ]

40 голосов
/ 01 апреля 2011

Для меня 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;
    }
}

Для меня это прекрасно работает.

1 голос
/ 09 января 2015

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

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;
        }
}
1 голос
/ 27 августа 2010

Чтобы ссылки работали, на вашем устройстве / эмуляторе должно быть установлено приложение 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);

}
0 голосов
/ 26 февраля 2019

Вместо добавления проверки для конкретной схемы, модификации решения @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;
 }
0 голосов
/ 24 июля 2015

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

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

0 голосов
/ 03 февраля 2015

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

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;
        }
    }
}
0 голосов
/ 23 апреля 2013

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

 Intent newApp = new Intent(Intent.ACTION_VIEW,  Uri.parse(URL));
startActivity(newApp);
...