跳至主要內容

Android 运行时权限

JI,XIAOYONG...大约 3 分钟

简介

本文介绍了 Android 运行时权限的一些处理流程。

Android 运行时权限是 Android6 之后出现的处理权限的新方式,此前开发者只需要应用需要的权限在 AndroidManifest.xml 文件中声明即可,现在则需要在使用到对应权限时检测是否有该权限并作出相应处理。

正文

一般流程

  1. AndroidManifest.xml中声明所需权限

  2. 在使用之前检查是否有该权限checkSelfPermission(),如果有则继续相应操作

  3. 如果没有权限则检测是否需要向用户解释为什么需要该权限ActivityCompat.shouldShowRequestPermissionRationale(),再决定如何申请权限requestPermissions()

需要说明的是,shouldShowRequestPermissionRationale() 在第一次申请该权限时会返回 false,第二次申请时返回 true;ue;

但是如果用户选择了不再提醒 则会一直返回 false。所以如果判断当前并非第一次申请该权限,并且返回结果为 false,就说明用户选择了不再提示,一般就需要提示用户到设置中开启对应权限。

  1. 申请权限的结果在onRequestPermissionsResult()方法中返回,根据用户对权限的处理结果决定接下来的操作

代码

onCreate()方法中调用对应方法

mSharedPreferences = getSharedPreferences(packageName, Context.MODE_PRIVATE)
checkCameraDeviceAndPremissions()

checkCameraDeviceAndPremissions()具体内容

private fun checkCameraDeviceAndPremissions() {
     ...
    //[2] 每次使用之前检测是否有改权限
        if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            safeRequestCameraPermission()
        } else {
            safeOpenCamera(cameraId)
        }
    }

对申请结果进行处理:

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        when (requestCode) {
            //[4] 处理请求权限的结果
            REQUEST_CAMERA -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    safeOpenCamera(cameraId)
                } else {
                    var noCameraPermissionDialog = AlertDialog.Builder(this@MainActivity)
                        .setTitle("警告⚠️")
                        .setMessage("没有相机权限,不可继续!\n请赋予相机权限")
                        .setCancelable(false)
                        .setPositiveButton("Yes") { _, _ ->
                            safeRequestCameraPermission()
                        }
                        .setNegativeButton("No") { _, _ -> finish() }
                        .create()
                    noCameraPermissionDialog.show()
                }
            }
        }
    }

safeRequestCameraPermission()的内容,这里才是处理申请权限的相关代码

private fun safeRequestCameraPermission() {
    //[3] 检测是否需要解释为什么需要改权限
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
        /**
         * 第一次请求时为 false
         * 第二次请求时为 true,需要解释为什么需要这个权限
         * 若用户选择了不再提示则一直为 false
         * 综上,如果不是第一次请求该权限,并且返回值为 false,那么可以判断用户选择了不再提示
         */
        //向用户解释为什么需要改权限
        var noCameraDialog = AlertDialog.Builder(this@MainActivity)
            .setTitle("提示️")
            .setMessage("本应用正常运行需要相机权限,点击确认开始赋予权限")
            .setCancelable(false)
            .setPositiveButton("Yes") { _, _ ->
                //用户同意后开始申请权限
                doRequestCameraPermission()
            }
            .create()
        noCameraDialog.show()
    } else {
        Log.d("TAG", "count " + mSharedPreferences.getInt(KEY_COUNT_REQUEST_CAMERA_PERMISSION, 0))
        if (mSharedPreferences.getInt(KEY_COUNT_REQUEST_CAMERA_PERMISSION, 0) > 1) {
            //TODO 用户拒绝了赋予权限,并且选择了“不再提醒”,提示用户到设置中开启
        } else {
            doRequestCameraPermission()
        }
    }
}

private fun doRequestCameraPermission() {
    //每次申请权限时更新计数器
    var count = mSharedPreferences.getInt(KEY_COUNT_REQUEST_CAMERA_PERMISSION, 0) + 1
    mSharedPreferences.edit().putInt(KEY_COUNT_REQUEST_CAMERA_PERMISSION, count).apply()
    requestPermissions(arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA)
}

附录

样例代码: Githubopen in new window

文章标题:《Android 运行时权限》
本文作者: JI,XIAOYONG
发布时间: 2018/11/25 13:10:08 UTC+8
更新时间: 2023/12/30 16:17:02 UTC+8
written by human, not by AI
本文地址: https://jixiaoyong.github.io/blog/posts/a2863875.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载请注明出处!
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8