Content Provider仍是合适的跨应用通信方式吗?如何实现跨应用取文件功能
问题1解答:Content Provider是否仍是合适的跨应用通信实现方案
是,Content Provider至今仍是Android官方推荐的跨应用数据/文件共享标准方案,不存在过时问题:
- 官方仍在持续迭代相关能力,Jetpack组件中提供的
FileProvider就是Content Provider的子类,专门用于应用间文件共享,是分区存储规则下唯一官方认可的跨应用文件访问载体 - 自带权限管控能力,支持临时授予其他应用读写权限,无需暴露应用内部存储路径,安全性远高于传统的File Uri方案
- 适配全版本Android系统,是联系人、短信、媒体库等系统核心能力的底层跨应用通信实现
仅在需要跨应用调用执行方法的场景下,优先选择AIDL、Bound Service方案;其余跨应用数据、文件共享场景,Content Provider仍是最优选择。
问题2解答:跨应用选择文件上传附件的优雅实现方案
推荐直接使用Android官方提供的*存储访问框架(SAF)*实现,该方案完全适配Android 4.4及以上全版本系统,符合分区存储规则,无需申请存储权限,交互逻辑和Gmail、WhatsApp完全一致:
实现步骤
- 启动系统自带的文件选择器,无需自定义UI,自动整合相册、文件管理器、第三方云盘等所有支持文件选择的应用入口,示例代码:
// 基于Activity Result API实现,推荐优先使用 val pickFileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val fileUri = result.data?.data ?: return@registerForActivityResult // 拿到Content Uri后直接读取上传 } } // 启动选择器,可按需筛选文件类型 val pickIntent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "*/*" // 仅选图片可设置为image/*,仅选文档可设置为application/* } pickFileLauncher.launch(pickIntent)
- 拿到返回的Content Uri后,直接通过
contentResolver.openInputStream(uri)获取文件流,无需转存为本地文件即可直接上传,减少存储空间占用 - 若需要长期访问选中的文件,可调用
contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)申请持久化访问权限,无需申请外部存储权限
如果仅需要选择图片/视频类媒体文件,可直接使用ActivityResultContracts.PickVisualMedia契约,代码更简洁,还支持多选能力。
内容的提问来源于stack exchange,提问作者Pvr Pasupuleti
相关产品推荐
相关产品推荐

