Android M(API23) 中权限的处理
2016-05-19 本文已影响709人
船长cp3
图片来源网络
权限询问弹窗
代码截图
不知道各位在平时的开发中,有没有遇到过自己的应用在Android 6.0上的手机运调用相机、电话、本地存储读取等敏感权限会突然Crash的问题。明明自己在AndroidManifest.xml中已经添加了相关的uses-permission 为什么还会发生没有相关权限的错误,导致应用Crash呢?
原因是Android M对应用权限进行了更细分的管理,不像以前版本中,权限只在应用安装时提醒用户,如果用户同意安装该应用就是同意了所有权限,因此很多第三方rom和一些安全软件增加了权限管理功能来改进android系统这种粗放的权限管理方式。
那么我们在开发中应该怎样应对Android 高版本系统的这种改变呢。
这是最近做的一个项目在android版本6.0.1上安装后,会自动弹出该页面让用户进行权限的选择。这里我们都设为不允许。在项目中有个更改头像的功能,头像的图片是本地选取获取拍照获取。开始时这里并没有做过多的处理,进入获取本地照片的页面就会Crash。这里的处理办法是进行获取本地文件前,先检查应用有无改权限,没有的话弹窗询问用户是否允许该权限,再根据用户相应的操作做相应的处理。
权限询问弹窗
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void checkPermission() {
if (ContextCompat.checkSelfPermission(mContext,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//应用还未获取读取本地文件 的权限,询问是否允许
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}
,PERMISSON_STORGE);
}
else {
//已经有该权限,进入选取图片
selectPhoto();
}}
如何获取用户选择呢?
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSON_STORGE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
selectPhoto();
} else {
showToast("权限被禁止,无法获取手机里图片");
}
}}
不知道怎么回事,贴出来的代码在编辑器里面会这么乱,下面附上个截图
代码截图