Android6.0运行时权限

从 Android 6.0(API 级别 23)开始,用户在使用软件时向其授予权限,而不是在安装时授权。这个方法可以简化安装过程,用户在安装或者更新软件时不需要授予权限。它还能让用户对应用的功能进行控制。例如一个摄影应用,他使用摄像头权限是正常的,但是用户无法理解这个应用要读取联系人信息。

系统权限分为两类:正常权限跟危险权限

  • 正常权限不会直接给用户隐私权带来风险。在AndroidManifest.xml中注册就行。
  • 危险权限会授予应用访问用户机密数据的权限。在AndroidManifest.xml中注册了危险权限,同时需要用户授权您的软件才能使用这个权限。

誉为哪些属于正常权限,哪些属于危险权限,大家去官网阅读。

https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous

简单的例子(6.0手机获取危险权限)

如果我们的app需要一个调用拨打电话的功能,这个时候就需要获取CALL_PHONE权限。我们来看看在6.0的手机上拨打电话代码需要怎么写:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private String[] perms = {Manifest.permission.CALL_PHONE};
    private final int PERMS_REQUEST_CODE = 200;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn_call_phone).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_call_phone) {//获取拨打电话的权限
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {//Android 6.0以上版本需要获取权限
                requestPermissions(perms,PERMS_REQUEST_CODE);//请求权限
            } else {
                callPhone();
            }
        }
    }

    /**
     * 获取权限回调方法
     * @param permsRequestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {
        switch (permsRequestCode) {
            case PERMS_REQUEST_CODE:
                boolean storageAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                if (storageAccepted) {
                    callPhone();
                } else {
                    Log.i("MainActivity", "没有权限操作这个请求");
                }
                break;

        }
    }

    //拨打电话
    private void callPhone() {
        //检查拨打电话权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:" + "10086"));
            startActivity(intent);
        }
    }
}

获取权限之前先判断版本号,版本大于6.0,就调用requestPermissions方法请求权限。这个方法有两个参数,参数一是要请求的权限数组,一次可以请求多个权限。参数2是一个int类型的请求标示。不管用户同意或者拒绝都会回调onRequestPermissionsResult方法。这个方法的permsRequestCode参数就是我们请求时第二个参数,然后判断permsRequestCode数组的第一个参数。值等于PackageManager.PERMISSION_GRANTED就是用户同意授权。否则用户拒绝授权这个权限。

获取特殊权限

Android特殊权限只有两种:SYSTEM_ALERT_WINDOW和WRITE_SETTINGS,

与正常权限跟危险权限不同。特殊权限比较敏感,因此大多数应用不应该使用它们。如果某应用需要其中一种权限,必须在清单中声明该权限,并且发送请求用户授权的 intent。系统将向用户显示详细管理屏幕,以响应该 intent。

首先我们判断android版本号是不是大于6.0,通过Settings.canDrawOverlays判断有没有系统弹窗权限。如果没有权限发送一个intent请求请求授权。

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1){
    if (Settings.canDrawOverlays(this)) {
        systemAlert();
    } else {//没有系统弹窗权限,发送一个设置权限的intent
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, PERMS_REQUEST_CODE);
    }
}

重写onActivityResult方法,授权失败或者成功都会回调这个方法。在这里判断用户同意还是拒绝。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == PERMS_REQUEST_CODE) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //Android M 处理Runtime Permission
            if (Settings.canDrawOverlays(this)){//有系统弹窗权限
                Log.i("MainActivity","获取系统弹窗(特殊权限)成功");
                systemAlert();
            } else {
                Log.i("MainActivity","拒绝系统弹窗(特殊权限)");
            }
        }
    }
}

申请这么多权限岂不是很累?

其实你不需要每个权限都去申请,举一个例子,如果你的应用授权了读取联系人的权限,那么你的应用也是被赋予了写入联系人的权限。因为读取联系人和写入联系人这两个权限都属于联系人权限分组,所以一旦组内某个权限被允许,该组的其他权限也是被允许的。

注意

在代码中请求了运行时权限,但是在Manifest.xml文件中一定要记住注册权限。

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

效果图如下

源码下载

源码下载

时间: 2024-10-28 10:38:58

Android6.0运行时权限的相关文章

1.Android6.0运行时权限简介_2.Android6.0权限适配之WRITE_EXTERNAL_STORAGE(SD卡写入)3_.Android 6.0 运行时权限理解

Android6.0运行时权限简介:http://unclechen.github.io/2016/03/05/Android6.0%E8%BF%90%E8%A1%8C%E6%97%B6%E6%9D%83%E9%99%90%E7%AE%80%E4%BB%8B/ Android6.0权限适配之WRITE_EXTERNAL_STORAGE(SD卡写入):https://blog.csdn.net/xiechengfa/article/details/52699233 Android 6.0 运行时权

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

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 在6.0以前的系统,都是权限一刀切的处理方式,只要用户安装,Manifest申请的权限都会被赋予,并且安装后权限也撤销不了. Android 6.0 采用新的权限模型,只有在需要权限的时候,才告知用户是否授权:是在runtime时候授权,而不是在原来安装的时候 ,同时默认情况下每次在运行时打开页面时候,需要先检查是否有所需要的权限申请. 判断是否是需要运行时权限的标记就是targetSDKVersion. 当targetSDKVersi

Android6.0运行时权限管理

自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装的事情,也不会再不征求用户授权的情况下,就可以任意的访问用户隐私,而且即使在授权之后也可以及时的更改权限.这就是6.0版本做出的更拥护和注重用户的一大体现. 一.认知 今天我们就来学习下Android6.0的权限管理. Android6.0系统把权限分为两个级别: 一个是Normal Permiss

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

MainActivity.java package com.loaderman.permissionsdemo; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; impor

Android 6.0+ 运行时权限

1.权限被分为了普通和危险两种 2.打电话的Demo import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import andro

Android 6.0 运行时权限管理最佳实践

Android 6.0 运行时权限管理最佳实践 版权声明:转载必须注明本文转自严振杰的博客: http://blog.yanzhenjie.com 这是一篇迟来的博客,Android M已经发布一年多了(6.0的变化),在Android M中权限系统被重新设计,发生了颠覆性的变化,很多人把握不好这个变化,一是对这个权限策略和套路还没有摸透,二是没有一个很好的实践来支撑,在我的技术开发群里很多人问我关于权限的问题,往往我都没有直接回答,因为这个问题不是一两句说的清楚的,这几点是今天我写这篇博客的原

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

Android6.0执行时权限解析,RxPermissions的使用.自己封装一套权限框架 在Android6.0中,新添加了一个执行时的权限,我相信非常多人都已经知道了.预计也知道怎么用了,这篇博客非常easy.就是告诉大家怎样去申请执行时权限和RxPermission这个权限框架的使用.同一时候依据现有的技术封装思想,去封装一个自己可用的权限框架,好的,我们继续往下看 一.Android M 执行时权限介绍 关于Android M的更新变化,我就不啰嗦了,有兴趣的能够看下Android M更

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

一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html,其中当然包含Runtime Permissions. ok,本篇文章目的之一就是对运行时权限处理的一个介绍,以及对目前权限相关的库

Android 6.0 运行时权限处理

运行时权限介绍 Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,又新增了运行时权限动态检测,以下权限都需要在运行时判断: 身体传感器 日历 摄像头 通讯录 地理位置 麦克风 电话 短信 存储空间 运行时权限处理 Android6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,所以如果你以前的APP设置的targetSdkVersion低于23,在运行时也不会崩溃,但这也只是一个临时的救急策略,用户还是可以在设置中取