89.android 简单的动态权限申请(第三方)两种方式+动态权限封装方式

导读:本篇文章讲解 89.android 简单的动态权限申请(第三方)两种方式+动态权限封装方式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

//第一个 (第三方)方式:

//第一步 第三方库依赖:

compile 'com.lovedise:permissiongen:0.0.6'

//第二步 在Activity里使用:

private void permissiongen() {
    //处理需要动态申请的权限
    PermissionGen.with(MainActivity.this)
            .addRequestCode(200)
            .permissions(Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_EXTERNAL_STORAGE,)
            .request();
}

//申请权限结果的返回
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}

//权限申请成功
@PermissionSuccess(requestCode = 200)
public void doSomething() {
    //在这个方法中做一些权限申请成功的事情
    Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show();
}
//申请失败
@PermissionFail(requestCode = 200)
public void doFailSomething() {
    Toast.makeText(this, "失败", Toast.LENGTH_SHORT).show();
}

//第二个(第三方)方式:

//第一步 第三方库依赖:

implementation 'com.github.dfqin:grantor:2.5'

//第二步 在Activity里使用:

 

private void  permissiongen() {
    PermissionsUtil.requestPermission(this, new PermissionListener() {
        @Override
        public void permissionGranted(@NonNull String[] permissions) {
            Toast.makeText(Main4Activity.this, "访问权限", Toast.LENGTH_LONG).show();
            Log.e("MainActivity","权限打开");
        }

        @Override
        public void permissionDenied(@NonNull String[] permissions) {
            Toast.makeText(Main4Activity.this, "用户拒绝了权限", Toast.LENGTH_LONG).show();
            Log.e("MainActivity","权限拒绝");
        }
    }, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.RECORD_AUDIO}, false, null);
}

//别忘了在AndroidManifest.xml也写上权限。

 

//第三个 动态权限封装:

//第一步首先写个接口类:PermissionInterface

public interface PermissionInterface {

    /**
     * 可设置请求权限请求码
     */
    int getPermissionsRequestCode();

    /**
     * 设置需要请求的权限
     */
    String[] getPermissions();

    /**
     * 请求权限成功回调
     */
    void requestPermissionsSuccess();

    /**
     * 请求权限失败回调
     */
    void requestPermissionsFail();

}

//第二步 写个工具类:PermissionUtil

public class PermissionUtil {

    /**
     * 判断是否有某个权限
     * @param context
     * @param permission
     * @return
     */
    public static boolean hasPermission(Context context, String permission){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if(context.checkSelfPermission(permission)  != PackageManager.PERMISSION_GRANTED){
                return false;
            }
        }
        return true;
    }

    /**
     * 弹出对话框请求权限
     * @param activity
     * @param permissions
     * @param requestCode
     */
    public static void requestPermissions(Activity activity, String[] permissions, int requestCode){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.requestPermissions(permissions, requestCode);
        }
    }

    /**
     * 返回缺失的权限
     * @param context
     * @param permissions
     * @return 返回缺少的权限,null 意味着没有缺少权限
     */
    public static String[] getDeniedPermissions(Context context, String[] permissions){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ArrayList<String> deniedPermissionList = new ArrayList<>();
            for(String permission : permissions){
                if(context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED){
                    deniedPermissionList.add(permission);
                }
            }
            int size = deniedPermissionList.size();
            if(size > 0){
                return deniedPermissionList.toArray(new String[deniedPermissionList.size()]);
            }
        }
        return null;
    }

}

//第三步 写个权限操作帮助的类:PermissionHelper

public class PermissionHelper {

    private Activity mActivity;
    private PermissionInterface mPermissionInterface;

    public PermissionHelper(@NonNull Activity activity, @NonNull PermissionInterface permissionInterface) {
        mActivity = activity;
        mPermissionInterface = permissionInterface;
    }

    /**
     * 开始请求权限。
     * 方法内部已经对Android M 或以上版本进行了判断,外部使用不再需要重复判断。
     * 如果设备还不是M或以上版本,则也会回调到requestPermissionsSuccess方法。
     */
    public void requestPermissions(){
        String[] deniedPermissions = PermissionUtil.getDeniedPermissions(mActivity, mPermissionInterface.getPermissions());
        if(deniedPermissions != null && deniedPermissions.length > 0){
            PermissionUtil.requestPermissions(mActivity, deniedPermissions, mPermissionInterface.getPermissionsRequestCode());
        }else{
            mPermissionInterface.requestPermissionsSuccess();
        }
    }

    /**
     * 在Activity中的onRequestPermissionsResult中调用
     * @param requestCode
     * @param permissions
     * @param grantResults
     * @return true 代表对该requestCode感兴趣,并已经处理掉了。false 对该requestCode不感兴趣,不处理。
     */
    public boolean requestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
        if(requestCode == mPermissionInterface.getPermissionsRequestCode()){
            boolean isAllGranted = true;//是否全部权限已授权
            for(int result : grantResults){
                if(result == PackageManager.PERMISSION_DENIED){
                    isAllGranted = false;
                    break;
                }
            }
            if(isAllGranted){
                //已全部授权
                mPermissionInterface.requestPermissionsSuccess();
            }else{
                //权限有缺失
                mPermissionInterface.requestPermissionsFail();
            }
            return true;
        }
        return false;
    }

}

 

//第四步 在Activity里使用:

 //需要在哪申请权限就在哪初始化,比如在onCreate()方法里:

//初始化并发起权限申请
mPermissionHelper = new PermissionHelper(LoginActivity.this,LoginActivity.this);
mPermissionHelper.requestPermissions();

//然后Activity实现这个接口,重写方法:

//登录页面,实现接口

public class LoginActivity extends BaseActivity implements  PermissionInterface {

 //重写方法:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if(mPermissionHelper.requestPermissionsResult(requestCode, permissions, grantResults)){
        //权限请求结果,并已经处理了该回调
        return;
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

@Override
public int getPermissionsRequestCode() {
    //设置权限请求requestCode,只有不跟onRequestPermissionsResult方法中的其他请求码冲突即可。
    return 10000;
}

@Override
public String[] getPermissions() {
    //设置该界面所需的全部权限
    return new String[]{
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.CALL_PHONE,
            Manifest.permission.READ_CALL_LOG,
            Manifest.permission.READ_CONTACTS
    };
}

@Override
public void requestPermissionsSuccess() {
    //权限请求用户已经全部允许
    initViews();
}

@Override
public void requestPermissionsFail() {
    //权限请求不被用户允许。可以提示并退出或者提示权限的用途并重新发起权限申请。
    finish();
}

private void initViews(){
    //已经拥有所需权限,可以放心操作任何东西了

}

 

 //——————————————————————–完—————————————————————————

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118305.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!