ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

安卓11+存储权限踩坑实录:BilibiliCacheVideoMerge双模式Path/Uri缓存文件访问方案完整对比

安卓11+存储权限踩坑实录:BilibiliCacheVideoMerge双模式Path/Uri缓存文件访问方案完整对比 安卓11存储权限踩坑实录BilibiliCacheVideoMerge双模式Path/Uri缓存文件访问方案完整对比【免费下载链接】BilibiliCacheVideoMergeAndroid上将bilibili缓存视频合并导出为mp4支持安卓5.0 ~ 13视频挂载弹幕播放(Android consolidates and exports the bilibilibili cache video to mp4, supports Android 5.0~13, and plays the video on the screen)项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliCacheVideoMerge这篇文章以开源项目 BilibiliCacheVideoMergeB站缓存视频合并导出 mp4 工具为例用一次真实的踩坑实录讲清楚在安卓 11 的存储权限新规则下它如何通过Path 直接路径模式与Uri 文件访问模式双方案设计绕过限制读取 B 站缓存目录。为什么读文件在安卓11上会翻车B 站缓存的视频并非一个 mp4而是一套分片文件目录结构大致是缓存根目录 └── 合集目录如某番剧 └── 章节目录第1集 / 第2集... ├── audio.m4s ← 音频 ├── video.m4s ← 视频 ├── entry.json ← 元信息标题、封面、BV号 └── danmaku.xml ← 弹幕在安卓 10 及以前应用拿到存储权限后用File.listFiles()就能直接遍历这套目录。但**安卓 11API 30引入范围存储Scoped Storage**后/storage/emulated/0/Android/data/...这类沙盒目录被严格隔离——B 站缓存恰好就住在这里第三方应用再用传统 File API 直接访问结果就是listFiles()返回null或空数组主页一片空白缓存列表刷不出来部分机型直接抛权限异常这就是本项目要解决的核心矛盾合并 B 站缓存视频前提是先读得到缓存目录。坑点现场Path 模式的失效边界Path 模式的实现在 PathCacheFileManager.kt用File.listFiles()逐层遍历合集 → 章节再由 FileTool.getNeedPath() 按文件名识别出audio.m4s、video.m4s、entry.json、danmaku.xml四件套缺失时通过 needSrcErrorHandle() 给出xx 下没找到 video.m4s这类友好提示。在安卓 11 上这条链路一旦触碰Android/data目录就失效——不是代码写错了而是系统不再放行。于是作者没有去硬刚权限而是为 Uri 通道做了一套完整平行实现。双模式架构Path 与 Uri 全对比两种模式都实现同一个接口 ICacheFileManager.kt公共逻辑全选、刷新、加载弹窗等收敛在 BaseCacheFileManager.kt 中是教科书式的策略模式对比维度Path 直接模式Uri 文件访问模式适用场景安卓 10 及以下或缓存路径不在Android/data安卓 11 且路径落在Android/data沙盒内核心 APIjava.io.File.listFiles()SAF 的DocumentFileContentResolver授权方式传统存储权限SAF 目录选择 持久化授权遍历速度快慢叠加 MMKV 缓存 进度弹窗兜底核心实现PathCacheFileManager.ktUriCacheFileManager.kt两条流水线在功能上完全对称Path 模式FileTool.getNeedPath() 收集文件的绝对路径Uri 模式UriTool.getNeedUri() 收集文件的content Uri每个缓存条目都会通过CacheFile实体中的useUri标记记明我属于哪种模式后续合并流程据此走对应分支。应用如何自动选择模式模式不是让用户手动切换的而是根据路径特征自动判定。在 MainFileShowFragment.java 中每次刷新列表前先用FileTools.underAndroidDataUseUri(path)判断缓存路径是否位于Android/data之下——是则走uriCacheFileManager否则走pathCacheFileManager。也就是说老系统/普通目录 → Path新系统/沙盒目录 → Uri用户全程无感知。Uri 模式的两大成本作者如何补上① 授权成本SAF 必须用户点头Uri 模式依赖 SAFStorage Access Framework权限要通过系统目录选择器授予。UriTool.grantedUriPermission() 会先检查目标 Uri 是否已有持久化授权没有就弹出授权提示对话框引导用户跳转系统授权页。该检查在 MainActivity 的onStart中每次拉起防止授权失效后静默失败。② 速度成本DocumentFile 遍历非常慢SAF 的listFiles()每调用一次都要走 ContentProvider大缓存目录下会卡得明显。作者的三板斧进度反馈遍历过程中弹窗实时显示3 / 128这类进度UriCacheFileManager.ktMMKV 结果缓存getCacheMsgByMMKV() 把章节 → 四件套 Uri 标题/BV号的解析结果按 Uri 为 key 存入 MMKV分钟级过期二次进入几乎零开销流式转存合并前由 documentFile2File() 通过openInputStream(uri)把 content Uri 流式写成本地临时 File1KB 缓冲、每 40KB 回调一次进度交给 FFmpeg 合并MergeProgressDialog.java 再按useUri标记选择对应的展平逻辑。顺带一提合并完成后的 mp4 分享也踩过权限坑安卓 7.0 直接Uri.fromFile()会抛FileUriExposedException所以 FileTool.shareFile() 在 SDK ≥ 24 时统一改走 FileProvider配合 AndroidManifest.xml 中声明的com.molihua.hlbmerge.fileprovider。总结安卓11存储访问的3条经验别假设 File API 万能安卓 11 下其他应用的Android/data沙盒目录直连读取基本无望SAF/Uri 才是正路路径特征 系统版本做自动分流像本项目一样按underAndroidDataUseUri()动态选路比让用户手选更省心用缓存和流式转存对冲 SAF 的性能税MMKV 记结果、弹窗给进度、合并前流式落盘慢也能用。对于想合并 B 站缓存视频的普通用户这套双模式设计意味着无论你的手机是安卓 5 还是安卓 13只要按弹窗提示完成一次授权缓存视频就能正常列出并合并导出。【免费下载链接】BilibiliCacheVideoMergeAndroid上将bilibili缓存视频合并导出为mp4支持安卓5.0 ~ 13视频挂载弹幕播放(Android consolidates and exports the bilibilibili cache video to mp4, supports Android 5.0~13, and plays the video on the screen)项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliCacheVideoMerge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表