android 运行时权限处理

WHAT

Android 6.0 以上版本引入了运行时权限请求, 高敏感的权限将需要用户许可才可使用;

权限组 权限
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

HOW

代码示例 请求权限为:
ACCESS_WIFI_STATE,
CHANGE_WIFI_STATE,
ACCESS_FINE_LOCATION,
ACCESS_COARSE_LOCATION;

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
private final int ACCESS_WIFI_AND_LOCATION = 0;


private String[] permissions = new String[] {
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.CHANGE_WIFI_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
};

@Override
protected void (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getPermissions();
}

public void getPermissions() {
List<String> permissionList = new ArrayList<>();
for (String permission : permissions) {
// 轮询请求权限并使用 checkSelfPermission 检查是否已拥有此权限
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
// 将还未拥有的权限加入 List
permissionList.add(permission);
}
}
if (permissionList.isEmpty()) {
Toast.makeText(this, "DONE", Toast.LENGTH_SHORT).show();
} else {
//
requestPermissions(permissionList.toArray(new String[permissionList.size()]), ACCESS_WIFI_AND_LOCATION);
}
}

// 复写 onRequestPermissionsResult 方法进行权限处理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case ACCESS_WIFI_AND_LOCATION: {
if (grantResults.length > 0) {
for (String permission : permissions) {
if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
Toast.makeText(this, "Nah: " + permission, Toast.LENGTH_SHORT).show();
}
}
} else {
boolean showRationale = shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_WIFI_STATE);
// 为什么需要此权限
if (showRationale) {
Toast.makeText(this, "I NEED IT", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "NONE", Toast.LENGTH_SHORT).show();
}
}
return;
}
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}