mediastore - SDK-29 上的 MediaScanner 和 ScopedStorage

标签 mediastore photo-gallery android-10.0 scoped-storage

我正在开发的应用程序使用文件作为照片捕获的目标。这是通过用户使用 Intent(ACTION_IMAGE_CAPTURE) 选择相机应用程序在外部执行的。自从将 build 和 target-sdk 升级到 29 以来,出现了一系列问题,首先是限制自由访问外部存储上的文件。第一个更改是使用应用程序的私有(private)缓存目录之一,例如:

File.createTempFile("tempImage", ".jpg", context.cacheDir)

或应用程序私有(private)外部存储目录:

File.createTempFile("tempImage", ".jpg", context.getExternalFilesDir(Environment.DIRECTORY_PICTURES))

结合file_paths.xml中的FileProvider访问,例如:

<paths>
    <external-path name="images" path="Pictures/" /><!-- prior to SDK-29, use public external storage -->
    <external-files-path name="externalImages" path="Pictures/" />
    <files-path name="internalImages" path="internalImages/"/>
    <cache-path name="cache" path="/" />
</paths>

在正确配置后,这些现在可以很好地工作,但是实现“保存到图库”功能,例如:在运行 Android-10 的设备上通知其他应用程序新图像不再有效

// use FileProvider to make this new photo publicly accessible 
val shareableUri = FileProvider.getUriForFile(context, FILE_PROVIDER_AUTHORITY, newImage)
context.sendBroadcast(
  Intent(ACTION_MEDIA_SCANNER_SCAN_FILE).apply { data = uris.externalUri }
)

无论原始图像保存在何处(private-app-dir、cache-dir、external-private),此方法应该有效,但实际上无效

MediaScannerConnection.scanFile(context, arrayOf(newImage.absolutePath), arrayOf("image/jpeg")) { path: String, uri: Uri? ->
  if (uri == null) {
    throw IllegalStateException("media scan failed...")
  } else {
    // successful
  }
}

Android SDK-29 中是否存在新的限制,需要对 MediaScanning 进行更改,特别是与扫描(可能的)私有(private)图像文件的方式相关的限制?我注意到 MediaScanner 方法大多需要 String 路径而不是 URI,因此这让我认为新的限制不会适用于它,因为它是一个系统组件.

最佳答案

默认情况下,面向 Android 10(API 级别 29)及更高版本的应用会获得对外部存储设备或范围存储的有限访问权限。

因此您需要使其与scopedStorage兼容,但您现在可以使用Google Android开发人员指南中提到的这种临时方法。

在您的应用与范围存储完全兼容之前,您可以根据应用的目标 SDK 级别或 requestLegacyExternalStorage list 属性暂时选择退出:

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
       Android 10 or higher. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

访问此链接了解更多信息: https://developer.android.com/training/data-storage/files/external-scoped

关于mediastore - SDK-29 上的 MediaScanner 和 ScopedStorage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57963282/

相关文章:

来自媒体商店的 Android 视频文件路径为空

android - 如何刷新 Android 上的 MediaStore?

ios - 将视频保存在图库中并存储视频的路径

安卓 Q : background activity starts

android - 如何直接将文件下载到Android Q(Android 10)的下载目录中

Android 10. 媒体商店。获取所有图像

android - MediaStore - 修改日期无法正常工作

iphone - UIScrollView 应用程序在设备中崩溃,但在模拟器中运行完美

php - 网站相册

crash - Javascript无限递归函数导致Android 10上的Chromium 50 ARM64 lib崩溃