当前位置: 首页 > news >正文

android中webview携带cookie以及webview所加载网页中js调用java方法问题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

      最近项目中需要用到webview来加载一个抽奖页面,抽奖页面访问需要带上cookie,并且在该抽奖页面点击分享会调用java里分享的方法,弹出一个popwindow分享界面,现在把这里面遇到的问题以及需要注意的问题共享一下,希望对遇到有同样问题的兄弟有所帮助。

  首先说的是使用webview加载网页需要携带cookie的问题,直接上代码:

    这是在请求登录成功后获取到所有的cookies,然后遍历cookies,将每个条目存储到自己application的strUserSession这个数组中。

    Map<String, List<String>> mData = conn.getHeaderFields();
    List<String> lCookies = mData.get("Set-Cookie");
    if (lCookies != null && lCookies.size() > 0) {
    if (MyApplication.strUserSession == null) {
       MyApplication.strUserSession = new String[lCookies.size()];
        for (int i = 0; i < lCookies.size(); i++) {
            String[] sessionId = lCookies.get(i).split(";");
            MyApplication.strUserSession[i] = sessionId[0];
         }
    }

    接下来是webview加载网页时候携带cookie的方法:

  public void synCookies(Context context) {
        String strSessionData = "";
        if (MyApplication.strUserSession != null
                && MyApplication.strUserSession.length > 0) {
            if (MyApplication.strUserSession != null) {
                for (int i = 0; i < MyApplication.strUserSession.length; i++) {
                    strSessionData = MyApplication.strUserSession[i];
                }
            }
        }
        CookieSyncManager.createInstance(context);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        cookieManager.removeSessionCookie();// 移除
        cookieManager.removeAllCookie();
        cookieManager.setCookie(strUrl, strSessionData);// cookies是在HttpClient中获得的cookie
        CookieSyncManager.getInstance().sync();
   }

     这里需要注意的是 cookieManager.setCookie(strUrl, strSessionData)这里设置的cookie不是获取所有的cookies集合,而是遍历后的单个cookie条目,还有 cookieManager.removeAllCookie()这个方法一定要有,这个解决了有的会出现第一次加载需要携带cookie的网页的时候会失败,第二次又正常的问题。这个方法的调用:

webview.getSettings().setJavaScriptEnabled(true);
synCookies(getApplicationContext());
webview.loadUrl(strUrl);


接下来就要说的是在webview所加载的网页中点击某个按钮,调用android里的代码问题,我们的需求是点击页面上的分享按钮,会调用android里的分享的方法,具体做法如下,在调用loadUrl之前调用这句,这句就将js与java关联起来了:

webview.addJavascriptInterface(this, "showShare");

    然后这就是android里调用分享的方法,这里需要注意的是如果该方法里有耗时操作必须放在子线程,不然会阻塞程序崩溃:

public void showShareDialog() {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                showShare();
                setShareContent();
            }
        });
    }

最后只需要在js代码里加上这一句就可以调用android里的方法了:

window.showShare.showShareDialog();


转载于:https://my.oschina.net/u/2311629/blog/406201

相关文章:

  • 模拟 ZOJ 3878 Convert QWERTY to Dvorak
  • 【Java每日一题】20170322
  • JavaScript中的对象复制(Object Clone)
  • C#后台传入数据JS接收
  • petstore-jdbc
  • css3 动画
  • [OS] linux常见问题汇总
  • Lua 程序设计 (Roberto,Ierusalimschy 著)
  • c3p0 连接过多导致tomcat无法启动的解决方法
  • memcache set方法 MEMCACHE_COMPRESSED
  • if(A B || C),应该如何解释满足A、B、C之间的关系
  • Web前端开发的主要职责
  • 啊啊啊
  • 60、70后的互联网恐慌来源于圈地思维失效
  • python3的urllib2报错问题解决方法
  • 深入了解以太坊
  • 【mysql】环境安装、服务启动、密码设置
  • 4个实用的微服务测试策略
  • create-react-app做的留言板
  • CSS3 变换
  • flask接收请求并推入栈
  • java 多线程基础, 我觉得还是有必要看看的
  • Meteor的表单提交:Form
  • php面试题 汇集2
  • spring cloud gateway 源码解析(4)跨域问题处理
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue数据传递--我有特殊的实现技巧
  • Web Storage相关
  • web标准化(下)
  • 大主子表关联的性能优化方法
  • 开源SQL-on-Hadoop系统一览
  • 浅谈web中前端模板引擎的使用
  • 一文看透浏览器架构
  • 异常机制详解
  • HanLP分词命名实体提取详解
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #define,static,const,三种常量的区别
  • $.ajax,axios,fetch三种ajax请求的区别
  • (C语言)逆序输出字符串
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Python) SOAP Web Service (HTTP POST)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (论文阅读40-45)图像描述1
  • (三)mysql_MYSQL(三)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (转)3D模板阴影原理
  • (转)Sublime Text3配置Lua运行环境
  • (转)VC++中ondraw在什么时候调用的
  • .form文件_SSM框架文件上传篇
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!