概述
之前应用的权限在安装时全部授予,运行时应用不再需要
询问用户。在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私
的权限需要在运行时根据用户的需要动态授予。这样用户就不需要在安装时被强迫同
意某些权限。
2. 正常权限和危险权限
系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权
限和危险权限:
(1)正常权限:
涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小
的区域。这些权限在应用安装时授予,运行时不再询问用户。例如: 网络访问、WIFI
状态、音量设置等。完整的正常权限列表参考官网正常权限。
(2)危险权限:
涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他
应用的操作产生影响的区域。例如: 读取通讯录、读写存储器数据、获取用户位置等。
如果应用声明需要这些危险权限,则必须在运行时明确告诉用户,让用户手动授予。
3. 权限组
系统对所有的危险权限进行了分组,称为权限组 。属于同一组的危险权
限将自动合并授予,用户授予应用某个权限组的权限,则应用将获得该权限组下的所
有权限。
下面用代码demo:
public class Main2Activity extends AppCompatActivity {
//申请读写权限
final static String[] REQUEST_PERMISSION = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
};
//权限码
final static int REQUEST_CODE = 1;
private static final String TAG = "Main2Activity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//判断当前系统是否是Android6.0(对应API 23)以及以上
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1){
//遍历权限组,检查是否拥有权限,只要有一个权限不满足就申请权限
for (String permiss:REQUEST_PERMISSION)
if (ActivityCompat.checkSelfPermission(this,permiss) != PackageManager.PERMISSION_GRANTED){
//申请权限
ActivityCompat.requestPermissions(this,REQUEST_PERMISSION,REQUEST_CODE);
}
}
}
/**
* 申请权限回调方法
* @param requestCode 请求码
* @param permissions 请求权限组
* @param grantResults 请求结果,0表示授权成功,-1表示授权失败
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//判断是否获取到权限
if (requestCode == REQUEST_CODE){
//执行读写操作
Log.e(TAG, "onRequestPermissionsResult: " + " 获得权限" );
}
}
}