在针对 Android 33 并在 Android 33 上运行时启动相机意图时遇到问题。
我正在使用文件提供程序来创建文件并将其传递到相机
清单:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
文件路径:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<cache-path name="attachments" path="attachments/"/>
<cache-path name="geopackage" path="geopackage/"/>
<external-files-path name="pictures" path="Pictures"/>
<external-files-path name="videos" path="Movies"/>
<external-files-path name="audio" path="Music"/>
</paths>
权限请求
private val requestImagePermission = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { result ->
this.onPermission(result)
}
图片请求
private val getImage = registerForActivityResult(
ActivityResultContracts.TakePicture()
) { status ->
onMediaResult(status)
}
启动相机意图
private fun launchCameraIntent() {
val file = File.createTempFile(
UUID.randomUUID().toString(),
".jpg",
getExternalFilesDir(Environment.DIRECTORY_PICTURES)
)
val uri = FileProvider.getUriForFile(applicationContext, applicationContext.packageName + ".fileprovider", file)
currentMediaPath = file.absolutePath
getImage.launch(uri)
}
系统会提示我获取相机许可并接受。然而,在启动相机后,我得到:
需要许可。要使用相机,请打开相机、麦克风,然后 存储权限。
使用旧的权限 API,当仅请求相机权限和存储权限时,效果很好。然而,我的印象是,存储在 getExternalFilesDir 中不需要请求存储权限。
有什么想法吗?
但是我的印象是,存储在 getExternalFilesDir 中不需要请求存储权限。
正确。但是,该对话框不是来自平台,而是来自特定的相机应用程序。他们可能没有考虑到
ACTION_IMAGE_CAPTURE
/ ActivityResultContracts.TakePicture
场景,其中调用者有责任提供可写的位置。