为什么需要有运行时权限?

大家都知道在Android6.0之前,权限在应用安装过程中只询问一次,以列表的形式展现给用户,如果点击取消(即不认可应用所申请的权限),则会取消应用的安装。而用户出于安装应用的需求,一般都会点击同意,而应用就有可能在后台进行一些非法操作。(同时,因为这个原因,应用可能会出现申请一大堆权限的情况,说不定以后有用呢,hhhhh)

而正是认识到这个问题,在Android6.0版本以后,推出了运行时权限功能。即用户不需要在安装应用的时候一次性授权,而是可以在应用的使用过程中对某一项权限进行授权。

当然并不是所有的权限都不需要手动动态申请,Android将权限分为了普通权限和高危权限。对于普通权限,系统会自动完成授权,我们只需要处理高危权限的授权即可。下面就是Android的危险权限表。

注意:表格中的每一个危险权限都属于一个权限组,我们在进行运行时权限处理时使用的是权限名,但当用户一旦同意授权,那么该权限所对应的权限组的所有其他权限都会被同时授权。

即一旦READ_CALENDAR被授权了,应用也有WRITE_CALENDAR权限了。

2.运行时权限处理

  对于运行在API23系统的应用,如果它的targetAPI大于等于23,则需要对运行时权限进行申请,否则会出现抛出异常,导致程序crash。

  而在现有的 代码中加入运行时权限处理也很简单,只需要在需要申请危险权限的地方嵌套权限申请的代码即可,下面就是一个典型的运行时权限申请的代码。

  

package com.pignet.runtimepermissiondemo;

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
private final static String CALL_PERMISSION=Manifest.permission.CALL_PHONE;
private final static int REQUEST_CODE_ASK_PERMISSIONS = 1; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnCall= (Button) findViewById(R.id.btn_call);
btnCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callWrapper();
}
});
} /**
* 若没有权限,则申请,否则调用call
*/
private void callWrapper() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
int hasCallPhonePermission = checkSelfPermission(CALL_PERMISSION);
//是否已经拥有指定权限
if(hasCallPhonePermission!=PackageManager.PERMISSION_GRANTED){ /**
* 检查是否需要弹出请求权限的提示对话框
* shouldShowRequestPermissionRationale(permission)默认返回false
* 当用户拒绝赋予权限后,返回值为true,这里的思路就是当用户拒绝了一次权限后
* 需要弹出一个提示框,告诉用户这个权限的用途,以更好地申请到权限
*/ if(shouldShowRequestPermissionRationale(CALL_PERMISSION)){
showMessageOKCancel("您需要允许拨打电话的权限", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(new String[]{CALL_PERMISSION},REQUEST_CODE_ASK_PERMISSIONS);
}
});
return; } requestPermissions(new String[]{CALL_PERMISSION},REQUEST_CODE_ASK_PERMISSIONS);
return;
}
call();
}else
call(); }
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(MainActivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
} /**
* 要完成的操作
*/
private void call() {
try{
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:110"));
startActivity(intent);
}catch (SecurityException e){
e.printStackTrace();
}
} /**
*
* @param requestCode 权限申请请求码 这边对应前面的1
* @param permissions 需要申请的权限
* @param grantResults 请求结果 -1:Denied 0:Granted
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode){
case 1:
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED)
call();
else
//当用户第一次选择拒绝授权后,再次申请权限时,这时授权对话框会多一个”不再提醒“的提示,如果选择了拒绝授权
//并且勾选了不再授权,那么在下次读取时就不会去申请授权,而是直接在回调中说明用户已经拒绝授权
//所以在这边给出提示,提示用户去“设置”里手动授权,或者可以发一个广播打开设置界面。
Toast.makeText(this,"您没有授予该权限,请在设置中打开授权",Toast.LENGTH_SHORT).show();
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
break;
}
} }

注意:正如前面提到的,申请了一个权限后,会获得这个权限组中的所有权限。

github地址:https://github.com/pignet/RuntimePermissionDemo

Android6.0-运行时权限处理的更多相关文章

  1. Android6.0运行时权限(基于RxPermission开源库)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在6.0以前的系统,都是权限一刀切的处理方式,只要用户安装,Manifest申请的权限都会被赋予,并且安装后权限也撤销不了. And ...

  2. Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...

  3. Android开发学习之路-Android6.0运行时权限

    在Android6.0以后开始,对于部分敏感的“危险”权限,需要在应用运行时向用户申请,只有用户允许的情况下这个权限才会被授予给应用.这对于用户来说,无疑是一个提升安全性的做法.那么对于开发者,应该怎 ...

  4. Android6.0运行时权限的处理Demo

    MainActivity.java package com.loaderman.permissionsdemo; import android.Manifest; import android.con ...

  5. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  6. Android 6.0+ 运行时权限

    1.权限被分为了普通和危险两种 2.打电话的Demo import android.Manifest; import android.app.Activity; import android.cont ...

  7. Android8.0运行时权限策略变化和适配方案

    版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.comAndroid8.0也就是Android O即将要发布了,有很多新特性,目前我们可以通过AndroidS ...

  8. Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架

    Android6.0执行时权限解析,RxPermissions的使用.自己封装一套权限框架 在Android6.0中,新添加了一个执行时的权限,我相信非常多人都已经知道了.预计也知道怎么用了,这篇博客 ...

  9. Android 6.0 运行时权限处理完全解析

    一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...

  10. Android 6.0 运行时权限处理完全解析 (摘抄)

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...

随机推荐

  1. Linux - 死锁现象

    一.死锁的概念: 1.死锁的现象描述: 在很多应用中,需要一个进程排他性的访问若干种资源而不是一种.例如,两个进程准备分别将扫描的文档记录到CD上.进程A请求使用扫描仪, 并被授权使用.但进程B首先请 ...

  2. 【转载】google搜索从入门到精通

    原文地址:http://www.cnblogs.com/helloIT/articles/5095668.html /***************************************** ...

  3. yii框架后台过滤器的使用 安全防护

    Yii过滤器简介 过滤器是一段代码,可被配置在控制器动作执行之前或之后执行.例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证:性能过滤器可用于测量控制器执行所用的时间. 一个 ...

  4. 简谈-Python的输入、输出、运算符、数据类型转换

    输出: 格式化输出: 看到了 % 这样的操作符,这就是Python中格式化输出. 换行输出: 在输出的时候,如果有 \n 那么,此时 \n 后的内容会在另外一行显示 输入: 在python2.7当中, ...

  5. webrtc学习笔记2(Android端demo代码结构)

    最近正在修改webrtc的Android端demo和服务器交互的内容,介绍一下demo的大体结构吧,以便能快速回忆. 环境:Android5.0以上.libjingle_peerconnection_ ...

  6. ASP.Net零碎

    ASP.Net零碎 ServerPush 什么是ServerPush,服务器向客户端浏览器“推送”,其实就是“长连接”. 只有浏览器请求服务器端,服务器端才有给浏览器响应数据,不会主动向浏览器推送数据 ...

  7. office web apps 部署-搭建域控服务器

    开始第一条先说注意事项:我所配置的环境是用了三台2012server虚拟机,三台虚拟机必须要加下域控,而且登录操作的时候必须以域账号登录,否则测试不通过!在笔记本上搭建了两个虚拟机(window se ...

  8. VS2017使用 SQL Localdb问题两则

    VS2017使用 SQL  Localdb问题两则 来博客园不算短了,总是索取者.最近使用VS2017,遇到一些问题,在解决时总是找不到拿来就能用的解决方案,在多方寻找,自行探索下,总算圆满解决,在这 ...

  9. 转csdn-css4

    http://www.csdn.net/article/2015-03-06/2824127-css4

  10. 用ArrayList(解决约瑟夫问题)

    约瑟夫问题(Josephus problem)又称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,约瑟夫问题类似问题又称为约瑟夫环."丢手绢问题". 据 ...