Android 6.0 新特性之 RunTime Permissions
来源:互联网 发布:知乎 离火得花 编辑:程序博客网 时间:2024/06/06 03:24
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 permission和dangerous 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”)方法,这次文件会被成功创建
- Android 6.0 新特性之 RunTime Permissions
- Android 6.0新特性之Runtime Permission
- android 6.0 Runtime Permissions Check
- Android官方资料--Runtime Permissions
- Android官方资料--Runtime Permissions
- Android 6.0 Runtime Permissions运行权限学习笔记
- Android 6.0新特性之Doze模式
- Android 6.0新特性之 权限管理
- Android 6.0新特性之Doze模式
- Android 6.0新特性之Doze模式
- Android 运行时权限 Runtime Permissions
- Android之4.0新特性
- Android新特性之二
- Android 6.0新特性
- Android 6.0新特性
- Android 6.0 新特性
- Android 6.0 新特性
- android 6.0 新特性
- Linux查看CPU和内存使用情况
- iPhone忘记密码的找回
- Android之DatePickerDialog用法(日历的用法)
- haproxy 4层负载
- Requesting JavaScript AST from selection
- Android 6.0 新特性之 RunTime Permissions
- Linux查看文件编码格式及文件编码转换
- Oracle死锁问题分析解决
- Ubuntu解决make menuconfig错误
- magento create new locale
- Kotlin 基本语法
- 极光推送
- ace+vs2015开发
- Hadoop2安装-伪分布模式