Android官方推荐 无需向应用授予的照片选择器工具

2023-09-14 09:41:42

官网链接 Photo picker  |  Android Developers

不能跳转链接看这

Photo picker

照片选择器对话框会显示在您的设备上的媒体文件中。选择一张照片与应用程序分享。 图1. 照片选择器提供了一个直观的用户界面,用于与您的应用程序分享照片。 照片选择器提供了一个可浏览、可搜索的界面,向用户呈现了他们的媒体库,按日期从新到旧排序。如隐私最佳实践代码实验所示,照片选择器提供了一种安全的、内置的方式,用户可以通过它授予您的应用程序仅对所选图像和视频的访问权限,而不是他们的整个媒体库。

该工具会自动更新,随着时间的推移,为您的应用程序的用户提供了扩展功能,而无需进行任何代码更改。

Use Jetpack Activity contracts

为了简化照片选择器的集成,包括 androidx.activity 库的 1.7.0 版或更高版本。

使用以下活动结果合同来启动照片选择器:

PickVisualMedia 以选择单个图像或视频。

PickMultipleVisualMedia 以选择多个图像或视频。 如果设备上没有照片选择器,则库会自动调用 ACTION_OPEN_DOCUMENT 意图操作。

此意图在运行 Android 4.4(API 级别 19)或更高版本的设备上受支持。您可以通过调用 isPhotoPickerAvailable() 来验证在给定设备上是否可用照片选择器。

选择单个媒体项目 要选择单个媒体项目,请使用 PickVisualMedia 活动结果合同,如下面的代码片段所示:

// 在单选模式下注册照片选择器活动启动器。
val pickMedia = registerForActivityResult(PickVisualMedia()) { uri ->
    //在用户选择媒体项目或关闭照片选择器后调用回调。
    if (uri != null) {
        Log.d("PhotoPicker", "Selected URI: $uri")
    } else {
        Log.d("PhotoPicker", "No media selected")
    }
}

// 只包括以下其中一个调用来启动(),具体取决于您希望让用户选择的媒体类型。
// 启动照片选择器,让用户选择图像和视频。
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))

//启动照片选择器,让用户仅选择图像。
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly))

//启动照片选择器,让用户仅选择视频。
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.VideoOnly))

//启动照片选择器,让用户仅选择特定 MIME 类型的图像/视频,例如 GIF。
val mimeType = "image/gif"
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.SingleMimeType(mimeType)))

注意:在使用 PickVisualMedia 时,照片选择器会以半屏模式打开。

选择多个媒体项目 要选择多个媒体项目,请设置最大可选择媒体文件的数量,如下面的代码片段所示。

// 在多选模式下注册照片选择器活动启动器。
// 在此示例中,应用程序允许用户选择最多 5 个媒体文件。
val pickMultipleMedia =
        registerForActivityResult(PickMultipleVisualMedia(5)) { uris ->
  // 在用户选择媒体项目或关闭照片选择器后调用回调。
    if (uris.isNotEmpty()) {
        Log.d("PhotoPicker", "Number of items selected: ${uris.size}")
    } else {
        Log.d("PhotoPicker", "No media selected")
    }
}

// 对于此示例,启动照片选择器,让用户选择图像和视频。如果您希望用户选择特定类型的媒体文件,
// 使用 launch() 的重载版本,如有关如何选择单个媒体项目的部分所示。
pickMultipleMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))

平台限制了您可以要求用户在照片选择器中选择的文件的最大数量。要访问此限制,

请调用 getPickImagesMaxLimit()。在不支持照片选择器的设备上,将忽略此限制。

注意:如果照片选择器不可用,并且支持库调用 ACTION_OPEN_DOCUMENT 意图操作,则系统会忽略指定的最大可选择媒体文件数量。

Device availability

照片选择器可用于满足以下条件的设备:

运行 Android 11(API 级别 30)或更高版本 通过 Google 系统更新接收对模块化系统组件的更改 运行 Android 4.4(API 级别 19)到 Android 10(API 级别 29)之间的旧设备

以及运行 Android 11 或 12 的支持 Google Play 服务的 Android Go 设备可以安装照片选择器的后移版本。

要通过 Google Play 服务启用后移的照片选择器模块的自动安装,

请在应用程序清单文件的 <application> 标签中添加以下条目:

<!-- 触发 Google Play 服务安装后移的照片选择器模块. -->
<service android:name="com.google.android.gms.metadata.ModuleDependencies"
         android:enabled="false"
         android:exported="false"
         tools:ignore="MissingClass">
    <intent-filter>
        <action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
    </intent-filter>
    <meta-data android:name="photopicker_activity:0:required" android:value="" />
</service>

Persist media file access

默认情况下,系统会授予您的应用程序对媒体文件的访问权限,直到设备重新启动或您的应用程序停止。

如果您的应用程序执行长时间运行的工作,例如在后台上传大文件,您可能需要将此访问权限持续保持更长的时间。

为此,请调用 takePersistableUriPermission() 方法:

val flag = Intent.FLAG_GRANT_READ_URI_PERMISSION
context.contentResolver.takePersistableUriPermission(uri, flag)

这段代码将帮助您确保您的应用程序能够在需要时持续访问所选媒体文件。

更多推荐

【含java面试题】深入解析栈溢出及JVM参数设置

AI绘画关于SD,MJ,GPT,SDXL百科全书面试题分享点我直达2023Python面试题2023最新面试合集链接2023大厂面试题PDF面试题PDF版本java、python面试题项目实战:AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、A

SQL性能优化

当你的数据里只有几千几万,那么SQL优化并不会发挥太大价值,但当你的数据里去到了几百上千万,SQL优化的价值就体现出来了!因此稍微有些经验的同学都知道,怎么让MySQL查询语句又快又好是一件很重要的事情。要让SQL又快又好的前提是,我们知道它「病」在哪里,而explain关键字就是MySQL提供给我们的一把武器!在我们

需要每日温习的java八股文基础

一、java(1)集合1.list:LinkedList、ArrayList和VectorArrayList、LinkedList和Vector的区别,场景和扩容机制源码LinkedList接口实现类,链表,插入删除,没有同步,线程不安全ArrayList接口实现类,数组,随机访问,没有同步,线程不安全Vector接口

SpringBoot_快速入门

一、SpringBoot概述文档下载地址:https://docs.spring.io/spring-boot/docs/current/reference/1.SpringBoot介绍概述:SpringBoot开发团队认为Spring操作太繁琐了,目的在于简化开发配置,能够快速搭建开发环境,集成了tomcat,对于开

如何使用反 CSRF 令牌保护您的网站和 Web 应用程序

防止跨站点请求伪造攻击(CSRF/XSRF)的最常见方法是使用反CSRF令牌,该令牌只是一个唯一值集,然后由Web应用程序需要。CSRF是一种客户端攻击,可用于将用户重定向到恶意网站、窃取敏感信息或在用户会话中执行其他操作。幸运的是,使用CSRF令牌来保护用户免受CSRF攻击及其后果相对容易。CSRF原理那我们具体看看

前端工程师笔试题【校招】

1.设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度为()。如果要在一个有序的单链表中插入一个新节点,以保持单链表的有序性,时间复杂度取决于插入的位置。以下是几种常见的情况:在链表的头部插入新节点:如果要在链表的头部插入一个新节点,只需要将新节点的指针指向当前链表的头节

3、ARM寄存器组织

ARM寄存器组织1、寄存器概念寄存器是处理器内部的存储器,没有地址作用一般用于暂时存放参与运算的数据和运算的结果分类包括通用寄存器、专用寄存器、控制寄存器2、ARM寄存器注:在某个特定的模式下,只能使用当前模式下的寄存器。一个模式下的特有寄存器在其他模式下不可以使用专用寄存器R15(PC,ProgramCounter)

Vue Grid Layout -️ 适用Vue.js的栅格布局系统,在vue3+上使用

文章目录1、官网简介2、在vue3中使用1)、需要导入vue3支持的版本插件2)、在mian.js里引入:3)、在组件中使用3、layout布局的计算逻辑4、gridLayout的属性该栅格系统目前对vue2的支持是最好的,vue3是需要用插件支持的,会在小节详细讲解。1、官网简介官网地址:https://madewi

python Sqlalchemy

简介SQLAlchemy是python中,通过ORM操作数据库的框架。它简化了应用程序开发人员在原生SQL上的操作,使开发人员将主要精力都放在程序逻辑上,从而提高开发效率。它提供了一整套著名的企业级持久性模式,设计用于高效和高性能的数据库访问。安装pipinstallSQLAlchemy连接数据(engine)任何SQ

Java性能调优工具“JRMC”的介绍

Java虚拟机(JVM)及垃圾收集器(GC)负责管理大多数的内存任务,但是Java应用系统中还是有可能出现内存泄漏。事实上,OOM之类的现象在大型项目中也是一个常见的问题。避免内存泄漏的第一步是要弄清楚它是如何发生的,然后对症下药。那究竟是什么导致了Java程序中的内存泄漏呢?难道Java虚拟机的垃圾收集器不应该管理未

开源日报 0824 | 构建UI组件和页面的前端工作坊

Storybook是一个用于构建UI组件和页面的前端工作坊,支持多种主流框架,提供丰富的插件,具有可配置性强和扩展性好的特点。storybookjs/storybookStars:79.9kLicense:MITStorybook是一个用于构建UI组件和页面的前端工作坊,可以独立地进行开发、测试和文档编写。它支持多种主

热文推荐