日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android TV端如何读取微信网页版二维码显示生成一张图片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天講下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端如何读取微信网页版二维码显示生成一张图片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。