registerForActivityResult常规用法

registerForActivityResult常规用法

使用registerForActivityResult方法来注册回调。

此方法简化数据回调的写法,并且提供了多种用途。

registerForActivityResult常规用法:

//registerForActivityResult只能在onCreate中注册。onstart之后就不能注册了
val register = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
    
     result ->
      if (result.resultCode== RESULT_OK){
    
    
           val id = result.data?.getStringExtra("id")
       }
}
register.launch(Intent(this, MainActivity::class.java))

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

RequestMultiplePermissions 多个权限请求
RequestPermission 单个权限请求
TakePicturePreview 拍照预览
TakePicture 拍照
TakeVideo 摄像
PickContact 选择联系人
GetContent 获取各种文件的Uri
GetMultipleContents 获取多个各种文件的Uri
OpenDocument 打开文件
OpenMultipleDocuments 打开多个文件
OpenDocumentTree 打开文件夹
CreateDocument 创建文件

打开相机拍照:

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

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

// 单个权限获取
val register = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
    
    
    if (it) {
    
    //同意权限

    } else {
    
    //拒绝权限

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

查询联系人信息:

val register = 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))
            }
        }
    }
}
register.launch(null)

选取文件:

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

【注意】:registerForActivityResult只能在onCreate或者之前注册。onstart之后就不能注册了

如果需要用到的时候,随时注册

//随时调用,举例:
//kotlin:
var activityResultObserver = YActivityResultObserver(activityResultRegistry) {
    
    
    if (it!!.resultCode == Activity.RESULT_OK) {
    
    
        YLog.e("获取到安装权限")
    }
}
lifecycle.addObserver(activityResultObserver)
val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:$packageName"))
activityResultObserver.launch(intent)


//这个类实现,生命周期观察者,在onCreate时候注册ActivityResultLauncher,从而实现,随时谁地调用
class YActivityResultObserver(val registry: ActivityResultRegistry, val key: String = "key", val onResult: (ActivityResult?) -> Unit) : DefaultLifecycleObserver {
    
    
    private var take: ActivityResultLauncher<Intent>? = null
    override fun onCreate(owner: LifecycleOwner) {
    
    
        take = registry.register(key, ActivityResultContracts.StartActivityForResult(), onResult)
    }
    fun launch(intent: Intent) {
    
    
        take?.launch(intent)
    }
    override fun onDestroy(owner: LifecycleOwner) {
    
    
        take?.unregister()
    }
}

猜你喜欢

转载自blog.csdn.net/Yu1441/article/details/118614812
今日推荐