作者:无敌何尝不可
转载地址:https://juejin.cn/post/7091483880342945829
照片选择器
Android 13 包含对新照片选择器工具的支持。此工具为用户提供了一种安全的内置媒体文件选择方式,让其无需向应用授予对整个媒体库的访问权限。
注意:即将发布的 Google Play 系统更新预计会包含与照片选择器有关的新功能。在一项此类更新中,该库将增加对以 Android 11(API 级别 30)或更高版本为目标平台的应用(不包括 Android Go 设备)的支持。
特别注意:对于国内手机而言,没有Google Play系统更新是不是就不能使用这个功能?待验证。
图 1. 照片选择器提供了一个直观的界面,便于与您的应用分享照片。
选择媒体
照片选择器提供了一个可浏览、可搜索的界面,其中按日期(从最近到最早)顺序向用户呈现其媒体库中的文件。您可以指定用户只能看到照片或只能看到视频,并且默认情况下,允许的媒体选择量上限设置为 1。
定义分享限制
应用可以声明 android.provider.extra.PICK_IMAGES_MAX
的值,该值表示在向用户显示时照片选择器中显示的媒体文件数量上限。例如,如果您提示用户为其帐号选择要求的个人资料照片,请将一张照片设置为分享要求上限。
注意:如果您选择的上限为 1 张,照片选择器会以半屏模式打开。
如需在单选模式下启动照片选择器,请执行以下操作:
// Launches photo picker in single-select mode.
// This means that the user can select one photo or video.
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE)
选择多张照片或多个视频
如果应用的用例需要用户选择多张照片或多个视频,您可以使用 EXTRA_PICK_IMAGES_MAX
extra 指定照片选择器中应显示照片的数量上限,如以下代码段中所示:
// Launches photo picker in multi-select mode.
// This means that user can select multiple photos/videos, up to the limit
// specified by the app in the extra (10 in this example).
val maxNumPhotosAndVideos = 10
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos)
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE)
请注意,可指定为文件数量上限的最大数字存在平台限制。如需访问此限制,请调用 MediaStore#getPickImagesMaxLimit()
。
处理照片选择器结果
照片选择器启动后,使用新的 ACTION_PICK_IMAGES
intent 来处理结果。该选择器会返回一组 URI:
// Photo Pick会回调onActivityResult() .
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != Activity.RESULT_OK) {
// 处理错误
return
}
when (requestCode) {
REQUEST_PHOTO_PICKER_SINGLE_SELECT -> {
//单选模式得到图片.
val currentUri: Uri = data.data
// 在这里处理photo/video URI。返回的应该是provider的路径,需要转成file
return
}
REQUEST_PHOTO_PICKER_MULTI_SELECT -> {
// 多选模式得到图片.
var i = 0
data.clipData!!.itemCount
for(i until data.clipData!!.itemCount){
var uri:Uri=data.clipData!!.getItemAt(i).uri;
// 在这里处理每一个photo/video URI。返回的应该是provider的路径,需要转成file
}
return;
}
默认情况下,照片选择器会既显示照片又显示视频。您还可以在 setType() 方法中设置 MIME 类型,以便按“仅显示照片”或“仅显示视频”进行过滤。例如,如需在照片选择器中仅显示视频,请将 video/*
传入 setType()
:
// 启动单选videos模式的photo picker.
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.type = "video/*"
startActivityForResult(intent, PHOTO_PICKER_VIDEO_SINGLE_SELECT_REQUEST_CODE)
//应用可以通过改变mimeType来让用户控制选择模式
// images only - intent.type = "images/*"
注意:您的应用不能持续访问从此 intent 返回的 URI。当应用的进程结束后,该应用将无法访问 URI。
网友评论