声明权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.snazzyapp"> <uses-permission android:name="android.permission.SEND_SMS"/> <application ...> ... </application> </manifest>
运行时请求权限
自从安卓6.0起,需要授予权限在程序运行时而不是安装程序时。
系统权限又分为两种
- 正常权限
该种权限系统自动授权许可
- 危险权限
该种权限必须用户显式的授权
1、检查权限
// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
如果具有该权限,那么该函数返回 PackageManager.PERMISSION_GRANTED,否则返回
PERMISSION_DENIED
,
2、请求权限
如果用户曾拒绝请求,再次需要权限时,可以通过 shouldShowRequestPermissionRationale()
用来解释为何使用该权限(比如弹出个对话框),再次询问是否授权
通过 requestPermissions() 授予权限,该函数会打开一个对话框让用户授权或拒绝,需要传入一个整型请求标识,以及请求的权限,该函数是异步的
// 检查是否有该权限 if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // 是否需要解释,在拒绝一次后再次请求时会返回true if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an expanation to the user *asynchronously* -- don‘t block // this thread waiting for the user‘s response! After the user // 看过解释后再次请求权限 } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } }
3、 处理授权
在 requestPermissions() 打开的对话框关闭后,系统会调用
onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 来处理授权结果
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 授权成功,授权后的操作 } else { // 拒绝授权,提示运行需要该权限 } return; } // other ‘case‘ lines to check for other // permissions this app might request } }
时间: 2024-10-05 14:56:04