Android EasyPermission优雅地实现动态权限申请

飞哥语录:努力让自己变得强大,这样才有能力保护自己的亲人,保护自己喜欢的人。

Google开源的动态权限适配库,用起来比较简洁和清晰,总体还不错,如果喜欢链式调用的就用 RxPermission 或者 AndPermission 都是不错的选择。

一、权限等级和权限组介绍

权限主要分为 normaldangeroussignaturesignatureOrSystem四个等级,一般情况下,我们只需要了解前两种权限的使用就可以了,后面的是属于系统级签名的权限。

二、普通权限和危险权限

普通权限只需要在AndroidMenifest.xml文件中申请即可,危险权限需要到代码中进行动态申请一般是成对成组地去申请,所以叫权限组

普通权限对应表:

NamePermission
ACCESS_LOCATION_EXTRA_COMMANDSACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICYACCESS_WIFI_STATE
BLUETOOTHBLUETOOTH_ADMIN
BROADCAST_STICKYCHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATECHANGE_WIFI_STATE
DISABLE_KEYGUARDEXPAND_STATUS_BAR
GET_PACKAGE_SIZEINSTALL_SHORTCUT
INTERNETKILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGSNFC
READ_SYNC_SETTINGSREAD_SYNC_STATS
RECEIVE_BOOT_COMPLETEDREORDER_TASKS
REQUEST_IGNORE_BATTERY_OPTIMIZATIONSREQUEST_INSTALL_PACKAGES
SET_ALARMSET_TIME_ZONE
SET_WALLPAPERSET_WALLPAPER_HINTS
TRANSMIT_IRUNINSTALL_SHORTCUT
USE_FINGERPRINTVIBRATE
WAKE_LOCKWRITE_SYNC_SETTINGS

危险权限对应表:

权限组权限
CALENDARREAD_CALENDAR WRITE_CALENDAR
CAMERACAMERA
CONTACTSREAD_CONTACTS WRITE_CONTACTS GET_ACCOUNTS
LOCATIONACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION
MICROPHONERECORD_AUDIO
PHONEREAD_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS
SENSORSBODY_SENSORS
SMSSEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS
STORAGEREAD_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE

下面简单介绍一下EasyPermission的简单使用,更多详细使用请参考:https://github.com/googlesamples/easypermissions

1.添加依赖库

compile 'pub.devrel:easypermissions:1.0.1'

2.定义需要动态申请的权限集合

	/**
     * 需要申请的权限数组
     */
    protected String[] needPermissions = {
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
    };

3.重写回调方法

	@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // Forward results to EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

4.授权成功和失败的回调

	@AfterPermissionGranted(RC_CAMERA_AND_LOCATION)
	private void methodRequiresTwoPermission() {
	    String[] perms = {Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION};
	    if (EasyPermissions.hasPermissions(this, perms)) {
	        // Already have permission, do the thing
	        // ...
	    } else {
	        // Do not have permissions, request them now
	        EasyPermissions.requestPermissions(this, getString(R.string.camera_and_location_rationale),
	                RC_CAMERA_AND_LOCATION, perms);
	    }
	}

第二种写法:

	EasyPermissions.requestPermissions(
        new PermissionRequest.Builder(this, RC_CAMERA_AND_LOCATION, perms)
                .setRationale(R.string.camera_and_location_rationale)
                .setPositiveButtonText(R.string.rationale_ask_ok)
                .setNegativeButtonText(R.string.rationale_ask_cancel)
                .setTheme(R.style.my_fancy_style)
                .build());

重写授权成功和失败的回调

	@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // Forward results to EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    @Override
    public void onPermissionsGranted(int requestCode, List<String> list) {
        // Some permissions have been granted
        // ...
    }

    @Override
    public void onPermissionsDenied(int requestCode, List<String> list) {
        // Some permissions have been denied
        // ...
    }

更多使用请参考:

https://github.com/googlesamples/easypermissions

另外再推荐几个不错的处理动态权限的开源库:

前面的star基本都是几k,后面的都是几百的star

https://github.com/tbruyelle/RxPermissions

https://github.com/hongyangAndroid/MPermissions

https://github.com/yanzhenjie/AndPermission

https://github.com/permissions-dispatcher/PermissionsDispatcher

https://github.com/jokermonn/permissions4m

https://github.com/lovedise/PermissionGen

https://github.com/k0shk0sh/PermissionHelper

支持Kotlin:https://github.com/googlesamples/android-RuntimePermissions

https://github.com/mylhyl/AndroidAcp

https://github.com/ParkSangGwon/TedPermission

https://github.com/yewei02538/HiPermission

https://github.com/PEXPlugins/PermissionsEx

https://github.com/dfqin/PermissionGrantor

更多Google官网文档关于动态权限的说明

https://developer.android.com/guide/topics/security/permissions.html

https://developer.android.com/training/permissions/requesting.html

https://developer.android.com/training/permissions/best-practices.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值