Android 下载管理器及权限获取指南

在现代 Android 应用开发中,下载管理器(DownloadManager)是一个非常便利且强大的工具。它能帮助开发者轻松地下载文件,并且支持后台下载和队列管理。同时,在某些 Android 版本中,使用下载管理器时需要特别注意权限的获取。本文将逐步介绍如何在 Android 中使用下载管理器,以及在不同 Android 版本中如何处理权限问题。

下载管理器的概述

Android 的下载管理器允许应用程序执行下载操作,并管理下载的状态。使用下载管理器,可以避免手动处理下载的细节,使用体验更佳。

使用 DownloadManager 的基本步骤
  1. 请求权限
  2. 创建 DownloadManager 实例
  3. 构建 DownloadRequest
  4. 调用 enqueue() 方法

获取下载权限

从 Android 6.0(API 级别 23)开始,Android 引入了运行时权限机制。在此之前,所有权限需要在应用安装时声明并申请。大多数情况下,当应用需要访问外部存储时,都需要请求存储权限。

Android 权限清单

首先,在 AndroidManifest.xml 中声明所需权限:

<manifest xmlns:android="
    package="com.example.downloadmanager">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
</manifest>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
请求权限示例

以下示例展示了如何在运行时请求存储权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            PERMISSION_REQUEST_CODE);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

使用 DownloadManager 下载文件

获取到权限之后,可以使用下载管理器进行下载操作。下面是一个简单的代码示例:

DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
Uri uri = Uri.parse("
DownloadManager.Request request = new DownloadManager.Request(uri);

request.setTitle("Downloading File");
request.setDescription("File is being downloaded...");
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "file.zip");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

// Enqueue the download request
long downloadId = downloadManager.enqueue(request);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

权限请求的处理

当请求权限后,需要重写 onRequestPermissionsResult 方法来处理用户的授权结果:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == PERMISSION_REQUEST_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限已授予,执行下载操作
            startDownloading();
        } else {
            // 权限被拒绝,提示用户
            Toast.makeText(this, "Permission denied to write to external storage", Toast.LENGTH_SHORT).show();
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

支持的 Android 版本

  • Android 5.0 及以下: 只需在 AndroidManifest.xml 中声明使用的权限,且在安装时即获得。
  • Android 6.0 及以上: 需在运行时请求权限,确保用户授权后再执行下载。

序列图

以下是一个简单的序列图,展示了请求权限和下载文件的流程:

System App User System App User Permission not granted Open App Check WRITE_EXTERNAL_STORAGE permission Request permission Grant permission Permission granted Start download using DownloadManager Return download ID Notify download completed

结论

在 Android 中使用下载管理器是一个简单而高效的方式来处理文件下载。掌握在不同 Android 版本中的权限处理是确保应用平稳运行的关键。对于 Android 6.0 及以上的设备,务必关注用户的权限申请,提供良好的用户体验。希望本文能对你在 Android 开发中使用下载管理器有所帮助!