Android6.0动态权限,你的项目关注到了吗?
2016-12-30 09:33
417 查看
一、引言
Android 6.0 变更
运行时权限
此版本引入了一种新的权限模式,如今,用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。
对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 checkSelfPermission() 方法。要请求权限,请调用新增的requestPermissions() 方法。即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。
二、示例
说明:以访问系统日历为例,在Android6.0上申请系统权限。
三、说明
正常权限和危险权限
系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:
正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限。
危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。
权限划分
四、步骤
1,检查权限
要检查您是否具有某项权限,请调用 ContextCompat.checkSelfPermission() 方法。
2,申请权限
如果应用尚无所需的权限,则应用必须调用一个 requestPermissions() 方法,以请求适当的权限。应用将传递其所需的权限,以及您指定用于识别此权限请求的整型请求代码。此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同请求代码传递到 requestPermissions()。
3,处理权限请求响应
当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应。您的应用必须替换该方法,以了解是否已获得相应权限。回调会将您传递的相同请求代码传递给 requestPermissions()。
4、注意点:不要忘了同样需要在Manifest文件中申明相关权限;代码中的Manifest是系统中的类,不是我们项目的。
完整代码如下:
说明:核心代码都在这里了,布局就一个Button没啥值得贴的。注释很详细。
源码已上传至github,链接在公众号,关注查看更多。
QQ交流群:481794398
Android 6.0 变更
运行时权限
此版本引入了一种新的权限模式,如今,用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。
对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 checkSelfPermission() 方法。要请求权限,请调用新增的requestPermissions() 方法。即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。
二、示例
说明:以访问系统日历为例,在Android6.0上申请系统权限。
三、说明
我们都知道,在Android5.0(包括5.0)以下我们的权限是在Manifest文件中申请即可。但是到了Android6.0就不是这样了。google对于权限问题要求更为严格了。将权限进行了如下划分:
正常权限和危险权限
系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:
正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限。
危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。
权限划分
四、步骤
了解完权限,开始我们上面给出效果的步骤:
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动态申请权限 * <p> * 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,链接在公众号,关注查看更多。
QQ交流群:481794398
相关文章推荐
- Android6.0动态获取权限
- 关于android6.0动态权限造成的app crash问题
- 关于Android6.0权限管理 动态注册
- Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题
- android6.0动态获取权限
- shiro安全框架扩展教程--如何动态修改资源权限不需要重启项目
- Android6.0动态权限申请步骤以及需要注意的一些坑
- Android6.0 动态权限设置
- Android6.0动态权限申请步骤以及需要注意的一些坑
- Android6.0运行时权限处理(项目中使用到的一种形式,没有使用第三方库)
- Android6.0动态权限处理
- Android6.0 动态权限(Runtime Permission)
- Android6.0动态权限
- Android6.0权限之运行时动态授权
- android6.0以上版本动态获取权限
- Android6.0动态获取权限
- BOS项目练习(权限/角色/用户管理(CRUD),基于数据库实现动态授权,ehcache缓存权限,shiro标签,菜单权限展示)
- [置顶] Android6.0动态权限
- android6.0动态权限
- Android6.0 动态权限申请步骤以及需要注意的一些坑