一、 Android权限机制介绍
二、运行时权限介绍
- 1、运行时权限:用户不需要在安装软件时一次性授权所有申请的权限,而是可以在软件的使用过程中再对某一项权限申请进行授权
- 2、运行时权限的核心:在程序运行过程中由用户授权我们去执行某些危险操作,程序是不可以擅自做主去执行这些危险操作的
- 3、Android将所有权限归为两类:①普通权限——系统自动帮我们授权;②危险权限——必须用户手动点击授权才行
- 4、危险权限种类:9组24个权限
三、在程序运行时申请权限 以申请打电话的运行时权限为例:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
....
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE
!= PackageManager.PERMISSION_GRANTED)){
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CALL_PHONE},1);
}else {
call();
}
}
});
}
private void call(){
....
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
....
}
}
1、首先借助ContextCompat.checkSelfPermission()方法判断用户是不是已经给过我们授权,该方法传入的第二个参数就是具体的权限名
2、若没有授权,则调用ActivityCompat.requestPermissions()方法向用户申请授权,这里传入三个参数,第一个是Activity的实例,第二个是一个String数组,我们把要申请的权限名放在数组中即可,第三个参数是请求码(唯一值)
3、若授权,则调用call()方法直接拨打电话
private void call() {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
call();
}else {
Toast.makeText(this,"你取消了申请",Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
1、在调用了requestPermissions()方法后,系统会弹出一个权限申请的对话框选择同意还是拒绝
2、不论我们是选择同意或拒绝权限申请,最终都会回调到onRequestPermissionsResult()方法中
3、授权结果会封装到grantResults当中,可以通过grantResults存储的结果进行判断是否成功授权
|