Android 4.4.2 (уровень API = 19)
У нас есть сценарий, в котором мы открываем URL в веб-просмотре в приложении для Android. Дело в том, что всплывающие окна не появляются, как они появляются в браузере. После загрузки веб-страницы в нижней части экрана появляется кнопка, при нажатии которой появляется всплывающее окно "URL-адрес хочет получить доступ к местоположению" с кнопками "Запретить и разрешить". Это поведение работает, как указано в браузере, но когда внутри загружается та же страница В Webview нет всплывающих окон, а индикатор активности просто продолжает вращаться.
Видел в различных блогах, что это работает с пользовательским клиентом webchrome. Реализация в настоящее время осуществляется следующим образом:
Код в активности для веб-просмотра:-
onCreate -
webView = (WebView) findViewById(R.id.webView_main);
WebSettings webViewSettings = webView.getSettings();
webViewSettings.setJavaScriptEnabled(true); // enable java script
webViewSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webViewSettings.setBuiltInZoomControls(true);
webViewSettings.setLoadWithOverviewMode(true);
webViewSettings.setUseWideViewPort(true);
webView.setWebChromeClient(new CustomWebChromeClient());
final String link = "URL to be accessed";
webView.loadUrl(link);
Реализация для клиентского веб-клиента является:
final class CustomWebChromeClient extends WebChromeClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(TAG, "Processing webview url click...");
if (progressbar.isShowing()) {
} else {
progressbar.show();
}
view.loadUrl(url);
return true;
}
public void onPageFinished(WebView view, String url) {
Log.i(TAG, "Finished loading URL: " + url);
if (progressbar.isShowing()) {
progressbar.dismiss();
}
if (webView.canGoBack()) {
Log.i(TAG, "button enabled");
// btnBack.setVisibility(View.VISIBLE);
// itemBack.setVisible(true);
} else {
Log.i(TAG, "button disbaled");
// btnBack.setVisibility(View.INVISIBLE);
// itemBack.setVisible(false);
}
}
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
Log.e(TAG, "Error: " + description);
Toast.makeText(DetailActivity.this, description,
Toast.LENGTH_SHORT).show();
if (progressbar.isShowing()) {
progressbar.dismiss();
}
if (webView.canGoBack()) {
Log.i(TAG, "button enabled");
// btnBack.setVisibility(View.VISIBLE);
// itemBack.setVisible(true);
} else {
Log.i(TAG, "button disbaled");
// btnBack.setVisibility(View.INVISIBLE);
// itemBack.setVisible(false);
}
}
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
super.onJsAlert(view, url, message, result);
final JsResult finalRes = result;
new AlertDialog.Builder(view.getContext())
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new AlertDialog.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
finalRes.confirm();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message,
final JsResult result) {
new AlertDialog.Builder(mContext)
.setTitle("App Titler")
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
result.confirm();
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
result.cancel();
}
}).create().show();
return true;
}
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result) {
// TODO Auto-generated method stub
System.out.println("JS prompt called");
return super.onJsPrompt(view, url, message, defaultValue, result);
}
}
Есть ли способ, которым мы можем иметь такое же поведение в веб-просмотре, как в браузере? Это связано с версией Android SDK и если да, есть ли обходной путь?
PS:- Использование Android SDK 4.4.2 (уровень API - 19)
1 ответ
Мы смогли получить всплывающее окно с информацией о местоположении в веб-представлении, используя следующий код:-
webView.setWebChromeClient(new WebChromeClient()
{
public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
}
});