Flutter媒体文件删除插件flutter_media_delete的使用

Flutter媒体文件删除插件flutter_media_delete的使用

特性

  • Scoped Storage:使用Android的scoped storage API在Android Q(API 29)及以上版本中删除媒体文件,确保符合现代Android存储策略。
  • 删除单个媒体文件:通过提供文件路径可以删除特定的媒体文件(视频、音频或图片)。此方法适用于scoped和传统的存储模型,具体取决于Android版本。
  • 删除指定文件夹中的所有媒体文件:允许你删除给定文件夹中的所有媒体文件,包括视频、音频文件和图片。此操作在Android Q及以上版本中使用scoped存储,而在较旧版本中使用传统存储。
  • 错误处理:提供详细的错误消息和反馈,包括文件未找到或用户拒绝删除的情况。这确保你在文件删除过程中收到清晰的信息。
  • 兼容性:设计用于处理不同Android版本上的文件删除操作,在必要时适应scoped存储要求。

安装

要将此包添加到你的Flutter项目中,请按照以下步骤操作:

添加依赖

pubspec.yaml文件中添加flutter_media_delete作为依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_media_delete: ^1.0.0

^1.0.0替换为最新版本的包。

安装依赖

在终端中运行flutter pub get以安装包。

使用

导入插件

import 'package:flutter_media_delete/flutter_media_delete.dart';

删除单个媒体文件

要删除一个单独的媒体文件,请使用deleteMediaFile方法:

try {
  final result = await FlutterMediaDelete.deleteMediaFile('/path/to/media/file.mp4');
  print('Delete result: $result');
} catch (e) {
  print('Error: $e');
}

删除指定文件夹中的所有媒体文件

要删除特定文件夹中的所有媒体文件,请使用deleteMediaFolder方法:

try {
  final result = await FlutterMediaDelete.deleteMediaFolder('/path/to/media/folder');
  print('Delete result: $result');
} catch (e) {
  print('Error: $e');
}

平台支持

  • Android:支持Android Q(API 29)及以上版本。
    • 使用scoped存储进行媒体删除。
    • 处理权限请求和用户交互。
  • iOS:当前未实现。iOS支持可能在未来版本中添加。

注意事项

  • Scoped Storage:对于Android Q(API 29)及以上版本,scoped storage API用于删除媒体文件,因为Dart本身无法处理这些操作,由于权限限制。
  • 权限:确保应用程序具有访问和删除设备上媒体文件所需的权限。

故障排除

  • 权限:验证应用程序是否具有scoped存储操作所需的权限。
  • 错误信息:如果文件删除失败,请检查错误日志以获取详细信息。

贡献

欢迎贡献!请打开问题或提交拉取请求以贡献项目。

许可证

该项目受Apache License 2.0许可保护 - 详情见LICENSE文件。


示例代码

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_media_delete/flutter_media_delete.dart';

import 'services/media_utils.dart';
import 'services/permission_handler_service.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Media Manager',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        textTheme: const TextTheme(
          headlineSmall:
              TextStyle(color: Colors.black87, fontWeight: FontWeight.bold),
          bodyMedium: TextStyle(color: Colors.black54),
        ),
      ),
      home: MediaListScreen(),
    );
  }
}

class MediaListScreen extends StatefulWidget {
  [@override](/user/override)
  _MediaListScreenState createState() => _MediaListScreenState();
}

class _MediaListScreenState extends State<MediaListScreen> {
  List<File> _mediaFiles = [];
  List<Directory> _folders = [];
  bool _isLoading = true;

  [@override](/user/override)
  void initState() {
    super.initState();
    _requestPermissions();
  }

  Future<void> _requestPermissions() async {
    final result = await PermissionHandlerService.requestPermissions();
    if (result) {
      _loadMedia();
    } else {
      setState(() {
        _isLoading = false;
      });
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(content: Text('Permissions not granted')),
        );
      }
    }
  }

  Future<void> _loadMedia() async {
    setState(() {
      _isLoading = true;
    });

    final mediaFiles = await MediaUtils.getMediaFiles(limit: 5);
    final folders = await MediaUtils.getMediaFolders(limit: 5);

    setState(() {
      _mediaFiles = mediaFiles;
      _folders = folders;
      _isLoading = false;
    });
  }

  Future<void> _deleteFile(String path) async {
    try {
      final result = await FlutterMediaDelete.deleteMediaFile(path);
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text(result),
        ));
      }
    } on Exception catch (e) {
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text(e.toString()),
        ));
      }
    } finally {
      _loadMedia(); // 重新加载列表
    }
  }

  Future<void> _deleteFolder(String path) async {
    try {
      final result = await FlutterMediaDelete.deleteMediaFolder(path);
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text(result),
        ));
      }
    } on Exception catch (e) {
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text(e.toString()),
        ));
      }
    } finally {
      _loadMedia(); // 重新加载列表
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Media Manager'),
        centerTitle: true,
      ),
      body: _isLoading
          ? const Center(child: CircularProgressIndicator())
          : ListView(
              padding: const EdgeInsets.all(16.0),
              children: [
                Text(
                  "Media Files:",
                  style: Theme.of(context).textTheme.titleLarge,
                ),
                const SizedBox(height: 10),
                ..._mediaFiles.map((file) => Card(
                      margin: const EdgeInsets.symmetric(vertical: 5.0),
                      child: ListTile(
                        contentPadding: const EdgeInsets.all(16.0),
                        title: Text(file.path),
                        trailing: IconButton(
                          icon: const Icon(Icons.delete, color: Colors.red),
                          onPressed: () => _deleteFile(file.path),
                        ),
                      ),
                    )),
                const SizedBox(height: 20),
                Text(
                  "Media Folders:",
                  style: Theme.of(context).textTheme.titleLarge,
                ),
                const SizedBox(height: 10),
                ..._folders.map((folder) => Card(
                      margin: const EdgeInsets.symmetric(vertical: 8.0),
                      child: ListTile(
                        contentPadding: const EdgeInsets.all(16.0),
                        title: Text(folder.path),
                        trailing: IconButton(
                          icon: const Icon(Icons.delete, color: Colors.red),
                          onPressed: () => _deleteFolder(folder.path),
                        ),
                      ),
                    )),
              ],
            ),
    );
  }
}

更多关于Flutter媒体文件删除插件flutter_media_delete的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter媒体文件删除插件flutter_media_delete的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter媒体文件删除插件flutter_media_delete的代码示例。这个插件允许你在Flutter应用中删除媒体文件(如图片和视频)。在使用之前,请确保你已经在pubspec.yaml文件中添加了该依赖,并运行了flutter pub get

首先,在pubspec.yaml中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_media_delete: ^x.y.z  # 替换为最新版本号

然后,在你的Flutter项目中,你可以按照以下步骤使用flutter_media_delete插件:

  1. 导入插件: 在你的Dart文件中导入flutter_media_delete插件。

    import 'package:flutter_media_delete/flutter_media_delete.dart';
    
  2. 请求权限: 在删除媒体文件之前,你需要确保你的应用有适当的权限。通常,这包括存储权限。以下是一个简单的权限请求示例(注意:实际权限请求可能会因平台和设备而异)。

    import 'package:permission_handler/permission_handler.dart';
    
    Future<void> requestPermissions() async {
      var status = await Permission.storage.status;
      if (!status.isGranted) {
        var result = await Permission.storage.request();
        if (!result.isGranted) {
          // 处理权限被拒绝的情况
          throw Exception("存储权限被拒绝");
        }
      }
    }
    

    注意:为了使用permission_handler插件,你需要在pubspec.yaml中添加该依赖。

  3. 删除媒体文件: 使用flutter_media_delete插件提供的API来删除媒体文件。以下是一个删除图片文件的示例。

    Future<void> deleteMediaFile(String filePath) async {
      try {
        await requestPermissions();  // 请求权限
    
        // 删除文件
        bool isDeleted = await FlutterMediaDelete.deleteFile(filePath);
    
        if (isDeleted) {
          print("文件删除成功");
        } else {
          print("文件删除失败");
        }
      } catch (e) {
        print("删除文件时发生错误: $e");
      }
    }
    
  4. 调用删除函数: 在你的UI代码中调用上述删除函数。例如,在一个按钮点击事件中:

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Flutter Media Delete Example'),
            ),
            body: Center(
              child: ElevatedButton(
                onPressed: () async {
                  // 替换为你的媒体文件路径
                  String filePath = "/storage/emulated/0/DCIM/Camera/your_image.jpg";
                  await deleteMediaFile(filePath);
                },
                child: Text('删除媒体文件'),
              ),
            ),
          ),
        );
      }
    }
    

请注意,上述代码示例仅用于演示目的,并假设你已经有了要删除的文件路径。在实际应用中,你需要确保文件路径的正确性,并妥善处理可能的异常情况,如文件不存在或权限被拒绝等。

此外,由于不同设备和操作系统版本可能具有不同的存储和权限管理行为,因此在实际部署之前,请务必在目标设备和操作系统版本上进行充分测试。

回到顶部