使用 MediaStore API 从图库读取图片所需的权限

问题描述 投票:0回答:1

考虑实现一个应用程序,让用户从图库中选择用相机拍摄的图像,然后在应用程序上使用这些照片。

项目设置是

targetSdk=34, compileSdk=34, minSdk=22

使用MediaStore API,可以启动选择器

startActivityForResult(Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) ,1);

然后在onActivityResult()中获取图片

override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
    super.onActivityResult(requestCode, resultCode, intent)
    val uri = intent!!.data!!
    val inputStream = contentResolver.openInputStream(uri)!!
    val bitmapBytes = inputStream.readBytes()
    val bitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.size)
}

问题1: 生成Bitmap需要什么权限?阅读specs似乎需要READ_EXTERNAL_STORAGE。但该代码在 SDK 34-24 中无需任何许可即可运行,并且开始只需要 READ_EXTERNAL_STORAGE <= SDK 23.

问题2: 为什么 >= SDK 33 不需要 READ_MEDIA_IMAGES?正如另一个规范中所述,实现需要该权限才能读取在 SDK 33 及以上版本上生成的其他应用程序生成的图像。

问题3: 使用 PhotoPicker API(而不是 MediaStore)有什么优势?

android mediastore android-photo-picker
1个回答
0
投票

也许您的代码可能无需显式请求某些权限或使用

READ_MEDIA_IMAGES
权限即可工作,遵守最新的 Android 指南并在需要时请求权限始终是一个好习惯。此外,请考虑使用 PhotoPicker 等更高级别的 API,以获得更强大和更强大的功能。用户友好的图像选择体验

解决您的每个问题:

回答1.位图制作的权限:理论上你是对的,从外部存储读取图像需要

READ_EXTERNAL_STORAGE
权限但是,Android的权限系统在Android 6.0(SDK 23)之前的不同SDK版本中不断发展,权限是在安装时而不是在运行时请求的。因此,针对 SDK 22 及以下版本的应用程序会自动获得对清单中声明的所有权限的访问权限。从 SDK 23 开始,Android 引入了运行时权限,其中应用程序需要显式向用户请求权限才能访问某些权限资源因为您的目标 SDK 34 和
READ_EXTERNAL_STORAGE
被认为是危险的权限,所以应该在运行时请求它,但由于上述行为,似乎没有它也可以工作

答案 2. 需要 READ_MEDIA_IMAGES 权限:Android 12 (SDK 33) 中引入的 MediaStore API 的

READ_MEDIA_IMAGES
权限部分此权限允许您的应用访问其他应用创建的媒体文件如果您的目标是 SDK 33 或更高版本,您可能不需要此权限,因为对通过范围存储管理的媒体文件的访问会限制应用程序对其他应用程序创建的媒体文件的访问,除非明确授予,
READ_MEDIA_IMAGES
权限在这种情况下可能是多余的

答案 3. PhotoPicker API 的优点:

PhotoPicker
API 为跨不同设备和 Android 版本选择照片提供了更加人性化和一致的体验 它抽象了直接处理
MediaStore
API 的复杂性,提供了标准化的方式访问和选择图像 此外,它可能提供图像裁剪、过滤或其他可以改善用户体验的增强功能等功能。但是,请记住,
PhotoPicker
API 可能有自己的一组权限和行为,您需要在以下情况下考虑这些功能:实施它

图像选择器的工作原理:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.