如何在Flutter中读取音频扩展并在ListView中显示?

时间:2018-11-30 03:15:59

标签: android dart flutter

如何在Flutter中实现从SD卡读取音频文件并将其显示到ListView的功能?

3 个答案:

答案 0 :(得分:0)

如果您正在谈论能够识别文件扩展名,那么首先需要安装Path并将其导入:

import 'package:path/path.dart' as p;

然后进行检查:

String _extension = p.extension(_someFile).split('?').first;

答案 1 :(得分:0)

我建议您阅读Android Studio | Files

的文档
  • 您可以使用fileList()获取ArrayList
  • 此外,使用for循环获取名称和路径-> file.getName()| file.getPath()

答案 2 :(得分:0)

如果您要显示音频文件列表-这是我的代码示例:

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_app/storage.dart';
import 'package:path_provider/path_provider.dart';
import 'package:simple_permissions/simple_permissions.dart';

class BrowserScaffold extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _BrowserScaffoldState();
  }
}

class _BrowserScaffoldState extends State<BrowserScaffold> {
  final List<FileSystemEntity> files = List<FileSystemEntity>();
  final savedFiles = Set<File>();
  Directory parent;
  ScrollController controller = ScrollController();

  @override
  Widget build(BuildContext context) {
    if (parent == null) {
      SimplePermissions
          .requestPermission(Permission.WriteExternalStorage)
          .then((value) {
        if (value == PermissionStatus.authorized) {
          localPath.then((String value) {
            Directory dir = Directory(value);
            while (dir.path != dir.parent.path) {
              dir.isAbsolute;
              dir = dir.parent;
            }
            parent = dir;
            setState(() {
              files.addAll(dir.parent.listSync());
              sortFiles();
            });
          });
        } else {
          SimplePermissions.openSettings();
        }
      });
    }
    return Scaffold(
      appBar: AppBar(
        title: Text('Files'),
        actions: <Widget>[
          IconButton(icon: Icon(Icons.check), onPressed: apply),
        ],
      ),
      body: buildList(),
    );
  }

  void sortFiles() {
    for (int i = files.length - 1; i >= 0; i--) {
      FileSystemEntity entity = files[i];
      if (entity is Link) {
        files.remove(entity);
      } else if (entity is Directory) {
        try {
          entity.listSync();
        } catch (ex) {
          print('catch: ${entity.path}, $ex');
          files.remove(entity);
        }
      }
    }
    files.sort((FileSystemEntity a, FileSystemEntity b) {
      if (a is Directory && b is File) return -1;
      if (a is File && b is Directory) return 1;
      return a.path.compareTo(b.path);
    });
  }

  Widget buildList() {
    if (parent == null) return ListView();
    bool isRoot = parent.path == parent.parent.path;
    return ListView.builder(
      itemBuilder: (context, i) {
        if (i.isOdd)
          return Divider(
            height: 4.0,
          );
        final index = isRoot ? i ~/ 2 : i ~/ 2 - 1;
        return buildRow(index);
      },
      itemCount: isRoot ? files.length * 2 : (files.length + 1) * 2,
      controller: controller,
    );
  }

  Widget buildRow(int index) {
    if (index == -1) return getRootTile();
    FileSystemEntity file = files[index];

    if (file is Directory) return getDirectoryTile(file);
    if (file is File) return getFileTile(file);
    if (file is Link)
      return Container(
        height: 0.0,
      );
    return Container(
      height: 0.0,
    );
  }

  Widget getRootTile() {
    return ListTile(
      title: Text('../'),
      trailing: Icon(Icons.keyboard_backspace),
      onTap: () {
        setState(() {
          parent = parent.parent;
          List<FileSystemEntity> rootList = parent.listSync();
          files.clear();
          files.addAll(rootList);
          sortFiles();
        });
      },
    );
  }

  Widget getDirectoryTile(Directory dir) {
    return ListTile(
      title: Text(dir.path.split('/').last),
      trailing: Icon(
        Icons.folder_open,
        color: Colors.grey,
      ),
      onTap: () {
        setState(() {
          parent = dir;
          files.clear();
          files.addAll(dir.listSync());
          sortFiles();
        });
      },
    );
  }

  Widget getFileTile(File file) {
    bool isSaved = savedFiles.map((file) => file.path).contains(file.path);
    final List<String> extensions = <String>[
      "MP3",
      "WAV",
      "AAC",
      "WMA",
      "AMR",
      "OGG",
      "MIDI"
    ];
    bool isRightType =
        extensions.contains(file.path.split('.').last.toUpperCase());
    return ListTile(
      title: Text(file.path.split('/').last),
      trailing: isRightType
          // ignore: missing_required_param
          ? IconButton(
              icon: Icon(
                isSaved ? Icons.check_box : Icons.check_box_outline_blank,
                color: isSaved ? Colors.blueGrey : Colors.grey,
              ),
            )
          : null,
      onTap: () {
        setState(() {
          if (isSaved) {
            savedFiles.remove(file);
          } else {
            savedFiles.add(file);
          }
        });
      },
    );
  }

  void apply() async {
    final List<Track> list = List();
    list.addAll(savedFiles.map((file) => Track(file.path)));
    Navigator.of(context).pop(list);
  }

  Future<String> get localPath async {
    final directory = await getApplicationDocumentsDirectory();
    return directory.path;
  }
}

就我而言,我显示所有文件,但只能选择音频(带有复选框)