今天讲下TV端接二维码遇到的一些问题,由于是在微信平台申请的是以网站那种形式申请的,而不是服务号申请的,所以客户端显示的二维码是以网页的形式展现的,网页是用WebView加载实现的,但是我们的界面是这样的,

当然这背景上还有显示其他文字信息,我就没在这说明了,为什么这图片中间要做成透明的呢?由于WebView加载显示二维码其实是一个网页,而不是一张图片,所以当时就想到了这个方法,当时在做的过程中也遇到很多适配的问题,大部分都解决了,还是有小部分盒子适配确实不好做,所以这个版本产品要说改这个二维码,当时心想怎么弄,后来想到了一个办法,就是先读取二维码的连接,当然这个二维码的连接是来自后台给你的,因为这个要考虑到回调地址,这个回调地址就是你扫描了后微信会通知自己的服务器,然后自己请求到服务器拿当前扫描客户的微信数据,比如昵称,头像,城市等...,第二步是把网页版显示二维码通过IO把它读出来后,去摘取显示二维码的地址,当然这个地址不是以什么.jgp或者.png格式,读取出来存放在本地,这个文件以.jgp为后缀名,然后再把这个图片读取出来,这个时候webview就可以把它隐藏,这样就能做到适配,因为二维码显示的不再是网页版了而是一张图片,现在贴部分代码:

webview相关设置:

webview.addJavascriptInterface(new InJavaScriptLocalObj(), "java_obj");
webview.setFocusable(false);
webview.setFocusableInTouchMode(false);//让webview失去焦点防止按下键  网页背景出来
webview.setWebChromeClient(new WebChromeClient() {@Override
    public void onProgressChanged(WebView view, int newProgress) {super.onProgressChanged(view, newProgress);
    }
});
myWebViewClient mWebViewClient = new myWebViewClient();
webview.setWebViewClient(mWebViewClient);
WebSettings webSettings = webview.getSettings();
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSettings.setJavaScriptEnabled(true);//支持js必须设置
webSettings.setUseWideViewPort(false);
webSettings.setLoadWithOverviewMode(true);
webSettings.setSupportZoom(false);
webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); //取消滚动条白边效果
webSettings.setBuiltInZoomControls(false);
webSettings.setSupportZoom(false);//设定支持缩放
webSettings.setAppCacheEnabled(true);
String appCacheDir = getContext().getDir("cache", Context.MODE_PRIVATE).getPath();
webSettings.setAppCachePath(appCacheDir);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
webSettings.setAppCacheMaxSize(1024 * 1024 * 10);
webSettings.setAllowFileAccess(true);//暂时改为false
class myWebViewClient extends WebViewClient {@Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);
        return true;
    }@Override
    public void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);
        view.loadUrl("javascript:window.java_obj.getSource('<head>'+" +"document.getElementsByTagName('html')[0].innerHTML+'</head>');");
       }@Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {handler.proceed(); // 接受所有证书
    }
}
class InJavaScriptLocalObj {@JavascriptInterface
    public void getSource(String html) {List<String> list = TextUtil.match(html,"img","src");
        String htmlStr = list.toString();
        String downUrl = Constant.WEIXIN_ZXING_PRE+htmlStr.substring(1,htmlStr.length()-1);
        down(downUrl);
    }
}

在这里一定要注意一点,如果你图片显示的二维码和你webview加载出来的二维码不一样的话,肯定是做错了,我之前就遇到了这个问题,这个二维码连接只要你使用了一次就变了,因为就是每次都是不一样,webview加载算一次,而你自己去读取也算一次,这就是二次了,所以这个二维码不一样,怎么扫描都失败,这个问题怎么解决的呢?也就是说只要让这个连接只加载一次就可以,我的解决方案是用webview去加载,上面不是写了监听么,

  @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);
        return true;
    }@Override
    public void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);
        view.loadUrl("javascript:window.java_obj.getSource('<head>'+" +"document.getElementsByTagName('html')[0].innerHTML+'</head>');");
       }
webview.addJavascriptInterface(new InJavaScriptLocalObj(), "java_obj");

定义类:

 class InJavaScriptLocalObj {@JavascriptInterface
    public void getSource(String html) {List<String> list = TextUtil.match(html,"img","src");
        String htmlStr = list.toString();
        String downUrl = Constant.WEIXIN_ZXING_PRE+htmlStr.substring(1,htmlStr.length()-1);
        down(downUrl);
    }
}

这个getSource方法html回调参数就是你网页的内容了,这样就不用我们自己去加载二维码连接获取网页版内容,问题解决,如图就是微信二维码连接的html内容:

把获取这个值是使用了正则表达式的方式,相关代码也在这贴下

/**
 * 获取指定HTML标签的指定属性的值
 * @param source 要匹配的源文本
 * @param element 标签名称
 * @param attr 标签的属性名称
 * @return 属性值列表
 */
public static List<String> match(String source, String element, String attr) {List<String> result = new ArrayList<String>();
    String reg = "<" + element + "[^<>]*?\\s" + attr + "=['\"]?(.*?)['\"]?(\\s.*?)?>";
    Matcher m = Pattern.compile(reg).matcher(source);
    while (m.find()) {String r = m.group(1);
        result.add(r);
    }return result;
}

使用这个获取的集合其实就是string,就是上面的scr指向的二维码图片地址值了,当然了这个src是相对路径,所以还要加上前缀,这个你只要鼠标放在二维码图片就提示一个完整的路径,然后把前缀拿出来组成一个图片地址,下面就是把这组成的图片地址写在本地,SD卡或者app目录下,写到本地好后就读取出来,然后显示出来即可,如果你想这个时候已经ok的话就完了,你会发现打正式的包时会发现二维码显示不出来,其实也就是这个图片没显示出来,图片没显示出来也就是在读取图片到本地出错了,读取图片到本地的操作是在使用js读取网页html内容里面写的,所以错误定位在这里,最终是什么问题导致的呢,是由于混淆的时候要做处理;如下:

#js混淆
-keepclassmembers class 包名.类名$内部类名{
     <fields>;
     <methods>;
     public *;
     private *;
}-keepattributes *Annotation*
-keepattributes *JavascriptInterface*

比如我InJavaScriptLocalObj这个类是上面用到了是定义在A中,也就是说InJavaScriptLocalObj是A的内部类,那么混淆就是

包名.A$InJavaScriptLocalObj

到这里整个工作就完成了,下午忙了一下午就是搞这个问题,还好问题搞定了,

写完发现还是要说明下:

1:webview一直是隐藏的,我们使用webview是用于用户手机扫码的监听

2:在把二维码图片写入到本地然后取出要注意删除原来的,

3:一定要记得混淆时候添加上面说的几行代码

4:这个做法的弊端是微信html代码变化了 客户端就要跟着维护

5:网页版二维码是过几分钟是自动刷新的,所以要监听它刷新后重新上面的操作

今天在测试的时候发现在芒果嗨盒子上发现二维码显示不出来,经排查是因为

class InJavaScriptLocalObj {@JavascriptInterface
    public void getSource(String html) {List<String> list = TextUtil.match(html,"img","src");
        String htmlStr = list.toString();
        String downUrl = Constant.WEIXIN_ZXING_PRE+htmlStr.substring(1,htmlStr.length()-1);
        down(downUrl);
    }
}

这个方法没有回调,

解决方案:

/**
 * 解决芒果嗨盒子不显示二维码的问题
 */
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {webview.evaluateJavascript("enable();", null);
} else {webview.loadUrl("javascript:enable();");
}

android TV端如何读取微信网页版二维码显示生成一张图片相关推荐

  1. 微信网页版二维码扫码过程发生了什么

    第三方网站应用微信登录 技术实现如下: 二维码的获得 用户打开网站后,网站后台根据微信OAuth2.0协议向微信开发平台请求授权登录,并传递事先在微信开发平台中审核通过的AppID和AppSecrec ...

  2. 微信公众号二维码怎么生成?好用的生成方法介绍

    微信公众号二维码怎么生成?从事新媒体行业的小伙伴们应该都对微信公众号不陌生吧,公众号是一个企业对外宣传的重要方式之一.通常情况下我们都会将公众号的二维码放置在文章的文末.以便于读者扫码关注公众号.那么 ...

  3. 微信小程序二维码如何生成?

    微信小程序二维码能够方便小程序的推广,那么微信小程序的二维码如何生成?微信小程序二维码都有哪些? 正式二维码 在"设置"中查看小程序的正式二维码,该二维码只用于访问小程序的线上正式 ...

  4. 微信|QQ扫码登录网页版二维码失效问题解决方案 网站无法访问PC网页版如何解决 安卓软件历史版本下载 FV fooview悬浮球帮助教程

    前言 1. 手机端浏览器登录网页的同时再用微信或者QQ扫码登录出现二维码失效问题如何解决? 2.部分网站无法访问PC网页版如何解决?请看方案 目录 前言 1.方案 2.方案 使用Edge安卓浏览器访问 ...

  5. 生成微信小程序发布上线后的二维码 、获取微信小程序二维码、微信小程序二维码如何生成?

    情景: 1.在微信小程序审核完成,发布到线上后,想通过扫描小程序二维码进入小程序 2.可分享二维码出去,通过二维码扫码进入小程序 方法: 1.进入微信小程序的后台配置.链接:微信公众平台.(如图一) ...

  6. Go使用qrcode包解析微信和支付宝二维码,生成一个链接(前端拿到链接即可解析成对应的支付二维码)

    点击链接查看我的个人博客,文章更全更详细 github.com/makiuchi-d/gozxing // uploadFile func uploadFile(c echo.Context) (er ...

  7. 微信,支付宝,收款二维码实时生成订单监控,免签支,付支付系统,个人收款,收款二维码...

    微信,支付宝,收款二维码实时生成订单监控,免签支,付支付系统,个人收款,收款二维码 微信和支付宝个人支付二维码生成与监控!有PHP接口回调,个人收款好助手! 实现收款即时到个人微信或支付宝账户!方便安 ...

  8. 微信扫描普通二维码调起体验版与已发布版的小程序

    文章转自: 微信扫描普通二维码调起体验版与已发布版的小程序_baozaobenren的博客-CSDN博客 公司有这样一个需求,就是用微信扫描二维码直接调起我们的小程序,前期不知道,直接扫描二维码,调起 ...

  9. Java生成微信小程序二维码,5种实现方式,一个比一个简单

    文章目录 前言 先看官网 一.JDK自带的URLConnection方式 二.Apache的HttpClient方式 三.okhttp3方式 四.Unirest方式 五.RestTemplate方式 ...

最新文章

  1. 0x21.搜索 - 树与图的遍历、拓扑排序
  2. python哪个版本好-python下载哪个版本好
  3. java魂斗罗_java 魂斗罗
  4. c++文件中jni库找不到报红
  5. 体验LESS CSS 框架
  6. Web SQL介绍,web sql中增删改查、数据存储位置、运行脚本、建表建库
  7. DOTNET零碎要点---1.vb.net利用Oracle.DataAccess.dll链接Oracle数据库
  8. 如何解决服装面料纬斜问题
  9. 逻辑回归算法python_逻辑回归算法原理和例子
  10. iis6.0 php fastcgi,IIS 6.0 - FastCGI
  11. 181103每日一句
  12. 类与对象(面向对象的编程语言java)
  13. U盘加密软件测试简历,U盘加密软件哪个好用?2020U盘加密软件推荐
  14. Sql Server 还原数据库并重命名
  15. 刚拿到手新鲜的offer,给大家分享一下我的面试心得
  16. echarts图表入门级教程(An introductory chart tutorial)
  17. BZOJ1507 [NOI2003]Editor
  18. APK脱壳之—如何脱掉“梆梆加固”的保护壳
  19. MCE | 新冠 德尔塔病毒
  20. Python-flask 使用Markdown和Flask-PageDown支持富文本文章

热门文章

  1. Spring框架AOP源码剖析
  2. 高等数学笔记-苏德矿-第九章-重积分(Ⅰ)-二重积分
  3. Pytorch之nn.Conv1d学习个人见解
  4. Linux中RPM、YUN和克隆
  5. Wide Deep模型的理解及实战(Tensorflow)
  6. 第4套 从零到商业实战篇 斗战神篇
  7. 3.5寸服务器硬盘v4,六碟巨兽 希捷Enterprise Capacity 3.5 HDD v4评测
  8. 项目4.1 -- 广义表的原子统计
  9. Python爬虫-京东商品到货自动邮件通知
  10. 建设“东数西算”工程的实施办法以及背后价值