简单几行代码申请权限

众所周知,在Android6.0以上增加了动态申请权限这玩意(targetSdkVersion >= 23)。
那么问题来了,what?when?how?

What:

在targetSdkVersion <23,当用户安装App时,App会索要了你手机的那些权限,并且给用一个列表进行展示,但是这些提示只是在安装是提示,只要你点击接受或者安装, 表示你允许这个应用在可以获取它申明的所有权限。一般很少有人在安装时,会因为看到某个应用因为申请了某一个敏感权限而放弃安装应用。(实力帮应用宝打广告)

旧权限显示.jpg

那么当用户使用过程中,正准备使用某个权限时,系统能及时的弹出一个提示框是否允许。然后用户结合当前应用判断,是否应该授予应用权限。nice。 这样对用户而言,完全是主动的,相比安装时那种选择,这样的做法无疑是对用户莫大的尊重,同时这也保证了用户的个人隐私。

权限弹出申请.png

故谷歌爸爸自然而然就产出了这个动态申请权限,虽然对于程序员来说多了一部分代码,但正如一句话所说尊重用户才会赢得用户

When:

不用想的好吗?你要用到权限的时候申请

How:

用到的API也不多就几个


上面说到对于用户是友好的,对于程序员是多增加了代码的,当然程序员都是懒惰的,那么一个良好的对申请封装是显得多么的重要与节省功夫、时间。
  1. 上GitHub搜一搜,大多数的封装都是直接在BaseActivity进行操作,不是说不可以,当然会存在一点耦合度。
  2. 还看到一个RxPermission,思想就是当下火火的Rx。也是相当不错。但问题又来了,假如项目中没有用到Rx呢?又要加入RxJava和RxAndroid两个库,显得有点不值得。
  3. 为了将代码从activity中抽离,同时为了在fragment(或者fragment中嵌套fragment)中申请权限不用进行繁琐的操作,故本次封装并没有选择在BaseActivity中进行封装。
    代码链接,看得欢喜欢迎给个star

简单使用,一个链式让你调下来(注:内部已进行版本判断,无需再进行判断)

PermissionsUtils mPermissionsUtils=new PermissionsUtils();

public void 申请(){
    mPermissionsUtils
                // 设置回调
                .setPermissionsListener(new PermissionsListener() {
                    // 申请的权限中有被拒绝的回调该方法,可以在此进行你的逻辑
                    // 由于某些rom对权限进行了处理,第一次选择了拒绝,则不会出现第二次询问(或者没有不再询问勾选),故拒绝就回调onDenied
                    @Override
                    public void onDenied(String[] deniedPermissions) {
                        // 在deniedPermissions里面包含了所有被拒绝的权限名字
                        for (int i = 0; i < deniedPermissions.length; i++) {
                            System.out(deniedPermissions[i] + " 权限被拒绝");
                        }
                    }

                    // 所有申请的权限同意了回调该方法,可以在此进行你的逻辑
                    @Override
                    public void onGranted() {
                        Toast.makeText(MainActivity.this, "所有权限都被同意", Toast.LENGTH_SHORT).show();
                    }
                })
                // 设置Activity,因为检查权限必须要有activity对象
                .withActivity(this)
                // 最后调用申请权限的方法
                // 三个参数分别是Object,int,String[]
                // 第一个参数对应的是activity或者fragment,如果是在activity中申请就传入activity对象,在fragment申请就传入该fragment对象,这是用于对返回事件的分发进行处理。
                // 第二个对应的是该次申请权限的requestCode
                // 第三个就是权限列表,不定长度
                .getPermissions(MainActivity.this,100, Manifest.permission.READ_CONTACTS);
                // 例如申请多个权限
                /*.getPermissions(MainActivity.this
                        , 100
                        , Manifest.permission.INTERNET
                        , Manifest.permission.READ_EXTERNAL_STORAGE
                        , Manifest.permission.READ_CALENDAR
                        , Manifest.permission.ACCESS_FINE_LOCATION);*/
}

// 在activity或者fragment中
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // 在onRequestPermissionsResult这个方法调用dealResult就可以了
        mPermissionsUtils.dealResult(requestCode, permissions, grantResults);
    }
主要方法 作用
getPermissions 进行权限申请,不带拒绝弹框提示
getPermissionsWithTips 进行权限申请,带拒绝弹框提示
dealResult 对申请权限返回结果进行处理
setPermissionsListener 设置回调
getAppDetailSettingIntent 跳转到本应用的设置界面

上面的getPermissionsWithTips是什么鬼?其实是对被拒绝权限后一个弹窗,免得大家重复写,可用可不用
怎么用?很简单,传入提示数组即可

mPermissionsUtils.getPermissionsWithTips(MainActivity.this
                        ,100
                        , new String[]{"人家要录音"
                                ,"我们需要读取你的信息,磨磨唧唧的"
                                ,"我要上网"
                                ,"我要读内存卡"
                                ,"我要看日历"
                                ,"我要定位"}
                        , Manifest.permission.RECORD_AUDIO
                        , Manifest.permission.READ_SMS
                        , Manifest.permission.INTERNET
                        , Manifest.permission.READ_EXTERNAL_STORAGE
                        , Manifest.permission.READ_CALENDAR
                        , Manifest.permission.ACCESS_FINE_LOCATION);

用户拒绝权限后效果图如下

我有问题要问

● 在6.0所有权限都需要申请?

曰:当然不是。只有属于危险权限的才需要申请。危险权限看下表1-2

● 那危险权限也很多啊,也要一个个申请?

曰:当然不是。你看看下面的表,都分好组了(9组),对于同一组内的权限,只要有一个被同意,其他的都会被同意。

表1-2危险权限分组

分组 名字 分割线 分组 名字
CALENDAR READ_CALENDAR PHONE READ_PHONE_STATE
WRITE_CALENDAR CALL_PHONE
CAMERA CAMERA READ_CALL_LOG
CONTACTS READ_CONTACTS WRITE_CALL_LOG
WRITE_CONTACTS ADD_VOICEMAIL
GET_ACCOUNTS USE_SIP
LOCATION ACCESS_FINE_LOCATION PROCESS_OUTGOING_CALLS
ACCESS_COARSE_LOCATION SMS SEND_SMS
MICROPHONE RECORD_AUDIO RECEIVE_SMS
SENSORS BODY_SENSORS READ_SMS
STORAGE READ_EXTERNAL_STORAGE RECEIVE_WAP_PUSH
WRITE_EXTERNAL_STORAGE RECEIVE_MMS

再次奉上九组权限

<!-- 危险权限 start -->
<!--PHONE-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.ADD_VOICEMAIL"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission android:name="android.permission.USE_SIP"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<!--CALENDAR-->
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<!--CAMERA-->
<uses-permission android:name="android.permission.CAMERA"/>
<!--CONTACTS-->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<!--LOCATION-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!--MICROPHONE-->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--SENSORS-->
<uses-permission android:name="android.permission.BODY_SENSORS"/>
<!--SMS-->
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/>
<uses-permission android:name="android.permission.RECEIVE_MMS"/>
<!--STORAGE-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 危险权限 Permissions end -->

代码逻辑非常简单,行数不多,注释也很全,直接去看源码就行
代码链接,看得欢喜欢迎给个star

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容