• ContextCompact.checkSelfPermission 检查是否已有某个权限
  • ActivityCompat.requestPermissions() 权限请求
  • onRequestPermissionResult() 权限请求后的回调
  • ActivityCompat.shouldShowRequestPermissionRationale 可以给用户展示的一个权限请求来的作用,在权限被用户拒绝的情况才会出现

#####危险权限:

  • CALENDAR
  • CAMERA
  • CONTACTS
  • LOCATION
  • MICROPHONE
  • PHONE
  • SENSORS
  • SMS
  • STORAGE

#####详情:
详情
#####简单的权限请求demo

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

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.bn_main).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
callPhone();//模拟打电话
}
});
}
private void callPhone(){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){
//权限请求未被同意
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},1);
}else {
//权限请求被同意
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1://请求的权限码
if (grantResults[0]==PackageManager.PERMISSION_GRANTED){
//权限被同意
}else {
//权限被拒绝 提示用戶沒有權限

}
break;
}
}
}

#####封装:

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
/**
* 檢查是否由權限
* */
private Boolean hasPermission(String ... permissions){
for(String permission:permissions){
if (ContextCompat.checkSelfPermission(this,permission)!= PackageManager.PERMISSION_GRANTED){
return false;
}
}
return true;
}
/**
* 權限請求
* */
private void requestPermissions(int code,String ... permissions){
ActivityCompat.requestPermissions(this,permissions,code);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

switch (requestCode){
case Constants.CALL_CODE:

break;
}
}