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()
}
}