文档章节

EasyPermisson 动态权限使用例子

yale8848
 yale8848
发布于 2017/01/24 14:54
字数 662
阅读 24
收藏 0

Android 6.0起权限管理更严格了,朝着IOS权限靠拢了。看来Android也慢慢朝着封闭的方向发展了。如果 targetSdkVersion <23,就没有动态权限问题,但这不是长久之计,迟早要适配的。

Android将权限分为3种:

  • 普通权限(Normal Permissions)
  • 危险权限(Dangerous Permissions)
  • 特殊权限(Special Permissions)

如果 targetSdkVersion>=23 那么就要对 危险权限和 特殊权限动态申请

危险权限(Dangerous Permissions)

Permission Group Permissions
CALENDAR READ_CALENDAR <br/>WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS <br/>WRITE_CONTACTS <br/>GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION <br/>ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE<br/> CALL_PHONE <br/>READ_CALL_LOG <br/>WRITE_CALL_LOG <br/>ADD_VOICEMAIL USE_SIP <br/>PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS <br/>RECEIVE_SMS <br/>READ_SMS<br/> RECEIVE_WAP<br/>_PUSH RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE<br/> WRITE_EXTERNAL_STORAGE

危险权限基本都涉及到用户的隐私,Android系统将这些危险权限分为9组,

获取分组中某个权限的同时也就获取了同组中的其他权限

危险权限不仅需要在 AndroidManifest.xml中注册,还需要动态的申请权限

EasyPermisson 是Google对动态权限申请的封装,Google出品必属精品;

添加依赖

dependencies {
    compile 'pub.devrel:easypermissions:0.2.1'
}

AndroidManifest添加权限

<manifest>
<uses-permission android:name="android.permission.CAMERA" />
</manifest>

添加实现(以相机权限为例子)



public class MainActivity extends AppCompatActivity implements  EasyPermissions.PermissionCallbacks{


    private static final String TAG="tag";
    private static final int CAMERA_PERM = 0x100;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        grantCamera();
    }

    private void openCamera(){

    }
    @AfterPermissionGranted(CAMERA_PERM)
    private void grantCamera() {
        if (EasyPermissions.hasPermissions(MainActivity.this, Manifest.permission.CAMERA)) {
            //有此权限

            openCamera();
            
        } else {//没有此权限,需要重新申请
            EasyPermissions.requestPermissions(this, "请求camera权限", CAMERA_PERM, Manifest.permission.CAMERA);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
     
       Log.d(TAG,"success");
    }

    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {

            new AppSettingsDialog.Builder(this, "点击确定去设置界面设置权限")
                    .setTitle("Title")
                    .setPositiveButton("确定")
                    .setNegativeButton("取消", null /* click listener */)
                    .setRequestCode(requestCode)
                    .build()
                    .show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CAMERA_PERM) {//从设置权限界面返回
            if (EasyPermissions.hasPermissions(MainActivity.this, Manifest.permission.CAMERA)){

            }
        }
    }
}


@AfterPermissionGranted(CAMERA_PERM)注解是在用户同意授权后EasyPermissions再次回调注解的函数;AppSettingsDialog 是googgle封装的直接跳转到设置权限界面dialog;

特殊权限(Special Permissions)

Special Permissions
SYSTEM_ALERT_WINDOW 设置悬浮窗
WRITE_SETTINGS 修改系统设置

特殊权限比危险权限更危险,特殊权限需要在manifest中申请并且通过发送Intent让用户在设置界面进行勾选.


public class MainActivity extends AppCompatActivity implements  EasyPermissions.PermissionCallbacks{

    private static final int SYSTEM_ALERT_WINDOW_PERM = 0x101;
    private static final int WRITE_SETTINGS_PERM = 0x102;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        grantAlertWindow();
        grantWriteSettings();
    }

    private void grantAlertWindow(){
          Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
         intent.setData(Uri.parse("package:" + getPackageName()));
         startActivityForResult(intent, SYSTEM_ALERT_WINDOW_PERM);
    }

    private void grantWriteSettings(){
         Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
         intent.setData(Uri.parse("package:" + getPackageName()));
      startActivityForResult(intent, WRITE_SETTINGS_PERM );
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == SYSTEM_ALERT_WINDOW_PERM) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
               if ( Settings.canDrawOverlays(this)){//get

               }
            }
        }else if (requestCode == WRITE_SETTINGS_PERM) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (Settings.System.canWrite(this)) {//get

                }
            }
        }
    }
}

© 著作权归作者所有

上一篇: Linux 安装Node
下一篇: JVM远程监控
yale8848
粉丝 14
博文 106
码字总数 24894
作品 0
西安
程序员
私信 提问
项目需求讨论 - 动态权限申请分析及相关第三方库源码分析

hi,又到了我们具体开发时候遇到的项目需求讨论了。 在具体项目开发中,关于Android的动态申请权限的功能,我想大家都见怪不怪了。很多人开发的app中也都使用过这块需求。 PS:本文我写的比较...

青蛙要fly
2017/09/28
0
0
Android 6.0 运行时权限处理

运行时权限介绍 Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上, 又新增了运行时权限动态检测,以下权限都需要在运行时判断: 身体传感器日历摄像头通讯录地理位置麦克风电话...

让代码飞一会
2016/02/23
1K
0
新特性解读 | MySQL 8.0 动态权限

原创: 杨涛涛 背景 在了解动态权限之前,我们先回顾下 MySQL 的权限列表。 权限列表大体分为服务级别和表级别,列级别以及大而广的角色(也是MySQL 8.0 新增)存储程序等权限。我们看到有一...

爱可生
07/10
43
0
Java基础之反射

image 前言 所谓工欲善其事必先利其器,只有把脚下的每一步走好,才能走的更远,只有把地基打的牢固,才能盖的更高。今天我来给大家讲讲java中的反射,如有错误请指出。 概述 反射(Reflect...

努力的右先生
2017/11/07
0
0
Android6.0动态权限适配&XMPermissions

Android6.0动态权限 简介 从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要...

静默加载
2018/09/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前端面试题汇总

一. HTML常见的兼容性 1.HTML5 标签在低版本浏览器不兼容 解决办法:使用html5shiv库,引入下列语句 <!--[if lte IE 8]> <script src="https://cdn.bootcss.com/html5shiv/r29/html5.js"></sc......

蓝小驴
21分钟前
3
0
OSChina 周四乱弹 —— 我气的脸都黑了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐《Red Battle》- 高橋李依 / 豊崎愛生 《Red Battle》- 高橋李依 / 豊崎愛生 手机党少年们想听歌,请使劲儿戳(这里) @丶Lion ...

小小编辑
34分钟前
399
19
找OSG教程, B站就有

https://www.bilibili.com/video/av64849038?from=search&seid=11632913960900279653

洛克人杰洛
55分钟前
5
0
学习记录(day07-Vue组件、自定义属性、自定义事件)

[TOC] 1.1.1什么是组件 一个vue文件就是一个组件 组件将html标签/css样式/对应JS打包成一个整体,也可以理解钻进一个具有样式和特效的自定义标签。 一、编写组件(提供方)<template> <di...

庭前云落
今天
5
0
使用Prometheus监控SpringBoot应用

通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用。(本文以SpringBoot 2.1.9.RELEASE 作为监控目标) 编码 添加依赖 使...

JAVA日知录
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部