如何在颤动中将音乐文件提取到 Android 10 及更低版本的应用程序中

Posted

技术标签:

【中文标题】如何在颤动中将音乐文件提取到 Android 10 及更低版本的应用程序中【英文标题】:How to fetch music files into app on Android 10 and below in flutter 【发布时间】:2021-08-22 10:28:09 【问题描述】:

我创建了一个flutter音乐应用,它可以从手机存储中提取音乐文件到应用程序中。它在Android 11上完美运行,但在Android 10中无法提取音乐文件及以下。我已经尝试了很多东西,但仍然没有奏效。这是获取音乐文件的代码

    import 'dart:io';

import 'package:flutter/cupertino.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:app_settings/app_settings.dart';

class DirectoryLogic

  List <String> musicFiles = [];

  fetchData(Function function,BuildContext context)async


    await Permission.storage.request();

    if(await Permission.storage.isGranted)
      print('granted');

      final Directory dir =  Directory((await getExternalStorageDirectory()).path.toString().substring(0,20));

      dir.list(recursive: true).listen((FileSystemEntity entity) 
        if(entity.path.contains('mp3') )
          musicFiles.add(entity.path);
        

      ,onDone: function,);

    

    else
      await AppSettings.openAppSettings();
  
  

//  final Directory extDir = await getExternalStorageDirectory();
//final String dirpath = extDir.path.toString().substring(0,20);
//  print(dirpath);




【问题讨论】:

【参考方案1】:

这可能是由于 android 10 和 11 中引入的 Scoped Storage Access。

阅读https://developer.android.com/about/versions/11/privacy/storage

https://developer.android.com/about/versions/10/privacy/changes

我已经通过启用旧版存储访问 (Example) 解决了这个问题,但我认为我们不能再长时间使用它,因为谷歌正在限制它。但就目前而言,这很好用。

如示例所示,在 AndroidManifest.xml 文件中使用android:requestLegacyExternalStorage="true"

【讨论】:

当我尝试添加 android:requestLegacyExternalStorage 属性时,它显示“属性 requestLegacyExternalStorage 仅用于 API 级别 29 及更高级别” 如果编译运行正常就忽略它。

以上是关于如何在颤动中将音乐文件提取到 Android 10 及更低版本的应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

在颤动中将文件发送到api

如何在颤动中将 ImageCache 保存到磁盘?

如何在颤动中将图像复制到剪贴板

如何在颤动中将页脚添加到 ReorderableListView

如何在颤动中将图标放在自定义按钮内

如何在颤动中将焦点转移到下一个文本字段?