• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Android 运行时权限

武飞扬头像
低吟不作语
帮助1

概述

Android 的权限机制是用于保护用户的设备安全,主要在两个方面得到保护:

  • 如果用户在低于 Android 6.0 系统的设备上安装该程序,会在安装界面给出提醒,用户可以清楚的知晓该程序一共申请了哪些权限,从而决定是否要安装这个程序
  • 用户可以随时在应用程序管理界面查看任意一个程序的权限申请情况

但是很多软件都存在着滥用权限的情况,如果不同意权限申请就无法使用。因此,Android 6.0 以后加入了运行时权限功能,也就是说,用户不需要在安装软件时一次性授权所有申请的权限,而是在软件的使用过程中再对某一权限申请进行授权

当然,并不是所有权限都需要在运行时申请,对于用户来说不停的授权也很烦琐。Android 将常用权限大致归为两类:普通权限和危险权限。普通权限不会直接威胁用户的安全,对于这部分的权限申请,系统会自动帮我们进行授权。危险权限则表示那些可能会触发用户隐私或者对设备安全造成影响的权限,必须用户手动授权才行

下表列出了到 Android 10 系统为止的所有危险权限

权限组名 权限名
CALENDAR READ_CALENDAR,WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS,WRITE_CONTACTS,GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION,ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE,CALL_PHONE, READ_CALL_LOG,WRITE_CALL_LOG,ADD_VOICEMAIL,USE_SIP,PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS,RECEIVE_SMS,READ_SMS,RECEIVE_WAP_PUSH,RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE

申请权限

这里使用 CALL_PHONE 这个权限作为示例,该权限是编写拨打电话功能时需要声明的,被列为危险权限

修改 AndroidManifest.xml 文件,在其中声明如下权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.fragmenttest">

    <uses-permission android:name="android.permission.CALL_PHONE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.FragmentTest">
		...
    </application>

</manifest>
学新通

修改 MainActivity 中的代码,定义一个按钮去触发拨打电话的逻辑

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener {
            if (ContextCompat.checkSelfPermission(this,
                            Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this,
                        arrayOf(Manifest.permission.CALL_PHONE), 1)
            } else {
                call()
            }
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            1 -> {
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    call()
                } else {
                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

    private fun call() {
        try {
            val intent = Intent(Intent.ACTION_CALL)
            intent.data = Uri.parse("tel:10086")
            startActivity(intent)
        } catch (e: SecurityException) {
            e.printStackTrace()
        }
    }
}
学新通

首先,要判断用户是不是已经给我们授权了,借助的是 ContextCompat.checkSelfPermission() 方法,它接收两个参数:第一个参数是 Context,第二个参数是具体的权限名。然后我们使用方法的返回值和 PackageManager.PERMISSION_GRANTED 作比较,相等就说明用户已经授权

如果已经授权,就执行拨打电话方法。如果没有授权,就需要调用 ActivityCompat.requestPermissions() 方法向用户申请授权,接收三个参数:第一个参数是 Activity 的实例,第二个参数是要申请的权限名的 String 数组,第三个是请求码,只需要是唯一值就行

调用 requestPermissions() 方法后,系统就会调用一个权限申请的对话框,用户同意或拒绝后,最终都会回调到 onRequestPermissionsResult() 方法中,授权结果会封装到 grantResults 参数当中。这里我们只需要判断最后的授权结果,并执行相应的操作即可

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfagha
系列文章
更多 icon
同类精品
更多 icon
继续加载