Android 新动态Android开发经验谈Android开发

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("权限被禁止,无法获取手机里图片");   
     }    
}}

不知道怎么回事,贴出来的代码在编辑器里面会这么乱,下面附上个截图


代码截图
上一篇下一篇

猜你喜欢

热点阅读