Android 4.4.2(api级别= 19)Webview问题

标签 android android-webview android-4.4-kitkat android-websettings

我们有一个场景,我们在 Android 应用程序的 Web View 中打开 URL。问题是没有像浏览器中那样出现弹出窗口。加载网页后,会有一个按钮,单击该按钮时,屏幕底部会弹出“URL 想要访问位置”,并带有拒绝和允许按钮。此行为如浏览器中提到的那样工作,但是当在内部加载相同的页面时Webview 没有弹出窗口, Activity 指示器一直旋转。

在各种博客中看到这适用于自定义 webchrome 客户端。目前完成的实现如下:-

webview Activity 中的代码:-

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);  

自定义 webchrome 客户端的实现是:-

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);
    }
}

有什么方法可以让我们在 webview 中拥有像在浏览器中一样的行为吗?这是否与 android sdk 版本有关,如果是,有什么解决方法吗?

P.S:- 使用 android SDK 4.4.2(API 级别 - 19)

最佳答案

我们能够使用以下代码在 webview 中获取与位置相关的弹出窗口:-

webView.setWebChromeClient(new WebChromeClient()
        {
            public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) {
                callback.invoke(origin, true, false);
            }
        });

关于Android 4.4.2(api级别= 19)Webview问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26096404/

相关文章:

android - 是否可以将相对布局的子项对齐到另一个子项的顶部?

android - 为什么在android中绘图有时会显示不同

android - 如何在android中的所有 Activity 中实现抽屉导航

java - 为什么 android 启动画面不显示在 kitkat 和旧设备的横向方向上?

android - 为了在静态内部类中引用我的自定义 View ,WeakReference 是一个好的类型吗?

android - 如何解决 "Remediation for JavaScript Interface Injection Vulnerability"?

android - 在 webview android 中单击图像时触发操作?

javascript - Android WebView 和执行 javascript

android - PJSUA2 无法从 Android 6.0.1 调用电话

android - NotificationListenerService with RemoteController.OnClientUpdateListener 在 API18 (4.3) 上崩溃