android 权限申请PermissionUtil --在activity之外申请权限

本文介绍了一个Android权限申请工具类库PermissionUtil,它允许在非Activity组件中方便地申请权限。该库的特点包括:在任意地方发起权限申请、统一处理回调以及维护请求队列避免回调冲突。当权限被拒绝或用户选择不再询问时,提供相应的回调处理策略。文章还详细介绍了如何单独处理失败回调和设置全局回调,并提供了源码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android 权限申请–在activity之外申请权限

1、android 权限申请工具类库

在申请权限时,最不爽的是权限申请结果的回调在activity中,如果在其他地方需要使用危险权限时非常不方便。为了解决这个问题,本类库中在申请权限时,会启动一个透明的activity—PermissionActivity,系统的回调在PermissionActivity中处理,然后在回调给使用的地方,并销毁 PermissionActivity。

特点:

  1. 可以在任意地方发起权限申请;
  2. 可以统一处理权限回调;
  3. 新增维护一个请求队列,依次处理请求,在连续多次发起请求时,不会造成回调冲突。
  4. 已经拥有申请的全部权限或api版本小于23,都会返回申请成功。

2、效果

申请时拒绝,拒绝后会回调被拒绝的权限,可以对被拒绝的权限进行说明,并重新申请。
在这里插入图片描述
申请时权限被拒绝,并勾选了不再询问,会回调被禁止的权限,可以请求用户去设置里面打开。
在这里插入图片描述

3、使用方式一:单独处理失败回调

注册权限

	<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

要申请的权限

final String[] permission= new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.CAMERA,
            Manifest.permission.READ_PHONE_STATE};

要申请权限的回调

PermissionCallback callback=new PermissionCallback() {

    @Override
    public void onPermissionGranted() {
        toast("权限申请成功--方式1");
    }

    @Override
    public void shouldShowRational(final RequestBean requestBean,String[] rationalPermissons,
    						 final boolean before) {
        StringBuilder sb=new StringBuilder();
        sb.append("我们将获取以下权限:\n\n");

        for(int i=0;i<rationalPermissons.length;i++){
            sb.append((i+1)+"、");
            if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(rationalPermissons[i])){
                sb.append("读写设备外部存储空间的权限,将被用于获取用户头像、保存一些文件到项目文件夹中");
            }else if(Manifest.permission.CAMERA.equals(rationalPermissons[i])){
                sb.append("使用摄像头的权限将,被用于拍照获取用户头像,直播视频采集");
            }else if(Manifest.permission.READ_PHONE_STATE.equals(rationalPermissons[i])){
                sb.append("读取手机状态信息的权限,将被用于登录时账号验证");
            }else if(Manifest.permission.RECORD_AUDIO.equals(rationalPermissons[i])){
                sb.append("录制引起的权限,将被用于直播音频采集");
            }

            if(i==rationalPermissons.length-1){
                sb.append("。");
            }else{
                sb.append(";");
            }

            sb.append("\n");
        }

        PermissionUtil.showDialog(MainActivity.this, sb.toString(),
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        //重新申请权限
                        PermissionUtil.requestAgain(MainActivity.this,requestBean);
                    }
                });
    }

    @Override
    public void onPermissonReject(String[] rejectPermissons) {
        StringBuilder sb=new StringBuilder();
        sb.append("我们需要的权限:\n\n");

        for(int i=0;i<rejectPermissons.length;i++){
            sb.append((i+1)+"、");
            if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(rejectPermissons[i])){
                sb.append("读写外部存储空间的权限,将被用于获取用户头像、保存一些文件到项目文件夹中");
            }else if(Manifest.permission.CAMERA.equals(rejectPermissons[i])){
                sb.append("使用摄像头的权限,被用于拍照获取用户头像,直播视频采集");
            }else if(Manifest.permission.READ_PHONE_STATE.equals(rejectPermissons[i])){
                sb.append("读取手机状态信息的权限,将被用于登录时账号验证");
            }else if(Manifest.permission.RECORD_AUDIO.equals(rejectPermissons[i])){
                sb.append("录制引起的权限,将被用于直播音频采集");
            }
            if(i==rejectPermissons.length-1){
                sb.append("。");
            }else{
                sb.append(";");
            }
            sb.append("\n");
        }
        sb.append("\n被设为禁止,请到设置里开启权限");

        PermissionUtil.showDialog(MainActivity.this, sb.toString(),
                getString(R.string.dialog_cancel),
                getString(R.string.dialog_go_setting),
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        //重新申请权限
                        PermissionUtil.startSettingsActivity(MainActivity.this);
                    }
                }
        );
    }
};

发起权限申请

PermissionUtil.request(MainActivity.this,permission,callback);

4、使用方式二:统一处理失败回调

在权限申请前设置统一回调,比如application里面

/**  申请失败的回调,整个app只需设置一次,统一在一个地方处理 */
   PermissionUtil.setFailedCallBack(new FailedCallBack() {
       @Override
       public void shouldShowRational(final RequestBean requestBean,String[] rationalPermissons, 
     									boolean before) {
           StringBuilder sb=new StringBuilder();
           sb.append("我们需要获取以下权限:\n\n");

           for(int i=0;i<rationalPermissons.length;i++){
               sb.append((i+1)+"、");
               if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(rationalPermissons[i])){
                   sb.append("读写设备外部存储空间的权限,将被用于获取用户头像、保存一些文件到项目文件夹中");
               }else if(Manifest.permission.CAMERA.equals(rationalPermissons[i])){
                   sb.append("使用摄像头的权限,将被用于拍照获取用户头像,直播视频采集");
               }else if(Manifest.permission.READ_PHONE_STATE.equals(rationalPermissons[i])){
                   sb.append("读取手机状态信息的权限,将被用于登录时账号验证");
               }else if(Manifest.permission.RECORD_AUDIO.equals(rationalPermissons[i])){
                   sb.append("录制引起的权限,将被用于直播音频采集");
               }

               if(i==rationalPermissons.length-1){
                   sb.append("。");
               }else{
                   sb.append(";");
               }
               sb.append("\n");
           }

           //弹出提示dialog
           PermissionUtil.showDialog(MainActivity.this, sb.toString(),
                   new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int which) {
                           dialog.dismiss();

                           //重新申请权限
                           PermissionUtil.requestAgain(MainActivity.this,requestBean);
                       }
                   });
       }

       @Override
       public void onPermissonReject(String[] rejectPermissons) {
           StringBuilder sb=new StringBuilder();
           sb.append("我们需要的权限:\n\n");

           for(int i=0;i<rejectPermissons.length;i++){
               sb.append((i+1)+"、");
               if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(rejectPermissons[i])){
                   sb.append("读写外部存储空间的权限,将被用于获取用户头像、保存一些文件到项目文件夹中");
               }else if(Manifest.permission.CAMERA.equals(rejectPermissons[i])){
                   sb.append("使用摄像头的权限,被用于拍照获取用户头像,直播视频采集");
               }else if(Manifest.permission.READ_PHONE_STATE.equals(rejectPermissons[i])){
                   sb.append("读取手机状态信息的权限,将被用于登录时账号验证");
               }else if(Manifest.permission.RECORD_AUDIO.equals(rejectPermissons[i])){
                   sb.append("录制引起的权限,将被用于直播音频采集");
               }

               if(i==rejectPermissons.length-1){
                   sb.append("。");
               }else{
                   sb.append(";");
               }

               sb.append("\n");
           }
           sb.append("\n被设为禁止,请到设置里开启权限");

           //弹出提示dialog
           PermissionUtil.showDialog(MainActivity.this, sb.toString(),
                   getString(R.string.dialog_cancel),
                   getString(R.string.dialog_go_setting),
                   new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int which) {
                           dialog.dismiss();
                           //重新申请权限
                           PermissionUtil.startSettingsActivity(MainActivity.this);
                       }
                   }
            );
        }
    });

权限申请时设置成功的回调

	/** 申请结果处理方式二 */
   findViewById(R.id.text_view02).setOnClickListener(new View.OnClickListener() {

       @Override
       public void onClick(View v) {
           //申请权限
           PermissionUtil.request(MainActivity.this, permission, new SuccessCallback(){

               @Override
               public void onPermissionGranted() {
                   toast("权限申请成功--方式2");
               }
           });
}

5、源码

github
喜欢的小伙伴点下star 哈哈。

github慢也可以下载压缩包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值