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

如何在不使用已废弃的startActivityForResult()下拍照并设置为ImageButton?

替换 startActivityForResult 为 ActivityResultLauncher 的实现方案

核心实现步骤

  • 定义 ActivityResultLauncher<Void>,使用 ActivityResultContracts.TakePicturePreview 合约(该合约直接返回拍照得到的缩略图Bitmap,和你原来通过data.getExtras().get("data")获取的内容一致)
  • 在Activity/Fragment的onCreate方法中完成Launcher的注册
  • 触发拍照时直接调用Launcher的launch()方法

完整代码示例

// 定义全局的ActivityResultLauncher
private ActivityResultLauncher<Void> takePictureLauncher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);

    // 注册Launcher
    takePictureLauncher = registerForActivityResult(
        new ActivityResultContracts.TakePicturePreview(),
        bitmap -> {
            // 拍照成功且返回Bitmap时更新ImageView
            if (bitmap != null) {
                ibPic.setImageBitmap(bitmap);
            }
        }
    );

    // 假设这里是触发拍照的按钮点击事件
    yourTakePhotoButton.setOnClickListener(v -> {
        // 启动拍照
        takePictureLauncher.launch(null);
    });
}

说明

  • 无需再重写onActivityResult方法,所有结果处理逻辑都在Launcher的回调中完成
  • TakePicturePreview合约已帮你处理了Intent(MediaStore.ACTION_IMAGE_CAPTURE)的创建和结果解析,不用手动构建Intent
  • 如果需要保存全尺寸照片,可以改用ActivityResultContracts.TakePicture合约,需要传入一个保存照片的Uri

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:44:52