webview适配(一):文件选择,相机拍照,相册选择

article/2025/9/28 18:55:53

说起来android适配webview就是比较烦人,本人遇到过很多坑,但是之前从来没有过记录,例如:文件选择框,toast弹框,视频不正常播放,视频各种不全屏(网上说的方法都不行时候就崩溃了,有机会说),两端方法互调,视频和语音播放不停止问题,http和https切换时图片不显示问题,等等

在这里我要说一嘴,一个很重要的东西:QQ,微信等腾讯系列软件一般都用的是腾讯X5内核的webview,并非原生的webview,如果看到和微信,QQ,还有大部分浏览器打开页面效果展示不同,请不必在意。因为内核不一样,你也可以继承腾讯X5的内核,它的某些效果封装的略强于原生webview,有的不如webview,各有利弊,国内好多手机都自定制webview,导致原生浏览器打开效果也略有不同,不必在意,我不推荐使用腾讯X5的webview,因为我比较懒,而且并没有感觉到明显的优点,好像腾讯X5内核的webview还并不是完全免费

说到这我在来说下关于webview的轻量级框架,AgentWeb,当然基于腾讯X5内核的也有,但是不做说明了,你们可自行百度AgentWeb的用法,确实比较简单,封装效果比较好。个人并不喜欢集成,1.因为不如自己写的灵活。2.有什么bug也不在自己的控制之内。3.感觉自己封装一个也很速度哈,无非是把那常用的几点适配好就可以了

以前解决的时候没有去特意记录,今天又遇到一个正好记录一下,关于webview选择文件,先看效果

先看一个在微信上打开的效果:

再看一个在app内部打开的效果:

最后的是咱们想要的效果:

还有几种效果就不一一列举了,还有就是直接到选择文件界面,还有的是微信,QQ和app内部不一样,其实很简单的,h5的小伙伴调用的是文件选择,至于如何选择就要咱们这边的壳子做处理了,因为嵌套的是h5页面,这个webview控件就暂且称作壳子吧。需要新建CustomWebChromeClient类的对象,并且重写打开文件的方法,各个版本之间的方法还不一样,对现在来说其实只考虑5.0以上就行了,为了安全起见就都写一下吧,附上代码

// For Android 3.0+public void openFileChooser(ValueCallback uploadMsg, String acceptType) {if (activity.getClass() == WebViewNewActivity.class) {((WebViewNewActivity) activity).mUploadMessage = uploadMsg;}mUploadMessage = uploadMsg;getPicture();}//For Android 4.1public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {if (activity.getClass() == WebViewNewActivity.class) {((WebViewNewActivity) activity).mUploadMessage = uploadMsg;}mUploadMessage = uploadMsg;getPicture();}// For >= Lollipop 5.0@TargetApi(Build.VERSION_CODES.LOLLIPOP)public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {/** lk改,webview打开图片* */uploadMessage = filePathCallback;getPicture();return true;}

getPicture()这个方法中写处理,我写的是弹出自定义的弹框,至于是拍照,还是选择照片,或者选择文件都可以自己添加的,很简单,一定注意,要加权限判断啊

/** 获取照片的方法* */public void getPicture() {SetUpDialogPictureH5 dialogPicture = new SetUpDialogPictureH5(WebViewNewActivity.this, new SetUpDialogPictureH5.ArticlePcutureOnClickListener() {@Overridepublic void btnTakePicListener() {
//                        拍照// 拍照if (Build.VERSION.SDK_INT >= 23) {if (ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED||ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED|| ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(WebViewNewActivity.this, new String[]{Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.PERMISSION_CAMERA);} else {cameraPic();}} else {cameraPic();}}@Overridepublic void btnGetAlbumPicListener() {//相册if (Build.VERSION.SDK_INT >= 23) {if (ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED|| ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(WebViewNewActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.READ_WRITE_STORAGE);} else {startImagePick();}} else {startImagePick();}}@Overridepublic void btnCancelListener() {restoreNeiRong();}},true);}

 至于是否授予权限的处理结果的代码我就不贴了,自己写就行了,我主要是提供一下思路,别忘记对图片进行压缩处理。

 


http://chatgpt.dhexx.cn/article/IjNf7S77.shtml

相关文章

Android跟web哪个好,比系统自带的WebView更好用 | AgentWeb

名称 AgentWeb 语言 Android 平台 GitHub 作者 Justson 在混合化开发大行其道的今天&#xff0c;安卓开发经常会用到WebView&#xff0c;用于加载网页。系统自带的WebView性能和流畅度都一般&#xff0c;今天给大家推荐一款第三方WebView&#xff0c;性能比系统自带的要好&…

X5 浏览器内核调研报告

关于这份调研报告&#xff0c;不是从技术角度深入探索&#xff0c;重点是从产品本身分析&#xff0c;通俗易懂才是重点。主要是为了锻炼平时做技术调研和竞品分析的能力&#xff0c;以及业务拓展的技术储备。内容有点多&#xff0c;下面 **X5 **内核调研报告将分为三个环节&…

南京理工大学计算机考研资料汇总

南京理工大学研究生院 http://gs.njust.edu.cn/ 南京理工大学计算机科学与工程学院 http://cs.njust.edu.cn/ 南京理工大学计算机科学与工程学院始建于1953年创办的哈尔滨军事工程学院模拟计算机研究组&#xff0c;先后经历了炮兵工程学院计算机教研室&#xff08;1960年&a…

上海海洋大学计算机考研资料汇总

上海海洋大学研招网 上海海洋大学信息学院 上海海洋大学&#xff08;Shanghai Ocean University&#xff09;是上海市人民政府与国家海洋局、农业农村部共建高校&#xff0c;国家“双一流”世界一流学科建设高校&#xff0c;入选国家卓越农林人才教育培养计划、国家建设高水平…

2024东华大学计算机考研信息汇总

最新数据见&#xff1a;东华大学_信息汇总_N诺计算机考研 东华大学计算机科学与技术学院官网&#xff1a;http://cst.dhu.edu.cn/ 东华大学&#xff08;Donghua University&#xff09;&#xff0c;简称“东华”&#xff0c;地处中国上海&#xff0c;是教育部直属、国家“211工…

西南石油大学计算机考研资料汇总

西南石油大学&#xff08;Southwest Petroleum University&#xff09;&#xff0c;简称“西南石大”&#xff0c;坐落于四川省成都市&#xff0c;是经中华人民共和国教育部备案的一所中央与地方共建、以四川省人民政府管理为主的高等院校&#xff0c;是世界一流学科建设高校、…

2023东北大学计算机考研信息汇总

完整内容见&#xff1a;东北大学 东北大学计算机科学与工程学院 东北大学软件学院 东北大学秦皇岛分校 东北大学&#xff08;Northeastern University&#xff09;&#xff0c;简称东大&#xff08;NEU&#xff09;&#xff0c;中华人民共和国教育部直属的高水平研究型全国…

2023上海海洋大学计算机考研信息汇总

上海海洋大学研招网 上海海洋大学信息学院 上海海洋大学&#xff08;Shanghai Ocean University&#xff09;是上海市人民政府与国家海洋局、农业农村部共建高校&#xff0c;国家“双一流”世界一流学科建设高校&#xff0c;入选国家卓越农林人才教育培养计划、国家建设高水平…

东北大学计算机考研资料汇总

东北大学计算机科学与工程学院 东北大学软件学院 东北大学秦皇岛分校 东北大学&#xff08;Northeastern University&#xff09;&#xff0c;简称东大&#xff08;NEU&#xff09;&#xff0c;中华人民共和国教育部直属的高水平研究型全国重点大学&#xff0c;坐落于东北…

2023北京大学计算机考研信息汇总

原文转载于&#xff1a;北京大学 N诺小程序 - 计算机学习考研必备神器 北京大学信息科学技术学院 北京大学软件与微电子学院 北京大学前沿交叉学科研究院 北京大学信息工程学院 北大研究生院 北京大学&#xff08;Peking University&#xff09;简称“北大”&#…

北京大学计算机考研资料汇总

北京大学信息科学技术学院 北京大学软件与微电子学院 北京大学前沿交叉学科研究院 北京大学信息工程学院 北大研究生院 北京大学&#xff08;Peking University&#xff09;简称“北大”&#xff0c;诞生于1898年&#xff0c;初名京师大学堂&#xff0c;是中国近代第…

2023西南石油大学计算机考研信息汇总

西南石油大学&#xff08;Southwest Petroleum University&#xff09;&#xff0c;简称“西南石大”&#xff0c;坐落于四川省成都市&#xff0c;是经中华人民共和国教育部备案的一所中央与地方共建、以四川省人民政府管理为主的高等院校&#xff0c;是世界一流学科建设高校、…

2023南京理工大学计算机考研信息汇总

南京理工大学研究生院 http://gs.njust.edu.cn/ 南京理工大学计算机科学与工程学院 http://cs.njust.edu.cn/ 南京理工大学计算机科学与工程学院始建于1953年创办的哈尔滨军事工程学院模拟计算机研究组&#xff0c;先后经历了炮兵工程学院计算机教研室&#xff08;1960年&am…

2023中国科学院大学计算机考研信息汇总

原文转载于&#xff1a;中国科学院大学 N诺小程序 - 计算机学习考研必备神器 中国科学院大学&#xff08;University of Chinese Academy of Sciences&#xff09;&#xff0c;简称“国科大”&#xff0c;是国家教育部正式批准成立的一所以研究生教育为主的科教融合、独具特色…

HTMLTestRunner生成测试报告报错 ModuleNotFoundError: No module named ‘StringIO‘

今天在学习使用HTMLTestRunner生成测试报告时遇到一个报错&#xff0c;如图所示&#xff1a; 网上搜索了下“No module named StringIO”解决方法&#xff0c;原来我用的是Python 3.X版本&#xff0c;而下载的HTMLTestRunner适用于Python2.X&#xff08;下载链接&#xff1a;ht…

python中IO库中StringIO方法和BytesIO方法用法详解

有时候数据读写不一定是文件&#xff0c;也可以在内存中读写。StringIO顾名思义就是在内存中读写str。 Python在内存中读写数据&#xff0c;用到的模块是StringIO和BytesIO。 getvalue()方法用于获得写入后的str。 StringIO操作的只能是str&#xff0c;如果要操作二进制数据…

python io模块_python中的StringIO模块

原博文 2015-12-03 13:48 − StringIO经常被用来作为字符串的缓存&#xff0c;应为StringIO有个好处&#xff0c;他的有些接口和文件操作是一致的&#xff0c;也就是说用同样的代码&#xff0c;可以同时当成文件操作或者StringIO操作。 一、例子 import StringIO s StringIO…

StringIO和BytesIO

StringIO和BytesIO 文章目录 StringIO和BytesIOStringIO常用方法 BytesIO常用方法 StringIO io模块中的类 导入方式 from io import StringIO内存中&#xff0c;开辟的一个文本模式的buffer&#xff0c;可以像文件对象一样操作它当close方法被调用的时候&#xff0c;这个buffe…

python中StringIO和BytesIO

1. 类文件对象 最常见的io操作是将磁盘中的文件读到内存以及内存内容写入文I件。还有一种内存和内存之间的IO&#xff0c;叫类文件对象&#xff0c;python中的StringIO和BytesIO就是类文件对象&#xff0c;通俗解释即&#xff1a;像操作文件一样在内存中操作字符串和二进制内容…

Python中的StringIO和BytesIO

1.StringIO 很多时候&#xff0c;数据读写不一定是文件&#xff0c;也可以在内存中读写。 StringIO顾名思义就是在内存中读写str。 要把str写入StringIO&#xff0c;我们需要先创建一个StringIO&#xff0c;然后&#xff0c;像文件一样写入即可&#xff1a; 使用getvalue()方…