- 需求:用户可以将音频转录的文本内容,导出为多种格式的文件
- 实现:file_picker文件选择功能包 permission_handler应用权限请求包
首先:配置应用的存储权限: Android -> app -> src -> main ->AndroidManifest.xml
<!-- 添加存储权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:requestLegacyExternalStorage="true">
</application>
Android 10以上对外部存储空间更严格的限制和更细粒度的控制 需要开启
将 android:requestLegacyExternalStorage 设置为 true 可以使您的应用在运行于Android 10的设备上时继续使用传统的存储模型,而不是新引入的Scoped Storage模型。这允许应用像在Android 9及更低版本中一样访问外部存储。
导出.txt到公共存储外部存储
首先导出时需要保证用户是否有权限
Future<bool> _requestPermission() async {
PermissionStatus status = await Permission.storage.status;
if (!status.isGranted) {
status = await Permission.storage.request();
}
return status.isGranted;
}
然后点击导出为.txt文件 _selectPath(‘text’, ‘txt’, ‘你好’)
获取选择目录路径
点击导出弹出先进行权限认证完成后 打开文件路径选择器 file_pick 提供打选择目录api 返回外部存储的路径
String? selectedDirectory =
await FilePicker.platform.getDirectoryPath();
然后进行写入文件
String filePath = '$selectedDirectory/$title.$extension';
File file = File(filePath);
print('file$file');
await file.writeAsString(content);
最大的难点可能就是 权限问题
PathAccessException: Cannot open file, path = ‘/storage/emulated/0/Android/media/example.txt’ (OS Error: Operation not permitted, errno = 1)
解决方案就是 需要通过对权限进行配置 以及插件来 检测 让用户去开启应用的权限 继续使用
完整代码
Future<bool> _requestPermission() async {
PermissionStatus status = await Permission.storage.status;
if (!status.isGranted) {
status = await Permission.storage.request();
}
return status.isGranted;
}
Future<void> _selectPath(BuildContext context, String title, String extension,
String content) async {
if (await _requestPermission()) {
try {
String? selectedDirectory =
await FilePicker.platform.getDirectoryPath();
print('selectedDirectory: $selectedDirectory');
if (selectedDirectory == null) {
print('用户取消了选择');
} else {
Directory directory = Directory(selectedDirectory);
if (await directory.exists()) {
String filePath = '$selectedDirectory/$title.$extension';
File file = File(filePath);
print('file$file');
await file.writeAsString(content);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('已保存 $title 文件到 $filePath')),
);
} else {
print('选择的目录不存在');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('选择的目录不存在')),
);
}
}
} catch (e) {
print('选择路径或写入文件时出现异常:$e');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('发生错误:$e')),
);
}
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('需要存储权限才能保存文件。')),
);
}
}
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题