在android中请求权限,一般使用requestPermissions和onRequestPermissionsResult组合使用来完成。

但是这种方式有个很大的弊端,会让代码分割导致代码可读性变差。经测试改方式ktx调用registerForActivityResult只能在activity或者fragment,初始化时调用,不能用在点击的时候触发使用

添加依赖

 implementation "androidx.activity:activity-ktx:1.2.3" implementation "androidx.fragment:fragment-ktx:1.3.3"

直接上代码

suspend fun ActivityResultCaller.permission(permission: String): Boolean {         return callbackFlow {             registerForActivityResult(ActivityResultContracts.RequestPermission()) {      isGranted: Boolean ->            this.offer(isGranted)            close()        }.launch(permission)        awaitClose()    }.first()}

思路

使用ktx库将分割的调用使用callback模式进行调用

val caller = registerForActivityResult(        ActivityResultContracts.RequestPermission()    ) {      isGranted: Boolean ->    //返回权限请求结果}caller.launch("请求具体权限")

使用kotlin提供的CallbackFlow,将回调方式转变为协程的Flow调用

 callbackFlow<Boolean> {          //callback register     // 不可缺少,需要在此等待call的回调结果    awaitClose() }

将flow转变为单个返回结果

val result = callbackFlow<Boolean> {          ... }.first()

使用

假设一个场景,点击按钮后,需要调用扫码,此时需要进行相机权限请求。

class MainActivity: AppCompatActivity(){           override fun onCreate(savedInstanceState: Bundle?) {          ...              lifecycleScope.launch {                 val result = permission(Manifest.permission.CAMERA)            if(result){                     //todo            }else{                     Toast.makeText(this@MainActivity,"请开启相机权限",Toast.LENGTH_SHORT).show()            }        }           }

}

总结

使用kotlin协程带来的不只是执行效率上的提升,还有代码的可读性。可以将很多异步执行的代码以同步执行的方式进行编写(此时也带来一个弊端,如果不借助ide的标识显示suspend 调用,可能导致误解)。

更多相关文章

  1. ❤️【Android精进之路-04】Android核心组件Activity(Activity的生
  2. 史上最全的Android面试题集锦
  3. Android(安卓)USB 开发详解
  4. Android提示:使用或覆盖了已过时的 API
  5. android应用安全——通信安全(android https)
  6. 有关Android调用服务全解析
  7. android中Parcelable接口的使用
  8. 【Android(安卓)开发】:UI控件之拖动条控件 SeekBar的使用方法
  9. 在Android中使用Handler和Thread线程执行后台操作

随机推荐

  1. 浅析Android事件分发机制
  2. 关于用百度地图开发的准备工作
  3. Android 隐藏手机号中间四位和隐藏邮箱地
  4. Android xmlns
  5. Android之MVP架构模式_
  6. ubuntu10.04上android环境安装“org.ecli
  7. This tag and its children can be repla
  8. 第一行代码 Android读书笔记(四)
  9. Android的休眠与唤醒
  10. [android] 将时长数为毫秒的转化为分钟和