【超简单的权限处理】Android 6.0 以上动态权限判断

【超简单的权限处理】Android 6.0 以上动态权限判断

申明

引用大神的: Android 6.0 动态权限申请简单简洁优雅的处理方式

特点

	更加简洁,更加灵活
	随时调用,随时处理,单个调用,单个处理。

本来想着直接在BaseActivity里面实现接口,我发现没那必要。在使用场景就那几行代码就搞定了,更加灵活,所以还是用接口+帮助类的方式实现,感谢Dway大神提供好的思路与逻辑。

直接看代码

1.帮助类,接管对权限的申请与结果处理

核心代码.

/**
 * 动态权限帮助类
 * Created by dway on 2018/1/10.
 * Update by haoxue on 2018/10/26.
 */
public class PermissionHelper {

    private Activity mActivity;
    private PermissionInterface mPermissionInterface;
    private String permission;
    private int callBackCode;

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

    /**
     * 判断是否有某个权限
     *
     * @param context
     * @param permission
     * @return
     */
    public static boolean hasPermission(Context context, String permission) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Android 6.0判断,6.0以下跳过。在清单文件注册即可,不用动态请求,这里直接视为有权限
            if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    /**
     *  请求权限
     * @param permission 权限名字
     * @param callBackCode 回调code
     */
    public void requestPermissions(String permission, int callBackCode) {
        this.permission = permission;
        this.callBackCode = callBackCode;
        if (hasPermission(mActivity, permission)) {
            mPermissionInterface.requestPermissionsSuccess(callBackCode);
        } else {
            ActivityCompat.requestPermissions(mActivity, new String[]{permission}, callBackCode);
        }

    }

    /**
     *  在Activity中的onRequestPermissionsResult中调用,用来接收结果判断
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    public void requestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == callBackCode) {
            for (int result : grantResults) {
                if (result == PackageManager.PERMISSION_GRANTED) {
                    mPermissionInterface.requestPermissionsSuccess(callBackCode);
                } else {
                    mPermissionInterface.requestPermissionsFail(callBackCode);
                }
            }
        }
    }
}

2.所用到的接口

代码

/**
 * 动态权限回调接口
 * Created by dway on 2018/1/10.
 * Update by haoxue on 2018/10/26.
 */
public interface PermissionInterface {
    /**
     * 请求权限成功回调
     */
    void requestPermissionsSuccess(int callBackCode);

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

}

3.实际使用

代码

/**
 * 动态权限帮助类
 * Created by haoxue on 2018/10/26.
 */
public class SettingActivity extends AppCompatActivity implements PermissionInterface {
    private PermissionHelper permissionHelper;
    // 拍照结果返回code
    private static final int REQ_CODE_PICK_PHOTO = 1;
    private Button btPhoto;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting);
        permissionHelper = new PermissionHelper(this,this);
        initView();
    }
    
    
    private void initView() {
        btPhoto = (Button)findViewById(R.id.bt_photo);
		 // 拍照监听 
        btPhoto.setOnClickListener(view -> { // lambda 简写
         // 判断是否有权限
        permissionHelper.requestPermissions(Manifest.permission.CAMERA,REQ_CODE_PICK_PHOTO);  
    });
  }
  
    /**
     * 重写Activity的权限请求返回结果方法
     *
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        permissionHelper.requestPermissionsResult(requestCode, permissions, grantResults); // 接管结果判断
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    public void requestPermissionsSuccess(int callBackCode) { // 有权限处理
    	if(callBackCode == REQ_CODE_PICK_PHOTO){
    	   takePhoto();
    	}
    }

    @Override
    public void requestPermissionsFail(int callBackCode) { // 无权限处理
    	if(callBackCode == REQ_CODE_PICK_PHOTO){ 
        ToastUtil.showToast(R.string.tips_quest_camera_permission); // 提示用户
        }
    }

	// 处理有权限后的业务逻辑
    private void takePhoto() {
    }

结尾

大家有什么更好的方案可以在结尾处留言。

转载请注明来源:https://blog.csdn.net/loveyouxuan/article/details/83409941

你可能感兴趣的:(Android)