Android 6.0动态权限获取
1.概述
Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要
询问用户。在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私
的权限需要在运行时根据用户的需要动态授予。这样用户就不需要在安装时被强迫同
意某些权限。
2. 正常权限和危险权限
Android 系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权
限和危险权限:
(1)正常权限:
涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小
的区域。这些权限在应用安装时授予,运行时不再询问用户。例如: 网络访问、WIFI
状态、音量设置等。完整的正常权限列表参考官网正常权限。
(2)危险权限:
涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他
应用的操作产生影响的区域。例如: 读取通讯录、读写存储器数据、获取用户位置等。
如果应用声明需要这些危险权限,则必须在运行时明确告诉用户,让用户手动授予。
3. 权限组
Android 系统对所有的危险权限进行了分组,称为权限组 。属于同一组的危险权
限将自动合并授予,用户授予应用某个权限组的权限,则应用将获得该权限组下的所
有权限。
下面用代码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: " + " 获得权限" ); } } }