You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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和相机拍摄ActionMediaStore.ACTION_IMAGE_CAPTURE,提前配置好拍摄照片的临时存储Uri,确保系统选择弹窗会展示相机选项
  • 增加动态权限校验:安卓6.0及以上版本需要在触发选择前动态申请相机、存储读写权限,仅在Manifest声明静态权限无法生效,权限申请通过后再拉起系统选择组件
  • 在对应Activity的onActivityResult回调中,将用户选择/拍摄得到的文件Uri回传给onShowFileChooser提供的ValueCallback对象,确保页面能正常接收到选中的文件。

注:SYSTEM_ALERT_WINDOW权限和当前问题无关,属于多余配置,建议移除以避免合规风险。


内容的提问来源于stack exchange,提问作者hao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:27:13