You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:50:36