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

发布时间 2023-09-12 11:32:56作者: 勤奋的小铁

官网链接 https://developer.android.google.cn/training/data-storage/shared/photopicker?hl=en

不能跳转链接看这

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)

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