registerForActivityResult 用法详解及适配 Android 10、11

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

自源码已废弃了 startActivityForResult 之后,如果想要启动一个 Activity 并获取返回结果,推荐使用 registerForActivityResult ,方法定义如下:

public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
        @NonNull ActivityResultContract<I, O> contract,
        @NonNull ActivityResultCallback<O> callback) {
   
   
    
}

其中 IInput 指代输入,OOutput 指代输出。
输入的是 约定协议,输出的是 返回结果
官网文档:获取 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)
        // 创建新的图片名称
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值