Skip to content

android 权限库,简单好用 👍 完美兼容 AndroidX 和 android 库,欢迎使用~~~

License

Notifications You must be signed in to change notification settings

bugyun/MissPermission

Repository files navigation

MissPermission

android 权限库,超级简单好用!!

注:原 MissPermissionHelper 不在维护,但是可以继续使用,可以升级到 pro 版本

简化版

MissPermission pro版

简化操作帮助类,很少的代码就可以获取权限。

不混淆 30K 代码体积!👍~

混淆之后 18K 代码体积!👍~

下载apk

版本变化

  • 1.0.0 : 优化代码
  • 1.0.1 : 优化流程,增加真实检测权限方法,优化不必要的代码
  • 1.0.2 : 优化图片大小,体积减小50%
  • 1.0.3 : 增加设置显示的dialog的回调方法,方便设置监听
  • 1.0.4 : 增加不用传递上下文的with()方法,需要先注册,兼容以前的版本

配置

implementation 'vip.ruoyun.permission:miss-pro:1.0.4'

准备工作

在 AndroidManifest.xml 文件中添加你想要添加的权限

<manifest>
    ...
    //添加自己要使用的权限,如果不添加,那么请求这个权限会一直不成功
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />

    ...
</manifest>

使用

PermissionRequest 方法说明

request.getPermissionList();//此请求的所有权限
request.getDeniedPermissionList();//拒绝的权限
request.getAgreePermissionList();//同意的权限
request.getContext();//上下文
request.isAlwaysDenied();//是否总是拒绝
request.isOver23();//sdk 是否超过 23 (6.0)
request.nextStep();//下一步请求权限。实质是请求权限
request.requestPermissionsAgain();//再次请求权限

检查权限

通过系统的api来检查权限,可能在低端机型(6.0以下)中的结果不准确。

boolean isHasReadCalendarPermission = MissPermission.check(this, new String[]{Manifest.permission.READ_CALENDAR});
if (isHasReadCalendarPermission) {
    //有权限
} else {
    //没有权限
}

真实的检测权限,实际调用该权限对应的功能来确定是否可以使用该权限。

boolean isHasPermission = MissPermission.realCheck(this, Manifest.permission.READ_SMS);
if (isHasPermission) {
    //有权限
} else {
    //没有权限
}

回调方法

  • with(context) 函数,构建请求
  • with() 函数,构建请求,需要 MissPermission.register(application)
  • permission(string) 来添加请求权限
  • prompt(boolean) 是否要显示提示
  • title(strint) 提示框标题
  • msg(string) 提示框信息
  • style(int) 提示框样式
  • action(IAction) 修改提示框的流程,可以自定义,DefaultAction为默认弹框流程
  • check(PermissionListener) 权限监听回调

通过with(context)来构建

MissPermission.with(this)
            .permission(Manifest.permission.SEND_SMS)//
            .permission(Manifest.permission.RECEIVE_SMS)//
            .permission(Manifest.permission.READ_SMS)//
            .permission(Manifest.permission.ACCESS_FINE_LOCATION)//
            .permission(Manifest.permission.CAMERA)//
            .permission(Manifest.permission.READ_CONTACTS)//
            .permission(Manifest.permission.WRITE_CALENDAR)//
            .permission(Manifest.permission.READ_CALL_LOG)//
            .permission(Manifest.permission.READ_CONTACTS)//
            .permission(Manifest.permission.RECORD_AUDIO)//
            .permission(Manifest.permission.BODY_SENSORS)//
            .permission(Manifest.permission.SEND_SMS)//
            .permission(Manifest.permission.WRITE_EXTERNAL_STORAGE)//
            .prompt(true)    //是否要显示提示
            .msg("为了您正常使用应用,需要以下权限")
            .title("亲爱的用户")
            .style(R.style.MissPermissionDefaultNormalStyle)//设置样式
            .action(new DefaultAction() {//修改权限弹框的动作
                @Override
                public void onActivityResult(int resultCode, Intent data) {
                    //监听打开权限界面返回来的回调
                    //可以在这里进行权限的再次判断,判断是否用户已经同意了权限
                }

                //可选,初始化请求弹窗的时候,可以通过此方法设置监听
                @Override
                public void onCreateRequestPromptDialog(RequestPromptDialog requestPromptDialog) {
                }

                //可选,初始化总是拒绝此权限时的弹窗的时候,可以通过此方法设置监听
                @Override
                public void onCreateAlwaysDeniedDialog(AlwaysDeniedDialog getAlwaysDeniedDialog) {
                }

                //可选,初始化再次请求权限的弹窗的时候,可以通过此方法设置监听
                @Override
                public void onCreateAgainRequestDialog(AgainRequestDialog getAgainRequestDialog) {
                }
            })
            .check(new PermissionListener() {
                @Override
                public void onSuccess(PermissionRequest request) {

                }

                @Override
                public void onFailure(PermissionRequest request) {

                }
            });

通过with()来构建,不需要传递上下文,需要先注册MissPermission.register(application),如果没有注册,会在 onFailure(PermissionRequest request) 中提示:上下文为空

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        MissPermission.register(this);
    }
}

//使用
MissPermission.with()
            .permission(Manifest.permission.WRITE_EXTERNAL_STORAGE)//
            .prompt(true)    //是否要显示提示
            .msg("为了您正常使用应用,需要以下权限")
            .title("亲爱的用户")
            .style(R.style.MissPermissionDefaultNormalStyle)//设置样式
            .action(new DefaultAction() {//修改权限弹框的动作
                @Override
                public void onActivityResult(int resultCode, Intent data) {
                    //监听打开权限界面返回来的回调
                    //可以在这里进行权限的再次判断,判断是否用户已经同意了权限
                }

                //可选,初始化请求弹窗的时候,可以通过此方法设置监听
                @Override
                public void onCreateRequestPromptDialog(RequestPromptDialog requestPromptDialog) {
                }

                //可选,初始化总是拒绝此权限时的弹窗的时候,可以通过此方法设置监听
                @Override
                public void onCreateAlwaysDeniedDialog(AlwaysDeniedDialog getAlwaysDeniedDialog) {
                }

                //可选,初始化再次请求权限的弹窗的时候,可以通过此方法设置监听
                @Override
                public void onCreateAgainRequestDialog(AgainRequestDialog getAgainRequestDialog) {
                }
            })
            .check(new PermissionListener() {
                @Override
                public void onSuccess(PermissionRequest request) {

                }

                @Override
                public void onFailure(PermissionRequest request) {

                }
            });

说明

不需要添加回调方法,直接使用即可,开箱即用。

样式

字段说明

<resources>
    <attr name="MissPermissionTitleColor" format="color" />           <!--标题文字颜色-->
    <attr name="MissPermissionMsgColor" format="color" />             <!--描述文字颜色-->
    <attr name="MissPermissionItemTextColor" format="color" />        <!--权限文字颜色-->
    <attr name="MissPermissionButtonTextColor" format="color" />      <!--按钮文字颜色-->
    <attr name="MissPermissionButtonBackground" format="reference" /> <!--按钮背景-->
    <attr name="MissPermissionBackground" format="reference" />       <!--对话框背景-->
    <attr name="MissPermissionBgFilterColor" format="color" />        <!--背景过滤色-->
    <attr name="MissPermissionIconFilterColor" format="color" />      <!--图标颜色-->
</resources>

默认样式

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MissPermissionDefaultNormalStyle">
        <item name="MissPermissionTitleColor">@android:color/black</item>
        <item name="MissPermissionMsgColor">@android:color/black</item>
        <item name="MissPermissionItemTextColor">@android:color/black</item>
        <item name="MissPermissionButtonBackground">@drawable/miss_permission_shape_btn_next</item>
        <item name="MissPermissionBackground">@drawable/miss_permission_shape_bg_white</item>
        <item name="MissPermissionButtonTextColor">@android:color/white</item>
        <item name="MissPermissionIconFilterColor">@android:color/black</item>
    </style>
</resources>

自定义样式, 继承 parent="MissPermissionDefaultNormalStyle"

<style name="MyStyle" parent="MissPermissionDefaultNormalStyle">
        <item name="MissPermissionTitleColor">@android:color/black</item>
        <item name="MissPermissionMsgColor">@android:color/black</item>
        <item name="MissPermissionItemTextColor">@android:color/black</item>
        <item name="MissPermissionButtonBackground">@drawable/miss_permission_shape_btn_next</item>
        <item name="MissPermissionBackground">@drawable/miss_permission_shape_bg_white</item>
        <item name="MissPermissionButtonTextColor">@android:color/white</item>
        <item name="MissPermissionIconFilterColor">@android:color/black</item>
</style>

自定义弹出效果

DefaultAction 为默认的弹框操作,如果你想监听打开权限界面之后,再回到界面的 onActivityResult ,那么只要重写这个方法即可.

可以通过重写 onCreateXXXXDialog 函数,在创建的时候设置一些监听,或者在弹出的时候,修改显示的内容

代码如下

MissPermission.with(this)
    .action(new DefaultAction() {//添加显示样式
        @Override
        public void onActivityResult(int resultCode, Intent data) {

        }
        //可选,初始化请求弹窗的时候,可以通过此方法设置监听
        @Override
        public void onCreateRequestPromptDialog(RequestPromptDialog requestPromptDialog) {
        }

        //可选,初始化总是拒绝此权限时的弹窗的时候,可以通过此方法设置监听
        @Override
        public void onCreateAlwaysDeniedDialog(AlwaysDeniedDialog getAlwaysDeniedDialog) {
        }

        //可选,初始化再次请求权限的弹窗的时候,可以通过此方法设置监听
        @Override
        public void onCreateAgainRequestDialog(AgainRequestDialog getAgainRequestDialog) {
        }
    })
    ...

如果你不想使用本库的弹出效果,那么你可以自定义 IAction,本库使用了 https://github.com/bugyun/AvoidOnResultHelper 来简化操作.

public interface IAction extends AvoidOnResultHelper.ActivityCallback {

    /**
     * 检测权限后,触发的事件
     * @param request 权限请求
     * @param permissionGroups 需要请求的权限集合
     */
    void checkedAction(PermissionRequest request, Set<PermissionGroup> permissionGroups);

    /**
     * 拒绝触发的事件
     * @param request 权限请求
     */
    void deniedAction(PermissionRequest request);
}

About

android 权限库,简单好用 👍 完美兼容 AndroidX 和 android 库,欢迎使用~~~

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages