webview_flutter3.0.4安卓端无法选择上传图片iOS正常如何解决
webview_flutter 3.0.4 版本的Android端实现默认未重写WebChromeClient的onShowFileChooser方法,点击HTML中<input type="file">类型的上传控件时,不会唤起系统文件选择器;iOS端默认适配了该逻辑,因此功能正常。
方案一:保留3.0.4版本,补全原生配置
1. 修改Android清单配置
打开android/app/src/main/AndroidManifest.xml,替换原有存储权限,适配多版本Android权限规则,同时添加FileProvider支持应用间文件Uri传递:
<!-- 基础权限 --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Android 12及以下存储读取权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android 10及以下存储写入权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <!-- Android 13及以上媒体图片读取权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <application> <!-- 原有Activity等配置保持不变 --> <!-- 新增FileProvider配置 --> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application>
在android/app/src/main/res目录下新建xml文件夹,在文件夹内创建file_paths.xml文件:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="app_images" path="Pictures/"/> <cache-path name="app_cache" path="."/> </paths>
2. 实现动态权限申请
Android 6.0以上危险权限需要动态申请,在pubspec.yaml中添加依赖:
dependencies: webview_flutter: ^3.0.4 permission_handler: ^10.2.0 device_info_plus: ^8.0.0
在WebView页面初始化时申请对应权限:
import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:permission_handler/permission_handler.dart'; Future<void> _requestPermission() async { if (!Platform.isAndroid) return; final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt >= 33) { await Permission.photos.request(); } else { await Permission.storage.request(); } } @override void initState() { super.initState(); _requestPermission(); }
3. 重写Android端WebChromeClient
打开android/app/src/main/kotlin/[你的项目包名]/MainActivity.kt,注册自定义WebView工厂替换默认的WebChromeClient实现,重写onShowFileChooser方法唤起系统文件选择器,在onActivityResult中接收选择的文件Uri回传给WebView即可。
方案二:升级依赖(推荐)
直接将webview_flutter升级到4.0.0及以上稳定版本,官方已经内置了Android端文件选择回调的实现,不需要编写额外原生代码,只需要完成上述步骤1的清单配置和步骤2的动态权限申请,原有WebView业务代码不需要改动即可正常触发图片上传。
注意:如果需要支持拍照上传的场景,还需要额外添加相机权限
android.permission.CAMERA,并配置拍照输出的FileProvider路径。
内容的提问来源于stack exchange,提问作者Abu Sayed

