我正在开发的应用程序使用文件
作为照片捕获的目标。这是通过用户使用 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/