Поддержка других протоколов в 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);