三星A14 5G(Android 14)调用相机后Fragment/Activity意外触发onDestroy
问题解决:三星A14 5G(Android14)调用相机后Fragment/Activity意外触发onDestroy
核心原因
你遇到的问题是因为Android 12及以上系统新增了部分配置变更类型,当前配置的configChanges未覆盖这些参数,导致三星相机应用启动时触发了额外的配置变更,进而触发Activity/Fragment销毁重建。
默认的orientation|keyboardHidden|screenSize在Android 12+已经不足以阻止所有可能的重建场景,三星定制的相机应用可能会触发screenLayout或smallestScreenSize这类配置变化。
解决方案
1. 补充Manifest的configChanges参数
更新对应Activity的Manifest配置,添加screenLayout和smallestScreenSize,覆盖更多可能触发重建的系统配置变更:
<activity android:name=".YourHostActivity" android:configChanges="orientation|keyboardHidden|screenSize|screenLayout|smallestScreenSize" ...> </activity>
2. 替换已废弃的startActivityForResult API
startActivityForResult在AndroidX中已被标记为废弃,建议使用ActivityResultContracts.TakePicture替代,避免旧API的兼容问题:
步骤1:在Fragment中注册ActivityResultLauncher
private ActivityResultLauncher<Uri> takePictureLauncher; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 注册拍照回调 takePictureLauncher = registerForActivityResult(new ActivityResultContracts.TakePicture(), result -> { if (result) { // 拍照成功,处理图片文件 Log.d(TAG, "拍照成功"); } else { // 拍照失败或取消 Log.d(TAG, "拍照取消或失败"); } }); }
步骤2:修改openCamera方法,使用新API启动相机
public static File openCamera(Context mContext, Fragment currentFragment) { if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "opening camera"); String imageName = dateToString(new Date(), PhotoConstant.IMAGE_NAME_FORMAT); File filePath = new File(mContext.getExternalFilesDir(""), PhotoConstant.IMAGE_DIR); if (!filePath.exists()) { Log.e(TAG, "folder not exist, going to create new folder"); filePath.mkdirs(); // 用mkdirs()支持多级目录创建 } File destinationFile = new File( mContext.getExternalFilesDir(""), imageName + PhotoConstant.IMAGE_FORMAT); Uri imageUri = AppUtil.getFileUri(mContext, destinationFile); // 用新Launcher启动相机 currentFragment.takePictureLauncher.launch(imageUri); Log.d(TAG, "name of image to be capture " + imageName); return destinationFile; } else { Toast.makeText(mContext, "Please Grant Camera Permission in Setting!", Toast.LENGTH_SHORT).show(); return null; } }
3. 额外检查点
- 确认Activity未设置特殊
launchMode(如singleInstance),这类模式可能导致栈行为异常触发销毁。 - 校验
FileProvider配置是否正确(Manifest声明、xml路径配置),避免影响拍照结果返回。
内容的提问来源于stack exchange,提问作者Mansi Salvi
相关产品推荐
相关产品推荐

