onActivityResult遭弃用?来康康registerForActivityResult结果回调的最新用法

在Activity中onActivityResult是我们普遍使用的结果回传回调方法,而在最新的appcompat1.3.0-alpha02包中,这一方法被标记了

@Deprecated 被废弃,并且建议使用registerForActivityResult方法来注册回调。此方法简化数据回调的写法,并且提供了多种用途。

registerForActivityResult常规用法:

registerForActivityResult(
            ActivityResultContracts.StartActivityForResult()
        ) { result ->
            val data = result.data
            val resultCode= result.resultCode
            val extra = data?.getStringExtra("extra")
        }.launch(Intent(this, MainActivity::class.java))

除了基本用法,ActivityResultContracts还提供了一些ActivityResultContract的实现类,以便进行其他的操作:

RequestMultiplePermissions : 多个权限请求

RequestPermission : 单个权限请求

TakePicturePreview : 拍照预览

TakePicture : 拍照

TakeVideo : 摄像

PickContact : 选择联系人

GetContent : 获取各种文件的Uri

GetMultipleContents : 获取多个各种文件的Uri

OpenDocument : 打开文件

OpenMultipleDocuments : 打开多个文件

OpenDocumentTree : 打开文件夹

CreateDocument : 创建文件

例如,打开相机拍照:

registerForActivityResult(ActivityResultContracts.TakePicturePreview()){
           // 返回拍摄的bitmap
        }.launch(null)

获取单个/多个权限请求:

// 单个权限获取
registerForActivityResult(ActivityResultContracts.RequestPermission()) {
            if (it) {//同意权限
            } else {//拒绝权限
            }
        }.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
// 多个权限获取
var permissions: Array<String> = arrayOf(
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.CAMERA
        )
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
            if (it[Manifest.permission.WRITE_EXTERNAL_STORAGE]!!) {// 同意
            } else {// 拒绝
            }
            if (it[Manifest.permission.CAMERA]!!) {// 同意
            } else {// 拒绝
            }
        }.launch(permissions)

查询联系人信息:

registerForActivityResult(ActivityResultContracts.PickContact()){
            if(it != null){
                val cursor = contentResolver.query(it, null, null, null, null)
                cursor?.run {
                    if(cursor.moveToFirst()){
                        val name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
                    }
                }
            }
        }.launch(null)

选取文件:

registerForActivityResult(ActivityResultContracts.OpenDocument()){
            // 获取的文件uri
        }.launch(arrayOf("image/*","text/plain"))

 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

DwyaneQiang

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值