如何在不使用已废弃的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
相关产品推荐
相关产品推荐

