Я создал приложение для веб-просмотра, на странице, на которой отображаются функции market://links, но после нажатия на них я получаю экран 404 вместе с ошибкой, что протокол не поддерживается. Я попытался просмотреть документацию, но не смог найти что-либо, связанное с этим. Любая помощь очень ценится.
Поддержка других протоколов в веб-браузере Android
Ответ 1
Для меня проблема 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;
}
}
Для меня это прекрасно работает.
Ответ 2
Для ссылок на работу у вас должно быть установлено приложение на вашем устройстве/эмуляторе. Также ваше приложение должно запросить разрешение на доступ к сети.
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);
}
Ответ 3
НАДЕЖДА ЭТО ПОМОГАЕТ ВАМ
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;
}
}
Ответ 4
Работайте со мной:
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;
}
}
}
Ответ 5
Важно понимать, как работает веб-просмотр и его клиенты (webviewclient и webchromeclient). Пожалуйста, просмотрите http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html
В методе webviewclient shouldOverrideUrlLoading() вы можете решить, хотите ли вы открыть ссылку в новом браузере или в веб-просмотре. Если вы не переопределите этот метод, он по умолчанию откроет ссылку в новом браузере вне вашего приложения для Android. Если вы хотите открыть в webview, переопределите метод, как показано ниже
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(), как описано в приведенной выше ссылке. Он должен решить эту задачу.
Ответ 6
Простейшее решение
Intent newApp = new Intent(Intent.ACTION_VIEW, Uri.parse(URL));
startActivity(newApp);