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

如何将Camera Activity返回的Uri从Bottom Sheet传递至Customer Details Activity

解决方案

核心问题是:你在BottomSheet中调用startActivityForResult,结果会优先返回给BottomSheet的onActivityResult,而非直接回到宿主的Customer Details Activity。即使BottomSheet被关闭,只要它还未被销毁,依然能接收到返回结果,我们只需要通过回调把结果传递给宿主即可。

方法一:接口回调(适配传统API)

1. 修改BottomSheet类,添加回调接口

public class BottomSheet extends BottomSheetDialogFragment {
    // 新增回调接口,用于传递拍照结果
    public interface OnMediaResultListener {
        void onPhotoTaken(Uri imageUri);
    }

    private OnMediaResultListener mListener;
    int layout;
    boolean isNew;
    MaterialTextView takePhoto, uploadPhoto, delete_cancelPhoto;
    static final int PICK_IMAGE = 1;

    // 绑定宿主Activity为回调接收者
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            mListener = (OnMediaResultListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " 必须实现OnMediaResultListener接口");
        }
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(layout, container, false);
        takePhoto = view.findViewById(R.id.bottom_sheet_take_photo);
        uploadPhoto = view.findViewById(R.id.bottom_sheet_upload_photo);
        delete_cancelPhoto = view.findViewById(R.id.bottom_sheet_delete_photo);

        if(isNew) delete_cancelPhoto.setText(R.string.cancel);

        takePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(getContext(), CameraActivity.class);
                startActivityForResult(i, 100);
                getDialog().dismiss();
            }
        });

        // 上传、删除/取消按钮逻辑保持不变

        return view;
    }

    // 重写onActivityResult接收Camera返回的结果
    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 100 && resultCode == Activity.RESULT_OK && data != null) {
            Uri imageUri = data.getData();
            if (mListener != null) {
                // 通过回调将Uri传递给宿主Activity
                mListener.onPhotoTaken(imageUri);
            }
        }
    }

    public void setLayout(int layout, boolean isNew) {
        this.layout = layout;
        this.isNew = isNew;
    }
}

2. 修改Customer Details Activity实现回调接口

public class CustomerDetailsActivity extends AppCompatActivity implements BottomSheet.OnMediaResultListener {
    // 原有初始化、点击事件逻辑保持不变

    // 实现回调方法,处理返回的Uri设置头像
    @Override
    public void onPhotoTaken(Uri imageUri) {
        Toast.makeText(this, imageUri.toString(), Toast.LENGTH_SHORT).show();
        Glide.with(this)
             .load(imageUri)
             .into(binding.customerDetailsCustomerDp);
    }

    // 可删除原有的onActivityResult方法,结果已通过回调传递
}

方法二:使用Jetpack Activity Result API(推荐,替代废弃API)

如果你的项目已接入Jetpack组件,推荐使用registerForActivityResult替代已废弃的startActivityForResult:

1. 修改BottomSheet类

public class BottomSheet extends BottomSheetDialogFragment {
    public interface OnMediaResultListener {
        void onPhotoTaken(Uri imageUri);
    }

    private OnMediaResultListener mListener;
    int layout;
    boolean isNew;
    MaterialTextView takePhoto, uploadPhoto, delete_cancelPhoto;
    // 定义相机启动器
    private ActivityResultLauncher<Intent> cameraLauncher;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 注册Activity结果回调
        cameraLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
                        Uri imageUri = result.getData().getData();
                        if (mListener != null) {
                            mListener.onPhotoTaken(imageUri);
                        }
                    }
                }
        );
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            mListener = (OnMediaResultListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " 必须实现OnMediaResultListener接口");
        }
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(layout, container, false);
        takePhoto = view.findViewById(R.id.bottom_sheet_take_photo);
        // 其他控件初始化逻辑不变

        takePhoto.setOnClickListener(v -> {
            Intent i = new Intent(getContext(), CameraActivity.class);
            cameraLauncher.launch(i);
            getDialog().dismiss();
        });

        // 上传、删除/取消按钮逻辑保持不变

        return view;
    }

    public void setLayout(int layout, boolean isNew) {
        this.layout = layout;
        this.isNew = isNew;
    }
}

2. Customer Details Activity修改同方法一,实现OnMediaResultListener接口即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:06:29