Android 拍照 引发 “SecurityException has no access to content://media/...“

Posted 匆忙拥挤repeat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 拍照 引发 “SecurityException has no access to content://media/...“相关的知识,希望对你有一定的参考价值。

现象:后台日志发现,只有在 android 10 (api 29) 以上的某些机型上才会引发异常。

原创建 拍照图片的 uri 代码:

/**
 * author:  stone
 * email:   aa86799@163.com
 */
 
val con = contentValuesOf()
val cacheName = "xxx.jpg"
con.put(MediaStore.Images.Media.DISPLAY_NAME, cacheName)
val rootFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
con.put(MediaStore.Images.Media.DATA, File(rootFile, cacheName).absolutePath)
con.put(MediaStore.Images.Media.MIME_TYPE, "image/JPEG")
val uri = requireActivity().contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, con)
...

Environment.getExternalStoragePublicDirectory() 这个在android 10 (api 29)已过时,建议使用 Content#getExternalFilesDir() 。

再结合 官方文档,使用 FileProvider,

/**
 * author:  stone
 * email:   aa86799@163.com
 */
 
val cacheName = "xxx"
val rootFile = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) 
    requireContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES)
 else 
    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
 ?: return
File.createTempFile(cacheName, ".jpg", rootFile).let 
	val uri = FileProvider.getUriForFile(requireContext(),  "FileProvider 的 Authority", it)
	...

以上是关于Android 拍照 引发 “SecurityException has no access to content://media/...“的主要内容,如果未能解决你的问题,请参考以下文章

Android 拍照 引发 “SecurityException has no access to content://media/...“

android 4.1.1开发时拍照问题:拍完照,保存后没无法返回,一直停在拍照界面,4.0不会出现此种情况

android固定位置拍照,Android调用系统相机拍照并保存到指定位置

调用 android 系统拍照结合 android-crop 裁剪图片

Android系统拍照源码

Android 开发 Camera类的拍照与录像