Flutter使用open_file包无法打开生成的PDF文件问题求助
问题原因
该问题是Android分区存储适配、open_file插件配置缺失共同导致的,和Ubuntu开发环境、Android Studio/模拟器本身没有直接关系。你之前修改代码时仅处理了空安全编译报错,没有同步调整Android端的权限和组件配置,所以文件能正常写入但无法唤起PDF查看应用。
修复步骤
1. 补充Android权限配置
打开项目android/app/src/main/AndroidManifest.xml文件,做两处修改:
- 在
<manifest>根标签下添加存储权限声明:
<!-- 基础存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Android 11+ 额外需要的文件管理权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
- 在
<application>标签上添加分区存储兼容属性:
<application android:label="你的应用名" android:name="${applicationName}" android:icon="@mipmap/ic_launcher" <!-- 新增下面这行 --> android:requestLegacyExternalStorage="true">
2. 添加FileProvider配置
高版本Android不允许直接通过本地路径分享文件给其他应用,需要配置FileProvider:
- 在上述
AndroidManifest.xml的<application>标签内新增Provider声明:
<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/filepaths" /> </provider>
- 在
android/app/src/main/res目录下新建xml文件夹,在文件夹内新建filepaths.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="external_files" path="."/> </paths>
3. 修正代码逻辑,捕获打开错误
你之前的代码没有打印OpenFile.open的执行结果,就算打开失败也会输出done,无法定位问题。修改mobile.dart的代码如下:
import 'dart:io'; import 'package:open_file/open_file.dart'; import 'package:path_provider/path_provider.dart'; Future<void> saveAndLaunchFile(List<int> bytes, String fileName) async { try { // 避免强制解包导致崩溃 final? directory = await getExternalStorageDirectory(); if (directory == null) { print("无法获取设备存储目录"); return; } final filePath = '${directory.path}/$fileName'; final file = File(filePath); await file.writeAsBytes(bytes, flush: true); // 打印打开结果,排查错误 final openResult = await OpenFile.open(filePath); print("文件打开结果:type=${openResult.type}, message=${openResult.message}"); } catch (e) { print('操作出错:$e'); } }
4. 模拟器权限校验
如果使用Android 12及以上版本的模拟器,需要手动授予全量存储权限:长按应用图标→应用信息→权限→存储→选择「允许管理所有文件」,重启应用后再测试。
内容的提问来源于stack exchange,提问作者fajar setiawan
相关产品推荐
相关产品推荐

