Genexus安卓App WebView调相机失效及编译修改不生效问题
Genexus安卓App WebView内
<input type="file">无法唤起相机问题排查方案 问题核心现象
- SD Panel组件加载仅包含
<input type="file">标签的HTML文件时,系统浏览器可正常唤起相机选择文件,Genexus生成的App内点击无响应 - 已在
AndroidManifest.xml中添加如下权限,问题未解决:
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
- 尝试重写
webviewactivity.java内MyWebChromeClient逻辑、在onCreate生命周期中添加测试弹窗代码,执行gradlew uploadarchives命令提示编译成功,但执行rebuildall操作后测试弹窗未展示,不确定是否需要额外修改配置。
分步解决方法
1. 先解决自定义代码不生效的问题
执行gradlew uploadarchives后自定义代码不生效,是因为Genexus执行rebuildall时默认拉取远程仓库的官方版FlexibleClient依赖,不会引用本地修改的未正式标记版本,需要做两个调整:
- 修改FlexibleClient模块的
build.gradle配置,将依赖版本号改为自定义的唯一版本(比如在官方版本号后加自定义后缀),避免和远程仓库的官方版本号冲突 - 执行
gradlew uploadarchives完成本地归档后,找到Genexus生成的安卓工程主模块的build.gradle文件,将FlexibleClient的依赖版本替换为自定义的版本号,同时确认本地maven仓库的优先级高于官方远程仓库,确保编译时拉取的是本地修改后的版本。
2. 实现WebView文件选择逻辑解决相机唤起问题
安卓原生WebView默认没有实现<input type="file">的文件选择回调,必须手动重写WebChromeClient对应方法,步骤如下:
- 在自定义的
MyWebChromeClient类中重写onShowFileChooser方法(兼容安卓5.0及以上版本,低版本可额外重写废弃的openFileChooser方法做兼容),拦截WebView发出的文件选择请求 - 方法内构造选择Intent:同时加入系统文件选择Action和相机拍摄Action
MediaStore.ACTION_IMAGE_CAPTURE,提前配置好拍摄照片的临时存储Uri,确保系统选择弹窗会展示相机选项 - 增加动态权限校验:安卓6.0及以上版本需要在触发选择前动态申请相机、存储读写权限,仅在Manifest声明静态权限无法生效,权限申请通过后再拉起系统选择组件
- 在对应Activity的
onActivityResult回调中,将用户选择/拍摄得到的文件Uri回传给onShowFileChooser提供的ValueCallback对象,确保页面能正常接收到选中的文件。
注:
SYSTEM_ALERT_WINDOW权限和当前问题无关,属于多余配置,建议移除以避免合规风险。
内容的提问来源于stack exchange,提问作者hao
相关产品推荐
相关产品推荐

