Runtime Permissions
在Android 6.0中谷歌摒弃了之前的install time permissions model取而代之的是runtime permissions model。先来说说install time permissions model,这个大家不陌生,就是当Android App安装的时候会向用户展示一坨权限,如果此时用户选择安装,则表示用户同意将这些权限赋予App,如果用户不同意那么这个App就会取消安装。runtime permissions model就牛逼了,在App安装的时候同样会向用户展示所需要的权限,并且在用户选择安装App的时候并不表示用户将这些权限赋予了App,而是需要App在运行阶段主动去申请这些权限。这样做的好处显而易见,App对权限的申请对于用户来说变得更加透明,而且用户对App权限的控制也更加灵活。

权限的分类
Android将系统权限分成了四个保护等级normal,dangerous,signature,signatureOrSystem,其中最常见的是normal permissiondangerous permission两类。

normal permission涵盖的一系列权限的共同点是:App需要访问App运行沙盒以外的数据或资源,但是这些资源对用户的隐私或其他App的危险性较小,下面列举一下这些权限:ACCESS_LOCATION_EXTRA_COMMANDSACCESS_NETWORK_STATEACCESS_NOTIFICATION_POLICYACCESS_WIFI_STATEBLUETOOTHBLUETOOTH_ADMINBROADCAST_STICKYCHANGE_NETWORK_STATECHANGE_WIFI_MULTICAST_STATECHANGE_WIFI_STATEDISABLE_KEYGUARDEXPAND_STATUS_BARFLASHLIGHTGET_PACKAGE_SIZEINTERNETKILL_BACKGROUND_PROCESSESMODIFY_AUDIO_SETTINGSNFCREAD_SYNC_SETTINGSREAD_SYNC_STATSRECEIVE_BOOT_COMPLETEDREORDER_TASKSREQUEST_INSTALL_PACKAGESSET_TIME_ZONESET_WALLPAPERSET_WALLPAPER_HINTSTRANSMIT_IRUSE_FINGERPRINTVIBRATEWAKE_LOCKWRITE_SYNC_SETTINGSSET_ALARMINSTALL_SHORTCUT

以上这些就是Android 6.0中所有的normal permissions了。

dangerous permissions 涵盖的一系列权限的共同点是:这些权限会读写用户的隐私信息,也可能会读写用户存储的数据或影响其他App的正常运行。下面例举出这些权限:

以上这些权限就是Android6.0中所有的dangerous permissions

实战

下面我们就以STORAGE组中的WRITE_EXTERNAL_STORAGE为例子,尝试在Android 6.0中使用runtime permission相关api。
我们要做的事情非常简单,在手机的存储设备上新建一个hello.txt。

1.在AndroidManifest文件中添加如下权限生命

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2.在MainActivity中添加如下方法:

 //在sdcard上新建一个名为fileName的文件    private void createFile(String fileName){        File sdcard = Environment.getExternalStorageDirectory();        File newFile = new File(sdcard,"/" + fileName) ;        if(!newFile.exists()){            try {                newFile.createNewFile();            } catch (IOException e) {                e.printStackTrace();            }        }    }

好的,如果没有runtime permissions这个概念的话,那其实这个功能已经完成了,我们来看看它在Android 6.0之前的版本上的运行情况,

首先是安装时的界面:

它提示用户该应用会修改会删除SD卡的内容,如果此时用户选择安装,那么也就是默认将WRITE_EXTERNAL_STORAGE这个权限赋予了该应用。

再来看运行结果:

看吧,文件直接就创建成功了,这样真的是很危险的。

接下来再在Android6.0的机子上安装这个应用,安装截图如下:

这个安装界面和之前的一样,也是向用户展示了App所涉及的权限。

下面看运行结果:

这里就出问题了,log显示App没有权限在SD卡上创建文件。这里要再讲一下runtime permissions原理

对于权限分类中的**dangerous permissions**,**runtime permissions**要求App在运行的时候做权限请求,某则App则无法获得相应请求。

接下来看一下怎么在代码中进行权限的申请:

public static final int EXTERNAL_STORAGE_REQ_CODE = 10 ;    public void requestPermission(){        //判断当前Activity是否已经获得了该权限        if (ContextCompat.checkSelfPermission(this,                Manifest.permission.WRITE_EXTERNAL_STORAGE)                != PackageManager.PERMISSION_GRANTED) {            //如果App的权限申请曾经被用户拒绝过,就需要在这里跟用户做出解释            if (ActivityCompat.shouldShowRequestPermissionRationale(this,                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {                Toast.makeText(this,"please give me the permission",Toast.LENGTH_SHORT).show();            } else {                //进行权限请求                ActivityCompat.requestPermissions(this,                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},                        EXTERNAL_STORAGE_REQ_CODE);            }        }    }

当进行权限申请,并且用户做出选择后会回调onRequestPermissionsResult这个方法,在这个方法中做相关处理

@Override    public void onRequestPermissionsResult(int requestCode,                                           String permissions[], int[] grantResults) {        switch (requestCode) {            case EXTERNAL_STORAGE_REQ_CODE: {                // 如果请求被拒绝,那么通常grantResults数组为空                if (grantResults.length > 0                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    //申请成功,进行相应操作                    createFile("hello.txt");                } else {                    //申请失败,可以继续向用户解释。                }                return;            }        }    }

到这里runtime permissions的权限申请操作就结束了,我们看一下效果

允许后会再次调用createFile(“hello.txt”)方法,这次文件会被成功创建

更多相关文章

  1. 在Eclipse上搭建Android(安卓)2.3环境
  2. 又见Android开发环境搭建
  3. "奇葩家园“之genymotion工具篇
  4. Android(安卓)6.0 Permission
  5. Ubuntu 10.04 LTS 安装 sun-java6-jdk 错误解决办法
  6. Android(安卓)监听屏幕锁屏,用户解锁
  7. android请求权限
  8. 使用ThinkAndroid快速开发框架需要有以下权限
  9. android 静默安装并自启

随机推荐

  1. 为什么有的程序在64位机上跑反而比32位机
  2. Android Animation --- 无限360度旋转
  3. 给自己的项目做极光推送的步骤
  4. 如何为后台工作创建绑定服务(Xamarin)
  5. Android开发 处理拍照完成后的照片角度
  6. 关于android中sharedpreferences数据不更
  7. android面试题总结
  8. Android开发-直播视讯(3)-创建一个Ubuntu
  9. findViewById()返回布局XML中自定义组件
  10. 基于Android6.0的RIL底层模块分析