美文网首页AndroidAndroid进阶之路6.0
一行代码搞定漂亮的Android6.0权限申请界面

一行代码搞定漂亮的Android6.0权限申请界面

作者: 时光与梦s | 来源:发表于2017-05-11 23:22 被阅读13412次

    概述

    随着Android6.0的普及,权限申请也变成了我们开发中必写的一段代码。比如sd卡权限、定位权限、拍照权限,这些几乎都是每个app必备的。而一般情况下我们都会在需要权限之前申请,然后各种判断。那既然是一些必备的是权限,我们为何不在我们一次打开app的时候就把这个全部都申请了呢?可是一下申请那么多权限对用户来说显然不是很友好,所以我们不妨在申请权限之前告诉一下用户,好让用户有个心理准备。于是借鉴了饿了么的权限申请界面,封装了一个库

    效果

    效果图

    项目地址

    https://github.com/yewei02538/HiPermission

    过程

    在申请权限的过程中难免会遭到用户无情的拒绝,那么就会弹出提示告诉用户这是必备的,你必须得同意!如果用户再一次手抖选择拒绝,那么我们会指引用户去权限管理里面打开我们的权限,如果还是拒绝那么..我特么真没辙了!!!

    使用

    Gradle:

    compile 'me.weyye.hipermission:library:1.0.7'
    

    Or Maven:

    <dependency>
      <groupId>me.weyye.hipermission</groupId>
      <artifactId>library</artifactId>
      <version>1.0.7</version>
      <type>pom</type>
    </dependency>
    

    一行代码搞定

    HiPermission.create(context)
        .checkMutiPermission(new PermissionCallback() {
            @Override
            public void onClose() {
                Log.i(TAG, "onClose");
                showToast("用户关闭权限申请");
            }
    
            @Override
            public void onFinish() {
                showToast("所有权限申请完成");
            }
    
            @Override
            public void onDeny(String permisson, int position) {
                Log.i(TAG, "onDeny");
            }
    
            @Override
            public void onGuarantee(String permisson, int position) {
                Log.i(TAG, "onGuarantee");
            }
        });
    

    就这样轻松搞定三个必备的权限

    你想申请别的权限?那也没问题

    List<PermissonItem> permissonItems = new ArrayList<PermissonItem>();
    permissonItems.add(new PermissonItem(Manifest.permission.CAMERA, "照相机", R.drawable.permission_ic_memory));
    permissonItems.add(new PermissonItem(Manifest.permission.ACCESS_FINE_LOCATION, "定位", R.drawable.permission_ic_location));
    HiPermission.create(MainActivity.this)
                .permissions(permissonItems)
                .checkMutiPermission(...);
    

    自定义主题

    什么?想改下提示信息?界面不符合你的主题颜色?so easy

    HiPermission.create(MainActivity.this)
                .title("亲爱的上帝")
                .permissions(permissonItems)
                .filterColor(ResourcesCompat.getColor(getResources(), R.color.colorPrimary, getTheme()))//图标的颜色
                .msg("为了保护世界的和平,开启这些权限吧!\n你我一起拯救世界!")
                .style(R.style.PermissionBlueStyle)
                .checkMutiPermission(...);
    

    设置主题后一定要调用filterColor(),否者权限图标会变成默认的黑色

    styles.xml

        <style name="PermissionBlueStyle">
            <item name="PermissionTitleColor">@color/colorPrimaryDark</item>
            <item name="PermissionMsgColor">@color/colorPrimary</item>
            <item name="PermissionItemTextColor">@color/colorPrimary</item>
            <item name="PermissionButtonBackground">@drawable/shape_btn</item>
            <item name="PermissionBackround">@drawable/shape_bg_white</item>
            <item name="PermissionButtonTextColor">@android:color/white</item>
        </style>
    
    效果图

    默认图标

    如果你需要申请其他权限,但是没有图标?HiPermission已经给你准备好啦~

    日历 相机 联系人 定位
    drawableId permission_ic_calendar permission_ic_camera permission_ic_contacts permission_ic_location
    麦克风 手机 短信 存储 传感器
    drawableId permission_ic_micro_phone permission_ic_phone permission_ic_sms permission_ic_storage permission_ic_sensors

    使用图标

    List<PermissonItem> permissons = new ArrayList<PermissonItem>();
    //使用图标
    permissons.add(new PermissonItem(Manifest.permission.CALL_PHONE, getString(R.string.permission_cus_item_phone), R.drawable.permission_ic_phone));
    HiPermission.create(MainActivity.this)
            .permissions(permissons)
            .style(R.style.PermissionDefaultGreenStyle)
            .checkMutiPermission(...);
    

    图标默认是黑色,需要调用filterColor()更改图标颜色

    默认主题

    当然,目前有3种默认的主题和动画

    Screenshot Screenshot Screenshot
    styleId PermissionDefaultNormalStyle PermissionDefaultGreenStyle PermissionDefaultBlueStyle
    AnimId PermissionAnimFade PermissionAnimModal PermissionAnimScale

    主题默认不带动画,需自己手动设置,像这样

    HiPermission.create(MainActivity.this)
                            .title(getString(R.string.permission_cus_title))
                            .permissions(permissons)
                            .msg(getString(R.string.permission_cus_msg))
                            .animStyle(R.style.PermissionAnimModal)//设置动画
                            .style(R.style.PermissionDefaultGreenStyle)//设置主题
                            .checkMutiPermission(...);
    

    如果你想改style的个别属性,你可以在你的style里面继承某个style重写某个属性,像这样

        <style name="CusStyle" parent="PermissionDefaultGreenStyle">
            <item name="PermissionBgFilterColor">#75D175</item>
        </style>
    

    效果

    以下是每个属性的解释

    属性名 类型 解释
    PermissionTitleColor int 标题文字颜色
    PermissionMsgColor int 描述文字颜色
    PermissionItemTextColor int 权限文字颜色
    PermissionButtonTextColor int 按钮文字颜色
    PermissionButtonBackground drawable 按钮背景
    PermissionBackround drawable 对话框背景
    PermissionBgFilterColor int 背景过滤色
    PermissionIconFilterColor int 图标颜色

    如果设置主题后不想调用filterColor()可在你的style里面添加PermissionIconFilterColor属性

    注意

    清单文件一定要注册申请的权限,不然申请后会默认拒绝,而且设置-权限管理界面也无法看到此权限

    以下原因不会弹框

    • 6.0以下版本(系统自动申请)
    • 暂时发现vivo、oppo、魅族的6.0以上版本

    因为这些厂商修改了6.0系统申请机制,他们修改成系统自动申请权限了。也就是说这些系统会跟以前 6.0 以下的版本一样,需要用到权限的时候系统会自动申请,就算我们主动申请也是没用的(我拿饿了么测试也没弹出权限框)

    最后

    如果这个对你有用,不妨来个star?

    相关文章

      网友评论

      • 随机取名的:看到评论中有很多错误,不知道是不是都解决了。
      • 爱在记忆消失前:系统的那个弹窗能不能干掉。。。。
      • Android轮子哥:要是HiPermission用不了,可以看看这个 https://www.jianshu.com/p/c69ff8a445ed
      • 842e8faf4b3e:up主,华为mate9 不弹出权限申请框,而当前页面直接崩掉是什么情况呢?
      • cd4a1aba772c:Android 8.0有错误,大神能不能发布到新版本依赖。万分感谢啦!!!
        https://www.jianshu.com/p/d0d907754603
      • 8df22891b476:checkMutiPermission() 应该是 Multi。。。
      • 692292146a45:hipermission存在bug先同意之后如果手动去取消权限再返回应用界面程序就anr了
      • ca92f0d03330:大佬,我现在用的是魅族X,安卓系统版本是6.0.1的,现在是想要获取wifi列表,但是得到这个列表需要用到ACCESS_FINE_LOCATION,ACCESS_COARSE_LOCATION这两个权限,我看了资料发现6.0以上的权限需要动态申请,于是就写了动态申请的代码,但是一直都没给我弹窗申请权限,但是我安装其他应用的时候会弹出申请权限的框。按照您文章里说的魅族6.0以上是系统自动申请,就跟6.0以下的写法一样,去掉动态申请,只写在manifest中,还是无法访问wifi列表。目前只有打开GPS的开关,才能访问wifi列表。请问您能给点思路吗?
      • 93eaa63f4bc0:Up,这个东西在小米5SPlus上有个问题,第一次安装弹窗申请5个权限,全部显示了,点击下一步后,发现只有4个权限的请求,漏掉了一个。默认还被拒绝了。
        93eaa63f4bc0:Debug看了下,代码没问题,传递过去确实是5个,可能是CAMERA权限和RECORD_AUDIO 权限的问题。
      • __Berial___:MIUI 设置 -> 权限管理 -> 应用权限管理,设置成拒绝,即使打开权限也不能用对应的功能,怎么解?
      • 你在笑吗:我按照demo写完没有弹框直接走onFinish():worried:
      • 安久哲丶_1ab2:大神好,框架很不错.想问一下申请权限回调方法中的onDeny和onGuarantee这两个方法的作用和参数意思
      • 8c16cd9954ab:楼主 你的github上导入不了啊 我这边权限问题很严重 6.0以上一片红 完全不知道怎么办了 您有空么 麻烦加下我qq1005512526
      • 0665d353ac92:楼主 使用小米手机做测试的时候定位权限开启失败=。= 拍摄图片的时候还有二次权限申请
      • jiangbin1992:牛逼了我的亲
      • a7faa921c612:先拒绝权限然后在系统设置权限管理里面手动打开 回到app后,权限不好使是什么原因
      • 周晓川:小米5s手机,获取权限之后,进入首页却总是一直显示定位失败缺少定位权限(其实定位权限早已打开)
      • winelx:位置信息权限怎么给了定位还说没有给呢?1.0.7版本,匪夷所思(米5s):smile:
        时光与梦s:@winelx 清单也要注册定位权限哦,如果允许了还是不行 ,你看下权限管理里你的应用定位权限是否已打开
      • 76dd2388602b:依赖找不到类import me.weyye.hipermission.PermissionItem;

        下载库找不到Build.VERSION_CODES.M

        你们是怎么成功的,直接下载作者的demo?
      • 76dd2388602b:你们能用?我无论依赖还是下载lib库,都不能用
      • 修得养得梦得过得:( ^_^ )不错嘛
      • f66a190500cc:先马上,回头看看源码再说话。
      • 周晓川:点赞!!
      • robinxdroid:下载了demo,看着不错。有个建议,弹窗的UI的圆角与下一步按钮的圆角可以改小一点,参考MaterialDesign,这么大的圆角太土了
        时光与梦s:嗯嗯,谢谢你的建议,我来看下:blush:
      • sorgs: <style name="PermissionBlueStyle">
        <item name="PermissionTitleColor">#ffffff</item>
        <item name="PermissionMsgColor">#ffffff</item>
        <item name="PermissionItemTextColor">@android:color/white</item>
        <item name="PermissionButtonBackground">@drawable/shape_btn</item>
        <item name="PermissionBackround">@drawable/shape_</item>
        <item name="PermissionButtonTextColor">#ffffff</item>
        </style>

        我已经这么改了,但是什么所有的文字的颜色还是不是白的呢?
        时光与梦s:@sorgs_0414 :flushed:调用HiPermission的style()了吗?
      • 轻微:录制应该使用原生的rom .
        时光与梦s:原生rom没有录制功能,所以就用华为手机录制了,正好测下兼容性:smirk:
      • 佛系programer:权限申请成功后界面没有反应,就像卡住一样,要按返回键才能继续操作,不知道什么原因,小米5
        时光与梦s:@请叫我Mr_He 已解决,改下版本号就可以了。唉,忘记finish了,抱歉:pensive:
      • 一个人走下去:用手机测试 不弹框是什么原因
        一个人走下去:@时光与梦s 好的 多谢啦
        时光与梦s:@一个人走下去 在回调里面打下log,看会不会走onFinish 。因为申请的权限如果都开启了就不会弹框了
      • sorgs:老铁,为什么存储空间不申请呢?
        每次都是自动跳过了,然后说我没有申请
        时光与梦s:@sorgs_0414 开启了就不会申请了呀,你看下设置里面app的存储权限是否已经开启了
      • BKQ_SYC:你这个好像6.0以下就不检测权限,如果用户强制把权限关了,你这就直接returen,然后回到onfinish了,这样不对吧
        BKQ_SYC: @时光与梦s 以前是不多,现在rom定制化,像小米魅族什么的都能自己手动关权限,而且还不知道怎么检测,,,,忧伤
        时光与梦s:@frag 这个也是哦,因为当时想的是6.0以下都是自动申请权限,所以就没管直接return。不过这种情况比较少,这个问题我来改下哈
      • iszengmh:哦,大神耶
        时光与梦s:@zengmianhui 夸张了,我是彩笔:flushed:。一起学习:blush:
      • JJoom:老哥,不知道饿了么的权限处理有问题吗?还借鉴饿了么的
        时光与梦s:@JJoom 刚试下了微信和QQ,关掉QQ的权限他会重启app,但是关掉微信的权限确实是没有一点变化都没有,这个确实是让人匪夷所思啊
        JJoom: @JJoom 对的,就是这个问题,eleme没有捕获这个crash,微信那些都是做了的,就是不知道他们是怎么做的
        时光与梦s:能具体说下什么问题吗?我现在暂时发现一个问题:用户去手机权限管理界面把这个app的权限手动关掉,而此时如果这个app在运行,那么这个app会被杀死,切换到这个app会发现重启了。这个好像是系统的一个机制,上次看到一篇博客分析过这个问题,暂时也没有方法可以解决。我们唯一能做的就是保存Activity中的数据,这样返回Activity就不会出现crash。
      • 0400abbf637a:楼主,录制gif的软件能分享下吗?
        Jaycee88:录制gif参考这个:http://www.jianshu.com/p/b262fb29b3fa
        0400abbf637a:@时光与梦s :heart:
        时光与梦s:其实我是使用的华为手机自带的录屏,然后将这个视频转成Gif,推荐一个转gif的网站:http://ezgif.com/,压缩效果挺好的,质量也还行:blush:
      • 50c8dc99c5fa:建议把跳转到设置的方法去掉, 兼容性不太好... 各个厂商的权限管理不太一样哦
        时光与梦s:@kingtami 哈哈 ,谢谢啦 。我在用其他手机测下:blush:
        50c8dc99c5fa:@时光与梦s 不过, 你说的那些用户应该都用的国产机...据我之前经验,华为 OPPO 锤子 魅族 等都是有自己的权限管理的, 我的 MIUI8倒是在设置界面可以看到权限管理.
        这块你又可以深入了解一下了:grin:
        时光与梦s:嗯,你说的对。不过还是不要去掉吧。。有的用户还真不知道怎么开,我try-catch下.:smiley:

      本文标题:一行代码搞定漂亮的Android6.0权限申请界面

      本文链接:https://www.haomeiwen.com/subject/rdzotxtx.html