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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:36:22