标签: android-webview

拦截并覆盖来自WebView的HTTP请求

我的应用程序中有一个WebView,其中一些站点被打开(总是相同的,它是我自己的页面).该站点有一些JS代码,可以从远程主机加载一些图像.

我想截取对这些图像的请求(通过URL模式)并返回我自己的内容(即另一个图像),或者根据内部应用程序逻辑保持请求不变.

有可能吗?

编辑:目前的问题状态......

WebView有能力设置WebViewClient(如Axarydax所述).WebViewClient有两个有用的方法

  • shouldOverrideUrlLoading
  • onLoadResource

shouldOverrideUrlLoading能够拦截任何URL加载,如果加载是由页面交互触发的(即单击页面上的链接,WebView.loadURL("")不会触发此方法).它还可以通过返回false来取消URL加载.这种方法不可用,导致'它无法拦截页面资源的加载(和图像,我需要拦截的是这样的页面资源).

onLoadResource每次加载页面资源(和图像!thx到jessyjones)时都会触发,但是没有办法取消它.这使得这种方法也不适合我的任务.

android android-webview webviewclient

60
推荐指数
4
解决办法
10万
查看次数

在实施onReceivedSslError时,Webview会避免谷歌播放的安全警报

我有一个链接将在webview中打开.问题是它不能打开,直到我覆盖onReceivedSslError,如下所示:

 @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed();
        }
Run Code Online (Sandbox Code Playgroud)

我从谷歌游戏获得安全警报说:

安全警报您的应用程序具有WebViewClient.onReceivedSslError处理程序的不安全实现.具体来说,该实现忽略了所有SSL证书验证错误,使您的应用程序容易受到中间人攻击.攻击者可以使用JavaScript更改受影响的WebView内容,读取传输的数据(例如登录凭据),以及在应用程序内部执行代码.

要正确处理SSL证书验证,只要服务器提供的证书符合您的期望,就更改代码以调用SslErrorHandler.proceed(),否则调用SslErrorHandler.cancel().包含受影响的应用和类别的电子邮件警报已发送到您的开发者帐户地址.

请尽快解决此漏洞并增加已升级APK的版本号.有关SSL错误处理程序的更多信息,请参阅开发人员帮助中心中的文档.对于其他技术问题,您可以发布到https://www.stackoverflow.com/questions并使用标签"android-security"和"SslErrorHandler."如果您使用的是负责此操作的第三方库,请通知第三方并与他们合作解决问题.

要确认您已正确升级,请将更新后的版本上传到开发者控制台,并在五小时后再回来查看.如果应用尚未正确升级,我们将显示警告.

请注意,虽然这些特定问题可能不会影响使用WebView SSL的每个应用程序,但最好保持所有安全补丁的最新状态.如果应用程序存在漏洞,使用户面临泄密风险,则可能会被视为违反内容政策和开发者分发协议第4.4节的危险产品.

请确保发布的所有应用均符合开发者分发协议和内容政策.如果您有任何疑问或疑虑,请通过Google Play开发者帮助中心与我们的支持小组联系.

如果我删除onReceivedSslError (handler.proceed()),则页面将无法打开.

无论如何我可以在webview中打开页面并避免安全警报.

android android-webview google-play android-security sslerrorhandler

58
推荐指数
6
解决办法
4万
查看次数

Android - WebView语言在Android N上突然改变

我有一个多语言的应用程序与主要语言英语和第二语言阿拉伯语.

文档中所述,

  • android:supportsRtl="true"在清单中添加了.
  • 我已经改变了所有XML属性与leftright属性start,并end分别.
  • 我已添加阿拉伯语言字符串strings-ar(和其他资源类似).

以上设置正常.改变后的Localear-AE,阿拉伯文字和资源都正确地显示在我的活动.

但是,每次我导航到Activitya WebView 和/或a时WebViewClient,语言环境,文本和布局方向都会突然恢复为设备默认值.

进一步提示:

  • 在具有Android 7.0的Nexus 6P上发生.一切都在Android 6.0.1及更低版本上正常运行.
  • 只有当我导航到Activity有a WebView和/或a WebViewClient(并且我有几个)时才会发生语言环境的突然转变.它不会发生在任何其他活动上.

Android 7.0具有多语言环境支持,允许用户设置多个默认语言环境.因此,如果我将主要区域设置为Locale.UK:

在此输入图像描述

然后在导航到时WebView,语言环境从更改ar-AEen-GB.

Android 7.0 API更改:

API更改列表中所示,API 24中的以下类中添加了与语言环境相关的新方法:

Locale:

Configuration:

但是,我正在使用API​​ 23构建我的应用程序,并且我没有使用任何这些新方法.

此外......

  • 问题也出现在Nexus …

android locale android-webview android-7.0-nougat android-chrome

57
推荐指数
4
解决办法
1万
查看次数

我怎么知道我的WebView 100%加载?

我正在尝试在我的WebView中加载一些包含JavaScript的HTML代码.

现在,我想测试我的WebView是否在5秒之前加载.我已经尝试过这种方法getProgress(),但有时我得到的结果是100,但我的Webview没有加载.
有没有其他方法可以确保我的Webview 100%加载?

这是我的代码的一部分:

sdk.getWebView().loadDataWithBaseURL("notreal/", data_html,MIME_TYPE,ENCODING_UTF_8,null);

Timer timer = new Timer();
TimerTask task = new TimerTask() {

    @Override
    public void run(){                      
    Log.i("TAG", "progress fin = "+sdk.getWebView().getProgress());

    if(sdk.getWebView().getProgress() <100){
        //cancel the webView
        sdk.getContext().runOnUiThread(new Runnable() {
             @Override
             public void run() {
            sdk.getImgView().setVisibility(View.VISIBLE);
            sdk.getWebView().setVisibility(View.GONE);
             }
        });
    }

    // else ,the Webview is loaded
    else{
        //prepare webview 
        sdk.getContext().runOnUiThread(new Runnable() {
            @Override
            public void run(){
                     // hide imageView
                     sdk.getImgView().setVisibility(View.GONE);
                     sdk.getWebView().setVisibility(View.VISIBLE);
            }
        });
    }

 }
 };
 timer.schedule(task, 5000);
Run Code Online (Sandbox Code Playgroud)

android android-webview

54
推荐指数
5
解决办法
7万
查看次数

Android - 在webview中登录后提取cookie

我有一个在webview中打开URL的应用程序,然后用户必须通过webview登录到站点并在登录后收到cookie.我在登录后遇到cookie时遇到问题.

问题是,我可以使用android.webkit.CookieManager实现这一点,并在一个字符串中输出所有cookie.

但是,我想使用cookie存储(如在java.net.CookieStore中)实现它,所以我需要使用java.net.CookieManager.

我在WebViewClient的onPageFinished()中使用以下代码.我知道问题在于打开一个新连接,我需要从当前页面获取内容.我很感激一些帮助,谢谢

        @Override
        public void onPageFinished(WebView view, String url){

            Log.d(TAG, "Finished loading: " + url);

            CookieSyncManager syncManager = CookieSyncManager.createInstance(Main.this);
            syncManager.sync();

            CookieManager manager = new CookieManager();
            manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
            CookieHandler.setDefault(manager);

            try {
                URL blah = new URL(url);
                HttpURLConnection con = (HttpURLConnection) blah.openConnection();
                readStream(con.getInputStream()); // outputting html
            } 
            catch (Exception e) {
            }

            CookieStore cookieJar = manager.getCookieStore();
            List<HttpCookie> cookies = cookieJar.getCookies();

            for (HttpCookie cookie: cookies) {
                Log.d(TAG, "cookie name : "+cookie.getName().toString());
            }
        }
Run Code Online (Sandbox Code Playgroud)

cookies android cookiestore android-webview

54
推荐指数
3
解决办法
6万
查看次数

Android - webview中的本地图像

我正在尝试在我的webview中显示本地图像:

 String data = "<body>" + "<img src=\"file:///android_asset/large_image.png\"/></body>";
 webview.loadData(data, "text/html", "UTF-8");
Run Code Online (Sandbox Code Playgroud)

此代码不显示任何内容,而是:

 webview.loadUrl("file:///android_asset/large_image.jpg");
Run Code Online (Sandbox Code Playgroud)

这个工作,但我需要有复杂的网页,而不仅仅是一张图片.

有任何想法吗 ?

android image webview android-webview

53
推荐指数
4
解决办法
9万
查看次数

如何在不在webview中时清除Android上的webview和缓存?

当用户从我的应用程序退出时,我通过调用此方法清除之前从webview缓存的所有内容:

 public void clearCookiesAndCache(Context context){
    CookieSyncManager.createInstance(context);
    CookieManager cookieManager = CookieManager.getInstance();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        cookieManager.removeAllCookies(null);
    }
    else {
        cookieManager.removeAllCookie();
    }        
}
Run Code Online (Sandbox Code Playgroud)

但是,CookieSyncManager被标记为已弃用.但是,如果您之前未加载webview,则需要调用CookieSyncManager.createInstance(context).那么在以前没有加载webview的情况下,如何在不使用已弃用的CookieSyncManager的情况下清除cookie和缓存呢?

android android-webview

51
推荐指数
5
解决办法
6万
查看次数

android:webview里面的对话框或弹出窗口

如何在对话框或弹出窗口中添加Web视图.

我的Web视图保持URL WebView.loadurl().当在对话框中添加视图时,它仍然移动到浏览器.

我一直在android中加载webview中的对话 但是没有如何做到的例子?谢谢

android android-webview

49
推荐指数
1
解决办法
6万
查看次数

在WebView中添加进度条

我正在尝试向我的应用程序添加进度/加载栏WebView.我很困惑如何实现每次单击链接时出现的进度条.

当前代码:

public class CULearnBrowser extends Activity {

    WebView webview;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        webview = (WebView) findViewById(R.id.webview);
        webview.setWebViewClient(new HelloWebViewClient());
        webview.getSettings().setJavaScriptEnabled(true);
        webview.loadUrl("https://culearn.colorado.edu/webct/entryPageIns.dowebct");
    }

    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
            webview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}
Run Code Online (Sandbox Code Playgroud)

活动布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"> …
Run Code Online (Sandbox Code Playgroud)

android progressdialog android-webview android-progressbar

47
推荐指数
6
解决办法
11万
查看次数

Android WebView JellyBean - >不应该发生:没有找到基于rect的测试节点

我的应用程序使用了许多Web视图,这些web视图位于由ViewPager保存的片段中.

每当我使用Jellybean在我的Galaxy Nexus上轻扫应用程序时,我会一次又一次地收到以下控制台消息:

08-23 13:44:03.374: E/webcoreglue(21690): Should not happen: no rect-based-test nodes found
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释这里出了什么问题,以便我可以解决这个问题吗?

android webview android-webview android-4.2-jelly-bean

47
推荐指数
3
解决办法
2万
查看次数