自源码已废弃了 startActivityForResult 之后,如果想要启动一个 Activity 并获取返回结果,推荐使用 registerForActivityResult ,方法定义如下:
public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
@NonNull ActivityResultContract<I, O> contract,
@NonNull ActivityResultCallback<O> callback) {
}
其中 I 即 Input 指代输入,O 即 Output 指代输出。
输入的是 约定协议,输出的是 返回结果。
官网文档:获取 activity 的结果
在实际开发过程中,我们只要指定我们需要的 输入 和 输出 类型,然后在 callback 处理返回值就可以了。
下面以 Android 常用的 选择图片,选择图片并剪裁,拍照,拍照并剪裁 作为例子来体验下 registerForActivityResult 的用法:
效果图:


一、选择图片并剪裁
1. 定义输入输出的协议 SelectPhotoContract 和 CropPhotoContract
/**
* 选择照片的协定
* Input type : Unit? 不需要传值
* Output type : Uri? 选择完成后的 image uri
*/
class SelectPhotoContract : ActivityResultContract<Unit?, Uri?>() {
@CallSuper
override fun createIntent(context: Context, input: Unit?): Intent {
return Intent(Intent.ACTION_PICK).setType("image/*")
}
override fun parseResult(resultCode: Int, intent: Intent?): Uri? {
"pick photo result: ${
intent?.data}".logD()
return intent?.data
}
}
/**
* 剪裁照片的协定
* Input type : CropParams 剪裁照片的相关参数
* Output type : Uri? 照片剪裁完成后的uri
*/
class CropPhotoContract : ActivityResultContract<CropParams, Uri?>() {
private var outputUri: Uri? = null
@CallSuper
override fun createIntent(context: Context, input: CropParams): Intent {
// 获取输入图片uri的媒体类型
val mimeType = context.contentResolver.getType(input.uri)
// 创建新的图片名称

本文详细介绍了在Android中由于startActivityForResult被弃用,如何使用registerForActivityResult进行活动结果的获取。通过定义自定义的ActivityResultContract,如SelectPhotoContract和CropPhotoContract,实现了选择图片和拍照并剪裁的功能。示例代码展示了如何在回调中处理返回的Uri,以展示所选或拍摄的照片。
最低0.47元/天 解锁文章
2314

被折叠的 条评论
为什么被折叠?



