Flutter文件管理插件android_download_manager的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter 文件管理插件 android_download_manager 的使用

简介

android_download_manager 插件允许你通过 Android 原生下载管理器下载文件。该插件仅适用于 Android 平台。

版本和许可

  • 版本: Pub version
  • 许可: License

开始使用

权限

在使用 android_download_manager 插件之前,需要在 AndroidManifest.xml 中添加以下权限:

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

如何下载文件?

以下是一个简单的示例,展示了如何使用 android_download_manager 下载文件:

import 'dart:developer';
import 'package:android_download_manager/android_download_manager.dart';
import 'package:flutter/material.dart';
import 'dart:io';

void main() {
  // 监听下载完成事件
  AndroidDownloadManager.listen((data) {
    String id = data["id"];
    log("Download complete with ID: $id");
  });

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Android Download Manager Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                child: Text('Download File'),
                onPressed: () async {
                  // 下载文件
                  AndroidDownloadManager.enqueue(
                    downloadUrl: "https://raw.githubusercontent.com/ableco/test-files/master/images/test-image-png_4032x3024.png",
                    downloadPath: Directory.systemTemp.path,
                    fileName: "test.png",
                    description: "Downloading test image",
                    headers: {"Authorization": "Bearer your_token_here"},
                    allowScanningByMediaScanner: true,
                    notificationVisibility: NotificationVisibility.VISIBLE_NOTIFY_COMPLETED,
                  );
                },
              ),
              Text("Press the button to start downloading"),
            ],
          ),
        ),
      ),
    );
  }
}

参数说明

参数 类型 描述
downloadUrl String 要下载的文件的 URL
downloadPath String 下载文件保存的路径
fileName String 下载文件的名称(带扩展名)
description (可选) String 下载管理器中的描述
headers (可选) Map<String, String> 下载 URL 的请求头
allowScanningByMediaScanner (可选) bool 是否允许下载管理器扫描媒体文件
notificationVisibility (可选) NotificationVisibility 通知可见性选项:VISIBLE, VISIBLE_NOTIFY_COMPLETED, HIDDEN, VISIBLE_NOTIFY_ONLY_COMPLETION

监听下载完成事件

你可以通过 AndroidDownloadManager.listen 方法监听下载完成事件,并获取已完成下载的 ID:

AndroidDownloadManager.listen((data) {
  String id = data["id"];
  log("Download complete with ID: $id");
});

这里我们接收到已完成下载的 ID。

完整示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 android_download_manager 插件:

import 'dart:developer';
import 'package:android_download_manager/android_download_manager.dart';
import 'package:flutter/material.dart';
import 'dart:io';

void main() {
  // 监听下载完成事件
  AndroidDownloadManager.listen((data) {
    String id = data["id"];
    log("Download complete with ID: $id");
  });

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Android Download Manager Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                child: Text('Download File'),
                onPressed: () async {
                  // 下载文件
                  AndroidDownloadManager.enqueue(
                    downloadUrl: "https://raw.githubusercontent.com/ableco/test-files/master/images/test-image-png_4032x3024.png",
                    downloadPath: Directory.systemTemp.path,
                    fileName: "test.png",
                    description: "Downloading test image",
                    headers: {"Authorization": "Bearer your_token_here"},
                    allowScanningByMediaScanner: true,
                    notificationVisibility: NotificationVisibility.VISIBLE_NOTIFY_COMPLETED,
                  );
                },
              ),
              Text("Press the button to start downloading"),
            ],
          ),
        ),
      ),
    );
  }
}

希望这个示例能帮助你更好地理解和使用 android_download_manager 插件。如果有任何问题或需要进一步的帮助,请随时提问!


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用android_download_manager插件来管理文件下载的示例代码。android_download_manager是一个用于在Android平台上管理文件下载的Flutter插件。请注意,此示例假设你已经将android_download_manager插件添加到了你的Flutter项目中。

首先,确保在你的pubspec.yaml文件中添加了android_download_manager依赖:

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

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter项目中使用以下代码来下载文件:

import 'package:flutter/material.dart';
import 'package:android_download_manager/android_download_manager.dart';
import 'dart:io';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DownloadScreen(),
    );
  }
}

class DownloadScreen extends StatefulWidget {
  @override
  _DownloadScreenState createState() => _DownloadScreenState();
}

class _DownloadScreenState extends State<DownloadScreen> {
  AndroidDownloadManager? downloadManager;
  String? downloadId;
  String? filePath;

  @override
  void initState() {
    super.initState();
    // 初始化DownloadManager
    downloadManager = AndroidDownloadManager.getInstance(context);
  }

  void startDownload() async {
    try {
      String url = "https://example.com/yourfile.zip"; // 替换为你要下载的文件URL
      String title = "Downloading File";
      String description = "File is being downloaded...";
      String destinationInExternalFilesDir = "yourfile.zip"; // 保存在外部文件目录中的文件名
      String mimeType = "application/zip"; // 根据你的文件类型设置MIME类型

      // 开始下载
      var request = DownloadRequest(
        url: url,
        title: title,
        description: description,
        mimeType: mimeType,
        visibleInDownloadsUi: true,
        destinationInExternalFilesDir: android.os.Environment.DIRECTORY_DOWNLOADS,
        fileName: destinationInExternalFilesDir,
      );

      downloadId = await downloadManager!.enqueue(request);

      // 可选:监听下载进度
      downloadManager!.registerListener((id, status, progress) {
        print("Download ID: $id, Status: $status, Progress: $progress");

        if (status == DownloadStatus.COMPLETED) {
          // 下载完成后获取文件路径
          filePath = downloadManager!.getFilePath(id);
          print("File downloaded to: $filePath");
        }
      });
    } catch (e) {
      print("Error downloading file: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Download Manager Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: startDownload,
              child: Text('Start Download'),
            ),
            if (filePath != null)
              Text('File downloaded to: $filePath'),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 权限:确保你的AndroidManifest.xml文件中包含了必要的权限,例如WRITE_EXTERNAL_STORAGEINTERNET

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    
  2. 运行时权限:由于Android 6.0(API级别23)及更高版本引入了运行时权限,你可能需要在运行时请求这些权限。你可以使用permission_handler插件来请求权限。

  3. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑来应对各种可能的异常情况,例如网络错误、文件访问错误等。

  4. 插件版本:确保你使用的是最新版本的android_download_manager插件,因为插件的API可能会随着版本的更新而变化。

这个示例展示了如何使用android_download_manager插件来启动文件下载,并监听下载进度。下载完成后,你可以获取文件的存储路径并在应用中显示。

回到顶部