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

Android拍照返回后Activity偶现重启问题寻求解决方案

相机拍照后Activity重建的解决方案

1. 提前指定相机输出文件路径

不要依赖相机返回的缩略图,提前在存储目录创建临时文件,启动相机时通过EXTRA_OUTPUT指定这个文件的URI。这样不管Activity是否重建,只要能拿到文件路径,就能直接读取图片。

示例代码(Kotlin):

private var currentPhotoPath: String? = null

// 创建临时图片文件
private fun createImageFile(): File {
    val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
    val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    return File.createTempFile(
        "JPEG_${timeStamp}_",
        ".jpg",
        storageDir
    ).apply {
        currentPhotoPath = absolutePath
    }
}

// 启动相机
private fun launchCamera() {
    Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePicIntent ->
        takePicIntent.resolveActivity(packageManager)?.also {
            val photoFile = try {
                createImageFile()
            } catch (e: IOException) {
                null
            }
            photoFile?.also {
                val photoUri = FileProvider.getUriForFile(
                    this,
                    "com.your.app.fileprovider", // 替换成你的FileProvider授权
                    it
                )
                takePicIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri)
                startActivityForResult(takePicIntent, REQUEST_CODE_CAMERA)
            }
        }
    }
}

2. 保存关键状态到SavedInstanceState

当Activity即将被系统重建时,把图片路径等核心数据存到onSaveInstanceState里,重建后在onCreate或onRestoreInstanceState中恢复,直接加载展示。

示例代码:

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    currentPhotoPath?.let {
        outState.putString("SAVED_PHOTO_PATH", it)
    }
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    
    savedInstanceState?.let {
        currentPhotoPath = it.getString("SAVED_PHOTO_PATH")
        currentPhotoPath?.run {
            loadImageToView(this)
        }
    }
}

// 加载图片到视图
private fun loadImageToView(path: String) {
    // 用Glide或者原生Bitmap方式加载,示例用Glide
    Glide.with(this)
        .load(File(path))
        .into(findViewById(R.id.image_view))
}

3. 忽略特定配置变化(可选)

如果重建是因为屏幕旋转、屏幕尺寸变化这类配置变更导致的,可以在AndroidManifest里给Activity添加configChanges属性,让系统不重建Activity,而是回调onConfigurationChanged,你自己处理UI调整。

示例配置:

<activity android:name=".CameraActivity"
    android:configChanges="orientation|screenSize|keyboardHidden">
</activity>

4. 放弃使用相机返回的缩略图

相机默认通过data返回的是低分辨率缩略图,不仅画质差,而且Activity重建后这个数据会丢失。一定要用EXTRA_OUTPUT指定输出文件的方式获取原图,数据更稳定。

内容的提问来源于stack exchange,提问作者bala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:05:21