Android 6.0运行时权限

Android 6.0运行时权限

Android 6.0这个版本引入了一种新的权限模式———Runtime Permissions。用户可以在程序运行时来管理应用程序的权限。在这种模式能够让用户更好的了解和控制权限。

对于以Android 6.0(API级别23)或更高的版本为目标平台的应用,必须在运行时检查和请求权限。下面具体介绍一下如何在运行时来管理权限。

检查权限

当应用需要危险权限的时候,每次执行都必须要查自己是否拥有该权限。因为不能保证应用每次使用该功能的时候都具有权限。以下是检测应用是否具有相机的权限。

1
2
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.CAMERA);

如果应用具有该权限,该方法返回PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,则返回PERMISSION_DENIED,此时应用必须向用户请求该权限。

请求权限

如果应用没有权限,则需要调用 requestPermissions()方法来请求权限,以下是检测并请求相机的权限代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {

// 如果需要给用户做一些解释,应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
if (ActivityCompat.shouldShowRequestPermissionRationale(context,
Manifest.permission.CAMERA)) {
//do something
} else {

// 请求相机权限
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);

//MY_PERMISSIONS_REQUEST_CAMERA是我们需要定义请求码
}
}

处理请求权限的回调

当应用请求权限时,系统会向用户显示一个权限对话框,用户做出响应的时候,系统会回调onRequestPermissionsResult() 方法,通过 requestPermissions()方法传递的请求码,来作出相应的回应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA: {
// 如果请求被取消,则grantResults数组的长度为0.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//权限被允许了
} else {
//权限被拒绝了
}
return;
}
}
}

请求多个权限实例

写了一个简单的例子供以后复习使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public class SplashActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback{

//定义权限请求码
public static int PERMISSIONS=2;
//定义请求权限数组
public static String[] permissions = new String[] {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermission(SplashActivity.this);
} else {
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
}

/**
* 检测需要申请的权限
* @param permissions
* @return
*/
private List<String> getPermissionResult(String[] permissions){
List<String> tempList = new ArrayList<String>();
for (String permission : permissions){
if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
tempList.add(permission);
}
}
return tempList;
}

/**
* 请求权限
*/
private void requestPermission(Activity activity){
List<String> permissionList = getPermissionResult(permissions);
if (permissionList.size() != 0){
ActivityCompat.requestPermissions(activity, permissionList.toArray(new String[permissionList.size()]), PERMISSIONS);
} else {
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
}


@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSIONS){
boolean result = true;
for (int grantResult : grantResults){
if (grantResult == PackageManager.PERMISSION_DENIED){
result=false;
break;
}
}
if (!result){
Snackbar.make(SplashActivity.this.findViewById(android.R.id.content),"权限被拒绝!重新进入获取权限", 2000).show();
finish();
} else {
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}