Android 11及以上版本拍照后图片未在活动中显示的问题求助
Android 11+ 相机拍照后图片不显示的修复方案
核心问题定位
你的代码存在两个关键错误:一是传给FileProvider.getUriForFile()的是目录而非具体文件,相机无法正确写入图片;二是提前调用了refresh(),此时图片尚未生成。结合Android 11+的存储权限变更,以下是分步修复方案:
1. 修正相机启动逻辑,传入具体文件而非目录
相机需要明确的文件路径来保存照片,不能传入目录。修改openCameraApp()方法:
private fun openCameraApp() { // 创建应用私有图片目录(无需额外权限) val appFolder = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "MyCameraPhotos") if (!appFolder.exists()) { appFolder.mkdirs() } // 创建具体的照片文件 val photoFile = File(appFolder, "pic_${System.currentTimeMillis()}.jpg") val photoURI: Uri = FileProvider.getUriForFile( this, "com.example.android.fileprovider", photoFile ) val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI) // 授予相机临时写入权限 cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) println("::Camera result:: ${photoURI}") resultLauncher.launch(cameraIntent) }
2. 完善拍照结果回调,刷新媒体库并加载图片
在resultLauncher的回调中处理拍照成功后的逻辑,主动通知媒体库更新并执行图片刷新:
private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { // 通知媒体库扫描新图片,确保系统能识别到 val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE) mediaScanIntent.data = photoURI // 需将photoURI设为类成员变量,或暂存文件路径回调时重新生成 sendBroadcast(mediaScanIntent) // 执行图片显示逻辑 refresh() } }
3. 检查FileProvider配置正确性
确保AndroidManifest.xml中的FileProvider注册无误:
<provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.android.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider>
同时在res/xml/file_paths.xml中配置对应目录(无该文件则创建):
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 对应外部存储私有图片目录 --> <external-files-path name="camera_photos" path="MyCameraPhotos/"/> </paths>
4. 权限相关注意事项
- Android 11+ 访问应用私有外部存储(
getExternalFilesDir())无需申请READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限,避免不必要的权限申请。 - 不要使用公共存储目录,否则需要申请
MANAGE_EXTERNAL_STORAGE权限,会导致应用上架Play Store受限。
内容的提问来源于stack exchange,提问作者Wangu Ngalati
相关产品推荐
相关产品推荐

