1. 引言
随着智能手机技术的不断发展,影像系统已成为各大手机厂商宣传新机时的重要焦点。从拍照到视频录制,影像系统的进步不仅体现在硬件的提升,更在于软件算法和用户体验的创新。如今,手机拍摄并分享到社交媒体已成为人们日常生活的一部分,手机相册中存储的大量图片和视频记录了我们的每一天,成为了现代社会中不可或缺的个人记忆库。
然而,在这个数据驱动的互联网广告时代,互联网公司对用户数据的需求愈发强烈,尤其是用户手机中的个人数据,如相册里的图片和视频。这些信息成为了广告商推送个性化广告内容的重要资产,但同时也带来了隐私安全的严峻挑战。用户的相册通常包含了大量敏感信息,若这些数据被未经授权地收集或滥用,将严重侵犯用户隐私。
为应对这一问题,谷歌在 Android 13 中推出了官方照片选择器功能。照片选择器不仅提供了浏览和搜索功能,还按时间降序向用户展示媒体库中的文件,允许用户仅向应用授予特定图片和视频的访问权限,而非整个媒体库。这一功能为用户提供了更加安全的隐私保护方式,同时也确保了应用能够获得必要的数据。
在本文中,我们将深入分析如何实现一个简易的图片选择器,支持从单张图片选择到多张图片选择的功能。注意:(多选功能仅支持 Android 13(API 33)及以上。)!!!
2. 背景
在 Android 中,文件选择功能通常是通过Intent来实现的。Intent.ACTION_PICK和Intent.ACTION_OPEN_DOCUMENT是 Android 系统提供的常用选择文件的意图动作。这些动作可以用来启动文件选择器,从而允许用户选择文件。在过去,图片选择功能大多通过Intent.ACTION_PICK来选择单张图片,但 Android 13 引入了对多张图片选择的原生支持,开发者可以在应用中更方便地实现多图选择功能同时保护用户的隐私。
3. 技术分析
3.1 效果预览
我们可以先到对应的官网看一下(这里挂个链接)
照片选择器 | Android Developers (google.cn)
可以看到用户可以选择想要的图片进行添加,并且支持单选和多选。
3.2 实现分析
这是官网描述的如何启动照片选择器,这样子看是不是一头雾水,到底是怎么实现的呢?别急,我们点击进入PickVisualMedia和PickMulipleVisualMedia去看看。
先来看看PickVisualMedia(选择单个)ActivityResultContracts.PickVisualMedia |Android 开发人员 (google.cn)
帮大家总结一下:
1.优先顺序:首先使用系统提供的 MediaStore.ACTION_PICK_IMAGES,如果不可用,OEM 可提供兼容性支持,最终在所有 Android API 19 或更高版本的设备上使用 Intent.ACTION_OPEN_DOCUMENT 作为备选方案。
2.输入和输出:输入是 PickVisualMediaRequest,输出是用户选择的媒体项的 Uri,如果没有选择,Uri 为 null。
3.只读返回:通过 Photo Picker 返回的 Uri 不能进行写操作。
4.扩展性:可以通过覆盖 createIntent() 方法传递额外的参数。
再来看看PickMulipleVisualMedia(选择多个)ActivityResultContracts.PickMultipleVisualMedia | Android Developers (google.cn)
帮大家总结一下:
1.优先顺序:首先使用系统提供的 MediaStore.ACTION_PICK_IMAGES,如果不可用,OEM 可以提供兼容性支持,使用 PickVisualMedia.ACTION_SYSTEM_FALLBACK_PICK_IMAGES,最终在所有 Android API 19 或更高版本的设备上使用 Intent.ACTION_OPEN_DOCUMENT 作为回退方案。
2.限制选择项数:构造函数接受 maxItems 参数,用于限制用户可选择的最大项数。启动活动时,maxItems 和输入的 PickVisualMediaRequest.maxItems 中的较小值将作为选择项数的限制。
3.输入和输出:输入是 PickVisualMediaRequest,输出是用户选择的媒体 Uri 列表。如果用户没有选择任何项,列表为空。返回的 Uri 是只读的。
4.扩展性:可以通过扩展来覆盖 createIntent() 方法,向通过 super.createIntent() 创建的 Intent 传递额外的参数。
4. 技术实现(源码贴在最后)
了解了基本的信息之后,我们来手把手的实现一下!!!
4.1 项目构建
首先要在AndroidStudio中新建一个项目,我的AndroidStudio版本是2024.1.2的,按照图中来就行。
项目结构如下,只需要新建