dart 如何排除Android目录,当使用Flutter从Android设备列出文件/文件夹?

jrcvhitl  于 2023-07-31  发布在  Android
关注(0)|答案(1)|浏览(84)

我无法从我的Android设备中排除Android目录并列出所有文件夹和文件。# Flutter

final directory = '/storage/emulated/0/';
final myDir = Directory(fileStr); <- Here i want to Exclude 'Android' Directory

字符串
错误类型

FileSystemException (FileSystemException: Directory listing failed, path = '/storage/emulated/0/Android/obb' (OS Error: Permission denied, errno = 13))


我想列出我的Android设备上的所有文件夹和文件,但不包括Android目录。# Flutter

5hcedyr0

5hcedyr01#

面对同样的问题,最近我试图列出所有目录和子目录从我的Android手机和得到同样的错误.

Unhandled Exception: PathAccessException: Directory listing failed, path = '/storage/emulated/0/Android/data' (OS Error: Permission denied, errno = 13)

字符串
注意,这只发生在Android版本11及以上。谷歌最新政策不允许应用程序读取Android文件夹内的其他应用程序数据。
我用下面的代码实现了这一点。
不要忘记在您的androidManifest中添加此权限

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />


然后在访问文件之前请求权限

var status = await Permission.manageExternalStorage.request();

    //status = await Permission.storage.request();
if (status.isGranted == true) {

} else {

}


首先用首选目录声明一个函数,先通过将false传递给listSync递归参数列出所有父文件夹

Future getAllDir() async {
    Directory dir = Directory('/storage/emulated/0');

    List<FileSystemEntity> entries = dir.listSync(recursive: false).toList();
  }


如果recursive为true,则会列出子目录,对于android版本11及以上版本,这将抛出上述错误。
现在你可以进一步过滤列表,并删除任何与Android文件夹或目录匹配的目录

Future getAllDir() async {
    Directory dir = Directory('/storage/emulated/0');

    List<FileSystemEntity> entries = dir.listSync(recursive: false).toList();

    entries.removeWhere(
        (element) => element.path == "/storage/emulated/0/Android");
    log("Directories $entries");
    
  }


好了,现在您可以对过滤的FileSystemEntity列表执行任何您想做的事情了
范例:
您可以进一步对筛选的列表运行for循环操作,并且对于每个FileSystemEntity,您可以通过FileSystemEntity路径传递一个新目录。
下面的操作列出所有PDF文件从您的设备从所有目录排除Android文件夹/目录

Future getAllDir() async {
    Directory dir = Directory('/storage/emulated/0');

    List<FileSystemEntity> entries = dir.listSync(recursive: false).toList();

    entries.removeWhere(
        (element) => element.path == "/storage/emulated/0/Android");

    log("Directories $entries");

    for (FileSystemEntity entity in entries) {
      // new directory for each of the entries

      Directory newdir = Directory(entity.path);
      

      // inner for loop operation to list all directories and sub directories for each entry
      
      // and you have to pass true to recursive argument

 await for (FileSystemEntity newEntity in newdir.list(recursive: true, followLinks: false)) {
        if (newEntity.path.endsWith('.pdf')) {
          log("PDF Files ${newEntity.path}");
        } else {
          log("No Files ");
        }
      }
    }
  }

相关问题