在Android 6.0 (API level 23)之前,安装应用程序的时候会让用户选择是否允许该应用程序使用哪些权限,如果用户拒绝则系统会终止应用程序的安装,从Android 6.0 (API level 23)开始,应用程序的权限授权改为应用程序运行时授权,正常权限系统会自动授权,危险权限会提示用户是否授权。
校验权限
int permissionCheck = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS);
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Log.d(tag, "已获取权限");
} else if (permissionCheck == PackageManager.PERMISSION_DENIED) {
Log.d(tag, "未获取权限");
}
返回 PackageManager.PERMISSION_GRANTED
表示允许授权,返回PackageManager.PERMISSION_DENIED
表示拒绝授权。
请求权限
int permissionCheck = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_CONTACTS)) {
Log.d(tag, "没有获取联系人权限,无法展示数据");
} else {
Log.d(tag, "请求权限");
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS}, 12);
}
}
ActivityCompat.shouldShowRequestPermissionRationale
方法当用户之前拒绝过此权限时返回true,此处可以用来描述为什么要获取权限;当用户选择“不在询问”时,返回false;
处理请求结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 12:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(tag, "已获取权限");
} else {
Log.d(tag, "权限被拒绝");
}
break;
}
}
需要注意的是,如果程序编译时targetSdkVersion小于23,即使程序运行在6.0的系统上,授权也是在程序安装时进行的,因此老程序运行在6.0上是没有问题的。只有当程序使用targetSdkVersion=23时编译,并且运行在6.0的系统上,才会对危险权限进行询问。
以下是完整代码:
package com.elf.demo;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
/**
* 运行时申请权限
*/
public class PermissionActivity extends AppCompatActivity {
private static final String tag = "PermissionActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
}
public void onCheck(View view) {
int permissionCheck = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS);
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Log.d(tag, "已获取权限");
} else if (permissionCheck == PackageManager.PERMISSION_DENIED) {
Log.d(tag, "未获取权限");
}
}
public void onRequest(View view) {
int permissionCheck = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_CONTACTS)) {
Log.d(tag, "这个程序需要联系人权限");
} else {
Log.d(tag, "请求权限");
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS}, 12);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 12:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(tag, "已获取权限");
} else {
Log.d(tag, "权限被拒绝");
}
break;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.elf.demo.PermissionActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="校验权限"
android:onClick="onCheck"
android:id="@+id/button" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请求权限"
android:onClick="onRequest"
android:id="@+id/button2" />
</LinearLayout>