从 Android 目录中获取内容

5

我正在尝试从我的应用程序目录中提取数据(mp3),并在ListView()中显示,即路径:/storage/emulated/0/Android/data/com.example.MyApp/files

为此,我使用了getExternalStorageDirectory()将我的文件保存在那里,但是使用以下代码只能获得通知声音。 我只需要来自上述路径的数据。 指导我。

import 'dart:io';
import 'package:cast/utilities/bottom_sheet_widget.dart';
import 'package:flutter/material.dart'; 
import 'package:flutter/widgets.dart';

class MyAudioList extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _MyAudioList(); //create state
}
}

class _MyAudioList extends State<MyAudioList> {
var files;
List? allSongs;

void getFiles() async {
//asyn function to get list of files
Directory dir =
    
Directory('/storage/emulated/0/Android/data/com.example.cast/files');
String mp3Path = dir.toString();
print(mp3Path);
List<FileSystemEntity> _files;
List<FileSystemEntity> _songs = [];
_files = dir.listSync(recursive: true, followLinks: false);
for (FileSystemEntity entity in _files) {
  String path = entity.path;
  if (path.endsWith('.mp3')) _songs.add(entity);
}
print(_songs);
// print(_songs.length);
setState(() {
  files = _files;
  allSongs = _songs;
}); //update the UI
}

@override
void initState() {
getFiles(); //call getFiles() function on initial state.
super.initState();
 }

@override
Widget build(BuildContext context) {
return RefreshIndicator(
  onRefresh: () async {
    getFiles();
  },
  child: Scaffold(
      body: files == null
          ? Center(
              child: Text(
              'Seaching..',
              style: TextStyle(color: Colors.white),
            ))
          : ListView.builder(
              //if file/folder list is grabbed, then show here
              itemCount: allSongs!.length, //_songs.length ?? 0,
              itemBuilder: (context, index) {
                return ListTile(
                  key: UniqueKey(),
                  leading: Row(
                    mainAxisSize: MainAxisSize.min,
                    children: [
                      ClipRRect(
                        borderRadius: BorderRadius.circular(8),
                        child: Image.network(
                          "https://images.unsplash.com/photo- 
       1541963463532-d68292c34b19?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8Ym9va3xlbnwwfHwwfHw%3D&w=1000&q=80",
                          width: 50,
                          height: 50,
                          fit: BoxFit.cover,
                        ),
                      ),
                    ],
                  ),
                  title: Text(
                    '$allSongs',
                    maxLines: 1,
                    style: const TextStyle(
                      color: Colors.white,
                      fontWeight: FontWeight.w400,
                    ),
                  ),
                  subtitle: Text(
                    "publisher",
                    style: TextStyle(
                      color: Colors.grey[400]!,
                      fontSize: 13,
                    ),
                  ),
                  trailing: Row(mainAxisSize: MainAxisSize.min, 
   children: [
                    IconButton(
                      onPressed: () {},
                      icon: Icon(Icons.more_vert, color: 
   Colors.grey),
                    )
                  ]),
                );
              },
            )),
);
}
}

我甚至看不到你的代码中哪里使用了你的路径!请展示一下你的代码中是如何使用路径的。另外,除了从手机存储中获取通知声音而不是你的应用程序创建的文件之外,代码是否正确运行? - Karolina Hagegård
@KarolinaHagegård,请查看这个新的代码,它可以实现你想要的功能,但我需要将其以ListView格式显示,并包含图像标题和URL。 - Digamber negi
@KarolinaHagegård 您的答案看起来很有帮助。 - Digamber negi
祝你好运。 - Karolina Hagegård
2个回答

1
要列出所有的文件或文件夹,您需要使用flutter_file_manager、path和path_provider_ex flutter包。请在您的pubspec.yaml文件中添加以下行,以将此包添加到您的依赖项中。
dependencies:
  flutter:
    sdk: flutter
  path: ^1.6.4
  path_provider_ex: ^1.0.1
  flutter_file_manager: ^0.2.0

在 标签之前,在你的 android/app/src/main/AndroidManifest.xml 中添加读写权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

如果您仍然遇到“Permission Denied”错误,请在AndroidManifest.xml文件中添加以下行。
<application
      android:requestLegacyExternalStorage="true"

请见注释中的解释。

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_file_manager/flutter_file_manager.dart';
import 'package:path_provider_ex/path_provider_ex.dart';
//import package files

void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return  MaterialApp(
          home: MyFileList(), //call MyFile List 
    );
  }
}

//apply this class on home: attribute at MaterialApp()
class MyFileList extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    return _MyFileList();
  }
}

class _MyFileList extends State<MyFileList>{
  var files;
 
  void getFiles() async { //asyn function to get list of files
      List<StorageInfo> storageInfo = await PathProviderEx.getStorageInfo();
      var root = storageInfo[0].rootDir; //storageInfo[1] for SD card, geting the root directory
      var fm = FileManager(root: Directory(root)); //
      files = await fm.filesTree( 
      //set fm.dirsTree() for directory/folder tree list
        excludedPaths: ["/storage/emulated/0/Android"],
        extensions: ["mp3"] //optional, to filter files, remove to list all,
        //remove this if your are grabbing folder list
      );
      setState(() {}); //update the UI
  }

  @override
  void initState() {
    getFiles(); //call getFiles() function on initial state. 
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title:Text("File/Folder list from SD Card"),
        backgroundColor: Colors.redAccent
      ),
      body:files == null? Text("Searching Files"):
           ListView.builder(  //if file/folder list is grabbed, then show here
              itemCount: files?.length ?? 0,
              itemBuilder: (context, index) {
                    return Card(
                      child:ListTile(
                         title: Text(files[index].path.split('/').last),
                         leading: Icon(Icons.image),
                         trailing: Icon(Icons.delete, color: Colors.redAccent,),
                      )
                    );
              },
          )
    );
  }
}

这似乎是旧的,没有空安全性。 - Digamber negi
是的,请检查一次以获取最新内容。 - Mahesh

0
由于flutter_file_manager包已停用,我使用了它搜索文件的代码和之前由Mahesh编写的参数,并将其实现在这个存储库中的一个文件中,以便人们可以自由使用。

https://github.com/alaincruz06/file_searcher

PS:不编辑或排序(或执行旧包执行的其他技巧),但它是一种更新的(空安全)解决方案,可查找具有已知扩展名的特定文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接