1.依赖
implementation 'pub.devrel:easypermissions:2.0.1'
2.定义自己要申请的权限
String[] PERMS = {Manifest.permission.INTERNET,//网络Manifest.permission.WRITE_EXTERNAL_STORAGE,//写Manifest.permission.READ_EXTERNAL_STORAGE,//读Manifest.permission.CALL_PHONE,//打电话Manifest.permission.SEND_SMS//发短信};
3.判断是否授予过权限
if (EasyPermissions.hasPermissions(this,PERMS)){//所有授权通过new Handler().postDelayed(new Runnable() {@Overridepublic void run() {startActivity(new Intent(StartActivity.this,MainActivity.class));}},1000);}else{//授权没有通过/***@param host Context对象*@param rationale 权限弹窗上的提示语。*@param requestCode 请求权限的唯一标识码 10001*@param perms 一系列权限*/EasyPermissions.requestPermissions(this,"请授予权限,否则影响部分使用功能。",10001,PERMS);}
4.重写onRequestPermissionResult把处理结果告诉easypermissions
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);//将结果转发给EasyPermissionsEasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);}
5.实现 EasyPermissions.PermissionCallbacks 重写两个方法onPermissionsGranted 以及onPermissionsDenied
public class StartActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{
这里不用着急处理申请成功后的操作,我们需要自己判断哪些权限成功了,那些没成功,具体简易步骤,请看步骤6
/*** 申请成功时调用* @param requestCode 请求权限的唯一标识码* @param perms 申请成功的权限集合*/@Overridepublic void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {}
申请失败的时候提示用户去设置里给权限,然后跳到设置
/*** 申请拒绝时调用* @param requestCode 请求权限的唯一标识码* @param perms 一系列权限*/@Overridepublic void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {/*** 若是在权限弹窗中,用户勾选了'不在提示',且拒绝权限。* 这时候,需要跳转到设置界面去,让用户手动开启。*/new AppSettingsDialog.Builder(this).setTitle("提示!").setRationale("请到设置授予权限,否则影响部分功能使用。").build().show();}
6.使用注解执行全部权限申请成功后的方法
/*** 使用了该注解,当权限请求被用户同意后,会根据请求code来执行,相应的含有@AfterPermissionGranted注解的方法。** 主要用于简化逻辑* 简化了请求成功操作流程,不需要在EasyPermissions.onRequestPermissionsResult()的回调监听器中请求成功的方法中,再次手动调用,获取权限后需要操作的逻辑代码。** 简言之,用户同意全部权限后,会执行使用了 @AfterPermissionGranted(10001)注解的方法* 如果请求code不是10001的话,也就是用户没有全部同意权限,使用了 @AfterPermissionGranted(10001)注解的方法不会执行* */@AfterPermissionGranted(10001)public void souccee(){
// Toast.makeText(this, "哈哈哈哈哈哈成功了", Toast.LENGTH_SHORT).show();new Handler().postDelayed(new Runnable() {@Overridepublic void run() {startActivity(new Intent(StartActivity.this,MainActivity.class));}},1000);}
/**
* 使用了该注解,当权限请求被用户同意后,会根据请求code来执行,相应的含有@AfterPermissionGranted注解的方法。
*
* 主要用于简化逻辑
* 简化了请求成功操作流程,不需要在EasyPermissions.onRequestPermissionsResult()的回调监听器中请求成功的方法中,再次手动调用,获取权限后需要操作的逻辑代码。
*
* 简言之,用户同意全部权限后,会执行使用了 @AfterPermissionGranted(10001)注解的方法
* 如果请求code不是10001的话,也就是用户没有全部同意权限,使用了 @AfterPermissionGranted(10001)注解的方法不会执行
* */
7.最后重写onActivityResult判断从设置页面回来后,权限是否给成功
@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {//从设置页面返回,判断权限是否申请。if (EasyPermissions.hasPermissions(this, PERMS)) {Toast.makeText(this, "权限申请成功!", Toast.LENGTH_SHORT).show();new Handler().postDelayed(new Runnable() {@Overridepublic void run() {startActivity(new Intent(StartActivity.this,MainActivity.class));}},1000);} else {Toast.makeText(this, "权限申请失败!", Toast.LENGTH_SHORT).show();}}}
至此,完事儿。