升级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
相关产品推荐
相关产品推荐

