概述
随着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?
网友评论
https://www.jianshu.com/p/d0d907754603
下载库找不到Build.VERSION_CODES.M
你们是怎么成功的,直接下载作者的demo?
<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>
我已经这么改了,但是什么所有的文字的颜色还是不是白的呢?
每次都是自动跳过了,然后说我没有申请
这块你又可以深入了解一下了