You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级SDK 34后应用视频下载故障求助

问题根源

Android 14(SDK 34)彻底废弃了WRITE_EXTERNAL_STORAGE权限,即使申请该权限也无法获得写入外部存储的能力,这直接导致你的权限检查逻辑失效,后续下载操作因无合法存储访问权限挂起。

解决步骤

1. 调整权限检查逻辑

移除对WRITE_EXTERNAL_STORAGE的依赖,根据系统版本适配权限:

  • Android 13(SDK 33)及以下:保留WRITE_EXTERNAL_STORAGE权限申请逻辑
  • Android 14(SDK 34)及以上:无需申请该权限,直接执行下载操作;若下载逻辑依赖读取本地媒体,可申请READ_MEDIA_VIDEO权限

修改后的权限检查代码示例:

View download = view.findViewById(R.id.download);
if (getResources().getBoolean(R.bool.downloads_enabled)) {
    download.setOnClickListener(v -> {
        boolean hasPermission;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            // SDK34及以上无需WRITE_EXTERNAL_STORAGE,若需读取视频可检查READ_MEDIA_VIDEO
            hasPermission = true;
            // 若下载逻辑需要读取本地视频,替换为:
            // hasPermission = EasyPermissions.hasPermissions(requireContext(), Manifest.permission.READ_MEDIA_VIDEO);
        } else {
            hasPermission = EasyPermissions.hasPermissions(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }

        if (hasPermission) {
            submitForDownload();
        } else {
            String[] permissions = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
                    ? new String[]{Manifest.permission.READ_MEDIA_VIDEO}
                    : new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
            
            EasyPermissions.requestPermissions(
                    this,
                    getString(R.string.permission_rationale_download),
                    SharedConstants.REQUEST_CODE_PERMISSIONS_DOWNLOAD,
                    permissions);
        }
    });
    download.setVisibility(View.VISIBLE);
} else {
    download.setVisibility(View.GONE);
}

2. 优化下载逻辑(推荐使用DownloadManager)

高版本系统中,直接操作外部存储易触发权限限制,建议改用系统提供的DownloadManager处理视频下载,它会自动处理存储权限和文件管理,避免挂起问题。

替换submitForDownload()的实现示例:

private void submitForDownload() {
    String videoUrl = "你的视频下载地址";
    String fileName = "视频文件名.mp4";

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(videoUrl));
    request.setTitle("视频下载");
    request.setDescription("正在下载视频");
    // 指定下载到公共下载目录,无需额外权限
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

    DownloadManager downloadManager = (DownloadManager) requireContext().getSystemService(Context.DOWNLOAD_SERVICE);
    if (downloadManager != null) {
        downloadManager.enqueue(request);
    }
}

3. 清单文件适配

确保清单文件中添加必要的权限声明(按需添加):

<!-- SDK33及以下需要 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="33" />
<!-- SDK33及以上读取视频需要 -->
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" />
<!-- 网络权限(下载必须) -->
<uses-permission android:name="android.permission.INTERNET" />

内容的提问来源于stack exchange,提问作者peter Magdy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 13:35:01