android 动态权限aop,GitHub - firefly1126/android_permission_aspectjx: A AOP library that process Android...

Android_Permission_AspectjX

简单,方便的Android M动态权限配置框架,基于AOP方式aspectjx,支持类,方法的权限配置,更中意的是支持依赖库里的Activity的权限配置,你不再担心依赖第三方库出现权限问题怎么办了。

依赖

gradle 依赖

compile 'com.firefly1126.permissionaspect:permissionaspect:1.0.1'

该库必须配合aspectjx使用

使用

1. 在Application的onCreate里初始化

PermissionCheckSDK.init(Application);

2. 在app层动态添加权限的两种方式

使用PermissionCheckSDK.addCheckPermissionItem(CheckPermissionItem item)

通过这种方式可以给app里的Activity及依赖的第三方库的Activity类分配动态权限

例如:

//在Application里初始化app里所有Activity的权限

String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};

AOPSDK.addCheckPermissionItem(new CheckPermissionItem("com.hujiang.hjwordbookuikit.app.activity.RawWordActivity", permissions));

使用注解的方式添加权限@NeedPermission

@NeedPermission可以作用于所有类的方法(包括静态方法和私有方法)及所有的Activity类

注意:

1、@NeedPermission建议不要使用在带返回值的函数上,因为函数一旦被中断,函数返回值可能会异常;

2、@NeedPermission建议不要使用在系统组件的生命周期回调接口上,因为这样可能会影响系统组件正常的生命周期(比如:Activity的onCreate,onResume,onPause等)。

//作用于Activity

@NeedPermission(permissions = {Manifest.permission.READ_CONTACTS

, Manifest.permission.WRITE_CONTACTS})

public class BActivity extends Activity {

}

//作用于类的方法

@NeedPermission(permissions = {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS})

private void startBActivity(String name, long id) {

startActivity(new Intent(MainActivity.this, BActivity.class));

}

@NeedPermission参数说明

/**

* 你所申请的权限列表,例如 {@link android.Manifest.permission#READ_CONTACTS}

* @return 权限列表

* @see android.Manifest.permission

*/

String[] permissions() default "";

/**

* 合理性解释内容

* @return 合理性解释内容

*/

String rationalMessage() default "";

/**

* 合理性解释文本资源ID

* @return

*/

int rationalMsgResId() default 0;

/**

* 合理性解释按钮文本

* @return 合理性解释按钮文本

*/

String rationalButton() default "";

/**

* 合理性解释按钮文本资源ID

* @return

*/

int rationalBtnResId() default 0;

/**

* 权限禁止文本内容

* @return 权限禁止文本内容

*/

String deniedMessage() default "";

/**

* 权限禁止文本资源ID

* @return

*/

int deniedMsgResId() default 0;

/**

* 权限禁止按钮文本

* @return 权限禁止按钮文本

*/

String deniedButton() default "";

/**

* 权限禁止按钮文本资源ID

* @return

*/

int deniedBtnResId() default 0;

/**

* app设置按钮文本

* @return

*/

String settingText() default "";

/**

* app设置按钮文本资源ID

* @return

*/

int settingResId() default 0;

/**

* 是否显示跳转到应用权限设置界面

* @return 是否显示跳转到应用权限设置界面

*/

boolean needGotoSetting() default false;

/**

* 是否无视权限,程序正常往下走

* @return 是否无视权限,程序正常往下走

*/

boolean runIgnorePermission() default false;

建议

1、 建议权限申请的触发时机放在Activity类及Activity,Fragment的成员函数上面,不建议在Service等后台环境中触发;

2、 READ_PHONE_STATE和WRITE_EXTERNAL_STORAGE这两个权限是使用非常频繁的权限,建议在BaseActivity里面申请这两个权;

3、 当用户点击home键回到桌面去设置关闭权限,然后再从最近任务里恢复app上一次的界面时,可能会出现权限被漏申请的问题,这个时候建议将READ_PHONE_STATE和WRITE_EXTERNAL_STORAGE这两个使用非常频繁的权限放到BaseActivity里去申请;

4、@NeedPermission可以使用在Application的方法上,当你的app在启动是需要申请大量权限时, 可以用这种方法, 如果用户禁止权限,则不进入app

5、 如果不想使用AOP方案控制权限申请逻辑,可以使用下面的方案:

CheckPermission.instance(context).check(permissionItem, new PermissionListener() {

@Override

public void permissionGranted() {

//获取到权限时执行正常业务逻辑

}

@Override

public void permissionDenied() {

//权限被拒绝时给用户友好提示

}

});

危险权限列表

CALENDAR:

READ_CALENDAR

WRITE_CALENDAR

CAMERA:

CAMERA

CONTACTS:

READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION:

ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE:

RECORD_AUDIO

PHONE:

READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS:

BODY_SENSORS

SMS:

SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE:

READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

第三方固件问题汇总

官方固件

大部分手机固件权限申请模式和官方做法比较一致,这里不多细说

小米固件

发现在小米手机上以下权限在真正使用前去申请权限会直接授权通过,当真正使用到权限时才会弹系统授权页面,但不影响正常的权限申请流程:

ACCESS_FINE_LOCATION

READ_CONTACTS

READ_PHONE_STATE

READ_SMS

BODY_SENSORS

联想ZUK

联想ZUK的做法是将读写磁盘权限和获取手机状态这两个权限永远开启,权限设置界面的开关完全是摆设。但是也出现过你不管怎样设置读写磁盘权限开关,写SDCard都会报异常的Bug,这个应该是固件的Bug,app无能为力,卸载app重新安装就OK了。

License

Copyright (C) 2016 firefly1126, Inc.

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值