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

三星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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:18:20