运行时权限
Android的权限机制从系统第一个版本开始就已经存在,从Android6.0开始引入了运行时权限这个概念,权限可以分为以下两类:
- 普通权限
- 危险权限
判断权限种类的方法:是否直接威胁到用户的安全和隐私
普通权限之外的均是危险权限,危险权限一共9组24个权限
运行时权限处理时,用户一旦同意授权,该权限所在的权限组的其他所有权限均会被授权
无论是普通权限还是危险权限,均要添加在AndroidManifest.xml中
如何实现运行时权限处理的功能
拨打电话的例子
- 在布局文件中添加按钮
<Button
android:id="@+id/make_call"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="make call"
android:textSize="18sp"
/>
- 在MainActivity.class中完善逻辑
- 检查是否申请权限
- 动态申请权限
- 权限申请弹窗
- 成功:拨打电话
- 权限申请失败
- 权限申请弹窗
- 拨打电话
- 动态申请权限
- 检查是否申请权限
1.是否申请权限
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();
}
//该方法接收两个参数:上下文,需要申请的权限,返回整数
2.动态申请权限
ActivityCompat.requestPermissions(MainActivity.this,new String[]{
Manifest.permission.CALL_PHONE},1);
//该方法接收三个参数:上下文,字符串数组存储申请权限,请求码(传入1)
3.回调方法
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
call();
}
else {
Toast.makeText(MainActivity.this,"you denid the permission",Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
//回调方法:动态申请权限弹窗之后会回调该方法,第一个参数为请求码,第三个参数为授权结果
4.拨打电话
private void call(){
try{
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}catch(SecurityException e){
e.printStackTrace();
}
}
- 在AndroidManifest.xml中添加权限
运行效果