使用Uri.parse或Uri.file时如何在音频播放场景加载本地资源图片
本地资源图片作为MediaItem封面加载失败解决方案
你当前写法错误的核心原因:Uri.file() 仅适用于读取设备本地文件系统中的文件,你项目内 assets 目录下的静态资源是打包进应用安装包的,并不存在于设备的公开文件路径中,自然无法被识别加载。
按照下面两个步骤操作即可正常加载:
第一步:确认静态资源已正确声明
先检查项目根目录的 pubspec.yaml 文件,已经在 flutter 节点下正确声明了你要用到的图片资源,示例配置如下:
flutter: assets: - assets/logo.png
注意路径要和你实际存放图片的路径完全一致,配置项的缩进不能出错
第二步:获取assets资源的有效Uri
有两种兼容度不同的实现方案,优先选符合你场景的即可:
- 方案1(全场景兼容):将assets资源先拷贝到应用临时目录,再生成可被识别的File Uri
先添加path_provider依赖到你的项目,然后使用下面的工具方法生成Uri:
调用时直接将返回值赋值给import 'dart:io'; import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; Future<Uri> getAssetFileUri(String assetPath) async { // 读取assets资源的二进制数据 final byteData = await rootBundle.load(assetPath); // 获取应用临时目录路径 final tempDir = await getTemporaryDirectory(); // 生成临时文件 final tempFile = File('${tempDir.path}/${assetPath.split('/').last}'); // 将二进制数据写入临时文件 await tempFile.writeAsBytes(byteData.buffer.asUint8List()); // 返回临时文件的Uri return tempFile.uri; }artUri即可:artUri: await getAssetFileUri('assets/logo.png'), - 方案2(无需额外依赖,仅支持部分媒体库):直接使用
asset://格式的Uri
如果你使用的音频播放/媒体通知库支持asset路径解析,直接修改你的Uri写法即可:
注意这里是三个斜杠,不要写成两个artUri: Uri.parse('asset:///assets/logo.png'),
如果方案2测试后不生效,直接用方案1即可,几乎所有媒体相关的库都支持这种普通File Uri的读取。
内容的提问来源于stack exchange,提问作者Ashwani Bhardwaj
相关产品推荐
相关产品推荐

