MainActivity中的调用
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
private fun requestPermission() {
PermissionUtil(this)
.request(
arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.CAMERA
)
)
.result {
Toast.makeText(this, "$it", Toast.LENGTH_SHORT).show()
}
}
PermissionUtil源码
- RxPermission的原理是通过RxPermission这个类添加一个Fragment,在Fragment请求权限,并在Fragment里处理了onRequestPermissionsResult,然后通过RxPermission将结果回调出去,这样避免了在Activity中写onRequestPermissionsResult
package com.zhangyu.myapplication
import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
private const val TAG = "PermissionFragment"
private const val REQUEST_CODE_PERMISSION = 111
class PermissionUtil(activity: FragmentActivity) {
private var fragment: PermissionFragment = PermissionFragment.newInstance()
init {
Log.d(TAG, "PermissionUtil.init(): ")
activity.supportFragmentManager.beginTransaction()
.add(fragment, "tag")
.commitNow()
}
private lateinit var permissions: Array<out String>
fun request(permissions: Array<out String>): PermissionUtil {
this.permissions = permissions
return this
}
fun result(res: (isGrant: Boolean) -> Unit) {
fragment.result = res
fragment.requestAllPermission(permissions)
}
}
class PermissionFragment : Fragment() {
companion object {
@JvmStatic
fun newInstance() = PermissionFragment()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(TAG, "PermissionFragment.onCreate: ")
}
var result: (isGrant: Boolean) -> Unit = {}
fun requestAllPermission(permissions: Array<out String>) {
var isGrant = true
for (permission in permissions) {
Log.e(
TAG, "requestAllPermission: $permission," + ContextCompat.checkSelfPermission(
requireActivity(), permission
)
)
if (ContextCompat.checkSelfPermission(
requireActivity(),
permission
) != PackageManager.PERMISSION_GRANTED
) {
isGrant = false
requestPermissions(
permissions,
REQUEST_CODE_PERMISSION
)
break
}
}
if (isGrant) result.invoke(isGrant)
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
var isGranted = true
Log.d(TAG, "onRequestPermissionsResult: ")
when (requestCode) {
REQUEST_CODE_PERMISSION -> {
for (grant in grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
isGranted = false
break
}
}
}
}
result.invoke(isGranted)
}
}