registerForActivityResult常规用法

16 篇文章 3 订阅
7 篇文章 0 订阅

registerForActivityResult常规用法

随时调用 无需提前注册(推荐)

//跳转
activityResultRegistry.register("456",ActivityResultContracts.StartActivityForResult()){result->
    if (result?.resultCode != Activity.RESULT_OK) return@register
}.run { launch(Intent(this@Activity, CaptureActivity::class.java)) }

//获取权限
activityResultRegistry.register("123", ActivityResultContracts.RequestPermission()){
  if (!it) return@register
}.run { launch(Manifest.permission.CAMERA) }

registerForActivityResult常规用法 (不推荐)

使用registerForActivityResult方法来注册回调。

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

java

//onCreate中注册、或者成员变量
ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
    if (result.getResultCode() == Activity.RESULT_OK) {
       //
    }
});
launcher.launch(intent);



//权限
var registerPermission: ActivityResultLauncher<String>? = null
lifecycle.addObserver(object : DefaultLifecycleObserver {
    override fun onCreate(owner: LifecycleOwner) {
        super.onCreate(owner)
        //相机权限返回
        registerPermission = activityResultRegistry.register("CAMERA", ActivityResultContracts.RequestPermission()) {
            //同意权限
            if (it) { }
        }
    }
})
//调用相机权限
registerPermission?.launch(Manifest.permission.CAMERA)

kotlin

//onCreate中注册
val register = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data
        val extra = data?.getStringExtra("extra")
    }
}
register.launch(Intent(this, MainActivity::class.java))

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

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

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

打开相机拍照:

//--------------------------模糊--------------------------
activityResultRegistry.register("789", ActivityResultContracts.TakePicturePreview()) {bitmap->
    bitmap?.let {
        YImageDialog.show(bitmap)
        YLog.i("分辨率:${bitmap.width}x${bitmap.height} 路径:${file}   uri:${uri}")
    }
}.run { launch(null) }


//--------------------------高清--------------------------
val file = File(getExternalFilesDir("")!!.absolutePath + "/img/1.jpg")
if (!file.parentFile.exists()) file.parentFile.mkdirs()
val uri: Uri = FileProvider.getUriForFile(this, applicationContext.packageName + ".fileProvider", file)
//拍照
activityResultRegistry.register("789", ActivityResultContracts.TakePicture()) {
    if (!it) return@register  //拍照失败
    val bitmap = YUri.getBitmap(this, uri)
    YImageDialog.show(bitmap)
    YLog.i("分辨率:${bitmap.width}x${bitmap.height} 路径:${file}   uri:${uri}")
}.run { launch(uri) }

打开相机拍照并且剪切

//拍照并返回,详细看YTake源码
YTake.takeAndCorp(this) {
    val bitmap = YConvert.uri2Bitmap(this, it)
    YImageDialog.show(bitmap)
}

自定义返回格式

/*
用法:

//拍照返回
private val takeImage = registerForActivityResult(YTakePicture(this)) {
   //it=Uri
}
//拍照
val file = File(YPath.getPICTURES() + "/img/${Date().time}.jpg")
takeImage.launch(file)
*/

/**
 * 拍照,传入File,拍照成功返回Uri
 */
class YTakePicture(val context: Context) : ActivityResultContract<File, Uri>() {
    var uri: Uri? = null
    override fun createIntent(context: Context, input: File?): Intent {
        uri = YPicture.createImageUri(context, input)
        return Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, uri)
    }

    override fun parseResult(resultCode: Int, intent: Intent?): Uri? {
        if (resultCode != Activity.RESULT_OK) return null
        return uri
    }
}

打开相机录像

//视频路径
val file = File(YPath.get() + "/img/1.mp4")
if (!file.parentFile.exists()) file.parentFile.mkdirs()
val uri: Uri = FileProvider.getUriForFile(this, applicationContext.packageName + ".fileProvider", file)

//录像
val registerTakeVideo = registerForActivityResult(ActivityResultContracts.TakeVideo()) {
	//测试缩略图为空 it:Bitmap=null
	YLog.i(" 路径:${file}   uri:${uri}")
}

//单个权限获取
val registerPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
	//同意权限
	if (it) registerTakeVideo.launch(uri)
}

registerPermission.launch(Manifest.permission.CAMERA)

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

// 单个权限获取
activityResultRegistry.register("123", ActivityResultContracts.RequestPermission()){
  if (!it) return@register
}.run { launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) }


// 多个权限获取
var permissions = arrayOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO)
val registerPermissions = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
        for (item in permissions) {
            if (it[item]!!) {// 同意
                Log.d(TAG, "获取到权限:${permissions}")
            } else {
                Toast.makeText(this, "用户未授予的权限。", Toast.LENGTH_SHORT).show()
                return@registerForActivityResult
            }
        }
        //获取所有权限后
        startCamera()
    }

//申请权限
registerPermissions.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"))

//或者
var register: ActivityResultLauncher<Array<String>>? = null
lifecycle.addObserver(object : DefaultLifecycleObserver {
	override fun onCreate(owner: LifecycleOwner) {
		super.onCreate(owner)
		register = activityResultRegistry.register("chose", ActivityResultContracts.OpenDocument()) { it: Uri? ->
			// 获取的文件uri
		}
	}
	override fun onDestroy(owner: LifecycleOwner) {
		super.onDestroy(owner)
		register?.unregister()
	}
})
register?.launch(arrayOf("image/jpg", "image/jpeg", "image/png",))
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 你好!registerForActivityResult() 是一个在 Android 开发中常用的方法,用于注册一个 ActivityResultCallback 对象,以接收从另一个 Activity 返回的结果。 该方法通常与 startActivityForResult() 一起使用,用于获取从另一个 Activity 返回的结果数据。在 onActivityResult() 方法中,可以通过 resultCode 和 data 参数来处理返回的结果。 示例代码: ```kotlin val someActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { // 处理返回结果 val data: Intent? = result.data } } ``` 需要注意的是,该方法只能在 Fragment 或 Activity 中调用,且需要使用 ActivityResultCallback 对象来处理返回结果。 希望这个解答对你有所帮助!如果还有其他问题,请随时问我。 ### 回答2: registerForActivityResult是Android Jetpack中的一个函数,用于注册一个Activity结果的回调。它可以用于处理由startActivityForResult或者requestPermissions等方法触发的结果。 使用registerForActivityResult的步骤如下: 1. 首先,需要定义一个ActivityResultContract。这个Contract用于描述Activity之间进行通信的信息,它定义了输入参数和输出结果的类型。常见的Contract有ActivityResultContracts.StartActivityForResult和ActivityResultContracts.RequestPermission。 2. 然后,使用registerForActivityResult函数注册一个Activity结果的回调。这个函数接收一个ActivityResultContract对象和一个回调函数,用于处理返回的结果。 3. 在需要启动一个Activity或者请求权限的地方,调用registerForActivityResult返回的Launcher对象的launch方法。这个方法会启动对应的Activity,并在结果返回时调用之前注册的回调函数。 4. 最后,可以在回调函数中处理返回的结果。根据Contract定义的类型,可以得到对应的结果数据,并执行相应的操作。 registerForActivityResult的好处是可以更方便地处理Activity结果的回调,而不需要手动实现onActivityResult方法。它使得代码结构更加清晰,并且方便组织和管理结果的处理逻辑。 需要注意的是,registerForActivityResult只能在Fragment或者Activity中使用,且需要使用AndroidX库才能使用。 ### 回答3: registerForActivityResult是一个在Activity或Fragment中注册ActivityResult回调的方法。 使用registerForActivityResult方法需要传入一个ActivityResultCallback对象,该对象负责处理ActivityResult的结果。例如: val someActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val data: Intent? = result.data // 处理返回的数据 } } 在调用registerForActivityResult方法时,我们需要传入一个ActivityResultContracts.StartActivityForResult对象作为参数,这个对象指定了我们想要执行的操作,比如启动一个新的Activity并返回结果。 当我们要执行某个操作时,比如启动一个新的Activity,并希望能够处理返回的结果,我们可以使用someActivityResultLauncher.launch(intent)来启动Activity。 当启动的Activity结束后,会回调注册的ActivityResultCallback对象中的回调方法。这个方法中的result参数包含了返回的结果,我们可以通过resultCode来判断操作的结果是否成功,并通过data来获取返回的数据。 需要注意的是,registerForActivityResult方法只能在Activity或Fragment中调用,且只能在生命周期的onCreate方法中调用,以确保能够正确地注册ActivityResult回调。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值