/android_permission_aspectjx

A AOP library that process Android M permissions with aspectjx.

Primary LanguageJavaApache License 2.0Apache-2.0

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_STATEWRITE_EXTERNAL_STORAGE这两个权限是使用非常频繁的权限,建议在BaseActivity里面申请这两个权;

3、 当用户点击home键回到桌面去设置关闭权限,然后再从最近任务里恢复app上一次的界面时,可能会出现权限被漏申请的问题,这个时候建议将READ_PHONE_STATEWRITE_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.