Android 动态权限获取,模仿RxPermission手写一个PermissionUtil,不依赖于RxJava

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 -> {
                // If request is cancelled, the result arrays are empty.
                for (grant in grantResults) {
                    //有一个失败则失败。
                    if (grant != PackageManager.PERMISSION_GRANTED) {
                        isGranted = false
                        break
                    }
                }
            }
        }
        result.invoke(isGranted)
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值