Android6.0动态权限,你的项目关注到了吗?

一、引言

Android 6.0 变更
运行时权限
此版本引入了一种新的权限模式,如今,用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。
对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 checkSelfPermission() 方法。要请求权限,请调用新增的requestPermissions() 方法。即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。

二、示例

Android6.0动态权限,你的项目关注到了吗?_第1张图片
Android6.0权限.gif

说明:以访问系统日历为例,在Android6.0上申请系统权限。

三、说明

我们都知道,在Android5.0(包括5.0)以下我们的权限是在Manifest文件中申请即可。但是到了Android6.0就不是这样了。google对于权限问题要求更为严格了。将权限进行了如下划分:

正常权限和危险权限
系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:
正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限。
危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。

权限划分

Android6.0动态权限,你的项目关注到了吗?_第2张图片
这里写图片描述

四、步骤

 了解完权限,开始我们上面给出效果的步骤:

1,检查权限
要检查您是否具有某项权限,请调用 ContextCompat.checkSelfPermission() 方法。

2,申请权限
如果应用尚无所需的权限,则应用必须调用一个 requestPermissions() 方法,以请求适当的权限。应用将传递其所需的权限,以及您指定用于识别此权限请求的整型请求代码。此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同请求代码传递到 requestPermissions()。

3,处理权限请求响应
当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应。您的应用必须替换该方法,以了解是否已获得相应权限。回调会将您传递的相同请求代码传递给 requestPermissions()。

4、注意点:不要忘了同样需要在Manifest文件中申明相关权限;代码中的Manifest是系统中的类,不是我们项目的。

完整代码如下:

package com.example.code.android60authority;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

/**
 * Description:Android6.0动态申请权限
 * 

* Created by code小生 on 2016/12/30. */ public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); } private void initView() { setContentView(R.layout.activity_main); btn1 = (Button) findViewById(R.id.btn1); btn1.setOnClickListener(this); } @Override public void onClick(View view) { int id = view.getId(); switch (id) { case R.id.btn1: checkperm(); break; } } // 检查在日历中是否有读写权限 private void checkperm() { /** * 方法返回值为PackageManager.PERMISSION_DENIED * 或者PackageManager.PERMISSION_GRANTED。 * 当返回DENIED就需要进行申请授权了 */ int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "已被授予权限,continue", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "未权限,try request", Toast.LENGTH_SHORT).show(); if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) { // 在这里做需要权限的说明,根据需要来做 Toast.makeText(MainActivity.this, "需要此权限才可在6.0及以上系统拍照", Toast.LENGTH_SHORT).show(); } else { // 申请权限 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_CALENDAR}, 1001); } } } /** * 申请权限回调 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 1001: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "权限,apply sucess", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "权限,apply fail", Toast.LENGTH_SHORT).show(); } return; } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }

说明:核心代码都在这里了,布局就一个Button没啥值得贴的。注释很详细。


源码已上传至github,链接在公众号,关注查看更多。


Android6.0动态权限,你的项目关注到了吗?_第3张图片
这里写图片描述

QQ交流群:481794398

你可能感兴趣的:(Android6.0动态权限,你的项目关注到了吗?)