RN 开发之调用 WebView 爬坑记
解决 React Native 之 Android 手机中 WebView 不能调用相机相册的问题
记录最近在 RN 开发中踩的一个坑以及分享我的爬坑记:Android 手机不能在 WebView 中调用相机相册;我刚开始很困惑,大家都一致认为这是链接的第三方写的 H5 中调用相机相册的方法有问题所导致的,后来我通过查找原因,发现这是 Android 原生 WebView 中没有实现调用相机相册的功能;soga,知道原因后开始在网上查找解决方法,大概找到两三个类似的依赖包,于是开始尝试集成到现在的项目中去,结果全部 jj:不是和其他依赖包冲突就是 gradle build 失败;唉,各种心塞心累,于是决定自己尝试桥接原生 WebView,桥接的过程也是各种蜿蜒曲折啊;下面开始分享我桥接的过程,希望可以帮助有需要的人少踩点坑。
1. 为什么 RN 的 android 端 webview 不支持上传图片和调用相机?
android 原生的 webview,本身就需要配置一个方法来配合上传图片,所以 RN 封装的 webView 没有配置这个方法
1 | // For Android 4.1 |
2. 如何给 RN 的 webview 配置上这个方法?
在 js 代码中暂时没办法处理,那只好改原生的方法,原生的 webview 封装在 react native 包里,没办法改,只好重新封装一个 webview.
3. 怎么重新封装一个 RN 组件?
- 首先把
/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/webview
中的 ReactWebViewManager 的复制到自己的 src 的 java 包目录里 - 然后根据自己的需求进行更改,比如现在的需求事添加选择图片的配置
(1). 新建一个 ActivityResultInterface 接口回调
1 | interface ActivityResultInterface { |
(2). PickerActivityEventListener onActivityResult 回调和自定义回调链接
1 | public class PickerActivityEventListener extends BaseActivityEventListener { |
(3). ReactWebViewManager 自定义添加配置
1 | public class ReactWebViewManager extends SimpleViewManager<WebView> implements ActivityResultInterface { |
(4). 注意 需要注册 FileProvider 和设置 xml path
(注意此处可能会和其他上传图片的依赖包中的清单文件冲突,原因是配置的 authorities 冲突,只要修改一致即可)
1 | //清单文件中注册 |
(5). res 资源文件中新建 xml 文件夹新建文件 provider_paths.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
4. 新建 WebViewReactPackage.java 文件,将写好的 ReactWebViewManager 写入到 WebViewReactPackage 中
1 | public class WebViewReactPackage implements ReactPackage { |
5. 将 WebViewReactPackage 写入 MainApplication 中
1 | public class MainApplication extends Application implements ReactApplication { |
6. 在项目新建 BridgeWebView.js 文件,把/node_modules/react-native/Libraries/Components/WebView
中的 webview.android.js,复制到自己的 js 文件夹中,做一定的修改
1 | // 修改部分 |