• Android13适配-Google官方照片视频选择器


    官方照片选择器

    照片选择器对话框中会显示设备上的媒体文件。您可选择要与应用分享的照片。

    图 1. 照片选择器提供了一个直观的界面,便于与您的应用分享照片。

    照片选择器的界面可供浏览和搜索,并按日期降序向用户显示其媒体库中的文件。如隐私保护最佳实践 Codelab 中所示,照片选择器为用户提供了一种安全的内置授权方式,让用户可以仅向应用授予对所选图片和视频的访问权限,而不是对整个媒体库的访问权限。

    该工具会自动更新,让应用用户能够长期使用扩展的功能,而无需更改任何代码。

    使用 Jetpack activity 协定

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

    您可以使用以下 activity 结果协定来启动照片选择器:

    如果照片选择器在设备上不可用,该库会自动调用 ACTION_OPEN_DOCUMENT intent 操作。搭载 Android 4.4(API 级别 19)或更高版本的设备支持此 intent。您可以通过调用 isPhotoPickerAvailable() 来验证照片选择器在给定设备上是否可用。

    选择单个媒体项

    如需选择单个媒体项,请使用 PickVisualMedia activity 结果协定,如以下代码段所示:

    1. // Registers a photo picker activity launcher in single-select mode.
    2. ActivityResultLauncher pickMedia =
    3. registerForActivityResult(new PickVisualMedia(), uri -> {
    4. // Callback is invoked after the user selects a media item or closes the
    5. // photo picker.
    6. if (uri != null) {
    7. Log.d("PhotoPicker", "Selected URI: " + uri);
    8. } else {
    9. Log.d("PhotoPicker", "No media selected");
    10. }
    11. });
    12. // Include only one of the following calls to launch(), depending on the types
    13. // of media that you want to let the user choose from.
    14. // Launch the photo picker and let the user choose images and videos.
    15. pickMedia.launch(new PickVisualMediaRequest.Builder()
    16. .setMediaType(PickVisualMedia.ImageAndVideo.INSTANCE)
    17. .build());
    18. // Launch the photo picker and let the user choose only images.
    19. pickMedia.launch(new PickVisualMediaRequest.Builder()
    20. .setMediaType(PickVisualMedia.ImageOnly.INSTANCE)
    21. .build());
    22. // Launch the photo picker and let the user choose only videos.
    23. pickMedia.launch(new PickVisualMediaRequest.Builder()
    24. .setMediaType(PickVisualMedia.VideoOnly.INSTANCE)
    25. .build());
    26. // Launch the photo picker and let the user choose only images/videos of a
    27. // specific MIME type, such as GIFs.
    28. String mimeType = "image/gif";
    29. pickMedia.launch(new PickVisualMediaRequest.Builder()
    30. .setMediaType(new PickVisualMedia.SingleMimeType(mimeType))
    31. .build());

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

    选择多个媒体项

    如需选择多个媒体项,请设置可选媒体文件数量上限,如以下代码段所示。

    1. // Registers a photo picker activity launcher in multi-select mode.
    2. // In this example, the app lets the user select up to 5 media files.
    3. ActivityResultLauncher pickMultipleMedia =
    4. registerForActivityResult(new PickMultipleVisualMedia(5), uris -> {
    5. // Callback is invoked after the user selects media items or closes the
    6. // photo picker.
    7. if (!uris.isEmpty()) {
    8. Log.d("PhotoPicker", "Number of items selected: " + uris.size());
    9. } else {
    10. Log.d("PhotoPicker", "No media selected");
    11. }
    12. });
    13. // For this example, launch the photo picker and let the user choose images
    14. // and videos. If you want the user to select a specific type of media file,
    15. // use the overloaded versions of launch(), as shown in the section about how
    16. // to select a single media item.
    17. pickMultipleMedia.launch(new PickVisualMediaRequest.Builder()
    18. .setMediaType(PickVisualMedia.ImageAndVideo.INSTANCE)
    19. .build());

    平台会限制您可以让用户在照片选择器中选择的文件数量上限。如需访问此限制,请调用 getPickImagesMaxLimit()。 在不支持照片选择器的设备上,系统会忽略此上限。

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

    适用的设备

    照片选择器适用于符合以下条件的设备:

    搭载 Android 4.4(API 级别 19)到 Android 10(API 级别 29)的旧款设备,以及搭载 Android 11 或 12 且支持 Google Play 服务的 Android Go 设备,都可以安装向后移植的照片选择器版本。如需通过 Google Play 服务自动安装向后移植的照片选择器模块,请将以下条目添加到应用清单文件的  标记中:

    1. "com.google.android.gms.metadata.ModuleDependencies"
    2. android:enabled="false"
    3. android:exported="false"
    4. tools:ignore="MissingClass">
    5. "com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
    6. "photopicker_activity:0:required" android:value="" />

    保留媒体文件访问权限

    默认情况下,系统会授予应用对媒体文件的访问权限,直到设备重启或应用停止运行。如果您的应用执行长时间运行的工作(例如在后台上传大型文件),您可能需要将此访问权限保留更长时间。为此,请调用 takePersistableUriPermission() 方法:

    1. int flag = Intent.FLAG_GRANT_READ_URI_PERMISSION;
    2. context.contentResolver.takePersistableUriPermission(uri, flag);

  • 相关阅读:
    2023年天津中德应用技术大学专升本物流管理专业考试大纲
    四位十进制频率计VHDL,DE1开发板验证,仿真和源码
    2022中国DevOps社区峰会 走进国产数据库的技术创新实践
    Wincc报表教程(SQL数据库的建立,wincc在数据库中保存和查询数据,调用Excel模板把数据保存到指定的位置和打印功能)
    XDOJ-267 判断栈输出顺序正确与否
    【UNR #6 D】小火车(折半搜索)(二分)
    JVM基本概念、命令、参数、GC日志总结
    程序员常用的工具,有前后端开发经常用到的
    L1-058 6翻了
    Untiy 使用RotateAround()方法实现物体围绕某个点或者某个物体旋转
  • 原文地址:https://blog.csdn.net/yzwfeng/article/details/132860880