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
相关产品推荐
相关产品推荐

