前言
众所周知,Android6.0之后谷歌对于手机的一些敏感权限做了动态申请机制,申请时会弹出一个对话框询问用户是否授权,需要用户同意后应用才能获取到该权限。
正文
今天记录下这两天在项目中碰到的一个bug,app首次启动在动态申请定位权限时没有弹出申请对话框而第二次启动时缺又正常了。
经排查发现是因为在申请动态权限之前做了其他权限申请,导致当第二个权限申请时刚好onRequestPermissionsResult进行了回调使得代码误认为第二个权限申请弹窗已经响应完毕了。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_user_info)
//第一个权限申请
checkMustPermission()
//第二个权限申请
checkLocalPermission()
}
private fun checkLocalPermission() {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), 2)
}
}
private fun checkMustPermission() {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE), 1)
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
//当我们对一个申请弹窗进操作后这里会进行响应,同时又执行了checkLocalPermission()方法
}
解决方案
用第三方权限申请库,或者在进行第二个权限申请时做一个对第一个申请结果回调的判断。我们项目经查看代码和了解业务逻辑后发现第二个权限申请时非必要的,直接把第二个申请代码去掉就解决了。
网友评论