Android权限状态判断

一、背景

做啥事肯定是有原因的,最近在做和H5那边交互,那边申请某个权限之前,需要知道该权限状态,其中一个状态,就是判断用户是否永久拒绝了此权限(拒绝且不在提醒),这个就比较坑,iOS那边是有方法直接获取的,但是Android这边貌似没有直接获取此状态的方法(有找到此方法的小伙伴请留言)。我们最熟悉的权限检测方法ActivityCompat.checkSelfPermission(activity, permission),但是此方法只返回true和false,true是已授权,false是用户拒绝了此权限,无法应付需求

二、实现逻辑

1.不会的当然是百度,百度中找到了一个方法ActivityCompat.shouldShowRequestPermissionRationale(activity, permission),此方法也只返回true和false。以下是每种情况返回值

  • 未请求权限,返回false
  • 请求了权限,用户选择了拒绝权限,但不是永久拒绝,下次申请权限还会弹窗,这时候返回值为true
  • 请求了权限,用户决绝了权限,并且是永久拒绝(选择了拒绝且不在提示),此时返回值为false
  • 用户同意了权限,此时返回值为false

2.找到了此方法,离成功就不远了。现在来说下具体判断逻辑,我们先总结下,一共会出现的几种状态,第一种就是还没申请过此权限,第二种是用户已同意权限,第三种就是申请了权限,被用户拒绝,但下次申请还会弹窗提醒,第四种就是我们要找的,用户拒绝了权限,并且下次不会再提示

  • 第一种状态,无法用提供的两个方法判断,需要做一个本地存储,判断是否申请过此权限,可以用SharedPreferences,以权限名为key,当申请此权限,就记录一下。
  • 第二种状态就比较好判断,直接用ActivityCompat.checkSelfPermission(activity, permission)判断为true就行
  • 第三种状态,直接用ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)判断为true就行
  • 第四种状态就不用判断了,else就行

三、具体代码

不单独获取状态,包含了申请权限,做了个简单的权限申请封装,目前只做申请单个权限功能,自己可以加多权限处理。说了这么多废话,现在具体上代码( ˘•ω•˘ )

object PermissionUtils {
    //获取权限成功
    const val STATUS_SUCCESS = 0
    //申请权限拒绝, 但是下次申请权限还会弹窗
    const val STATUS_REFUSE = 1
    //申请权限拒绝,并且是永久,不会再弹窗
    const val STATUS_REFUSE_PERMANENT = 2
    //默认未请求授权状态
    const val STATUS_DEFAULT = 3

    private const val REQUEST_CODE = 10000
    private lateinit var permissions: Array<out String>
    private var listener: PermissionListener?= null

    /**
     * 判断是否已授权
     */
    fun isAuthorized(activity: Activity, authorize: String): Boolean{
        val isShow = ActivityCompat.shouldShowRequestPermissionRationale(activity, authorize)
        LogUtils.d("print","$isShow")
        val flag = ActivityCompat.checkSelfPermission(activity, authorize)
        if (flag!= PackageManager.PERMISSION_GRANTED){
            return false
        }
        return true
    }

    /**
     * 获取权限状态
     */
    fun getAuthorizeStaus(activity: Activity,authorize: String): Int{
        val flag = ActivityCompat.checkSelfPermission(activity, authorize)
        val isShould = ActivityCompat.shouldShowRequestPermissionRationale(activity, authorize)
        if (isShould){
            return STATUS_REFUSE
        }
        if (flag == PackageManager.PERMISSION_GRANTED){
            //获取到权限
            return STATUS_SUCCESS
        }
        if (!SharedUtils.contains(authorize)){
            return STATUS_DEFAULT
        }
        return STATUS_REFUSE_PERMANENT
    }

    /**
     * 申请单个权限权限
     */
    fun requestPermission(activity: Activity,authorize: String,listener: PermissionListener){
        this.listener = listener
        permissions = arrayOf(authorize)
        val flag = ActivityCompat.checkSelfPermission(activity, authorize)
        if (flag!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(activity, permissions,REQUEST_CODE)
        }else{
            this.listener?.requestResult(true)
        }
    }

    /**
     * 返回结果
     */
    fun onRequestPermissionsResult(activity: Activity,requestCode: Int, permissions: Array<out String>,  grantResults: IntArray){
        if (requestCode != REQUEST_CODE){
            return
        }
        permissions.forEach {
            val isShould = ActivityCompat.shouldShowRequestPermissionRationale(activity, it)
            SharedUtils.putBoolean(it,isShould)
        }
        grantResults.forEach {

            if (it != PackageManager.PERMISSION_GRANTED){
                listener?.requestResult(false)
                return
            }
        }
        listener?.requestResult(true)
    }
}

interface PermissionListener {
    /**
     * 授权结果
     */
    fun requestResult(isFlog: Boolean)
}

SharedUtils工具类,需要先SharedUtils.init(context)初始化,不然会报错

object SharedUtils {
    const val FILE_NAME = "JsLibrary"
    lateinit var sp: SharedPreferences

    fun init(context: Context){
        sp = context.applicationContext.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE)
    }
    /**
     * 添加boolean值
     */
    fun putBoolean(key: String,value: Boolean){
        sp.edit().putBoolean(key,value).apply()
    }
    /**
     * 获取boolean值
     */
    fun getBoolean(key: String,default: Boolean): Boolean{
        return sp.getBoolean(key,default)
    }

    /**
     * 判断是否存在
     */
    fun contains(key: String): Boolean{
        return sp.contains(key)
    }
}

具体调用方法

  • 在申请权限的activity中需要加上一下代码
/**
     * 权限返回结果
     */
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        PermissionUtils.onRequestPermissionsResult(this,requestCode,permissions,grantResults)
    }
  • 获取状态代码
val status = PermissionUtils.getAuthorizeStaus(activity,xxx权限)

status就是返回的那四种状态

  • 额外权限申请方法
PermissionUtils.requestPermission(activity, xx权限, object : PermissionListener{
                    override fun requestResult(isFlog: Boolean) {
                        Log.d("print","$isFlog")
                    }
                })

申请权限回调结果isFlog,true同意权限,false为拒绝权限

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335