美文网首页
BaseFragment 运行时权限

BaseFragment 运行时权限

作者: Endeav0r | 来源:发表于2019-10-12 10:35 被阅读0次
    /**
     * @ClassName: BaseFragment
     * @Description:
     * @author: Endeavor
     * @date: 2017/4/5
     */
    public abstract class BaseFragment extends Fragment {
    
        private PermissionsResultListener mListener;
    
        private int mRequestCode;
    
        /**
         * 其他 fragment 继承 BaseFragment 调用 performRequestPermissions 方法
         *
         * @param desc        首次申请权限被拒绝后再次申请给用户的描述提示
         * @param permissions 要申请的权限数组
         * @param requestCode 申请标记值
         * @param listener    实现的接口
         */
        protected void performRequestPermissions(String desc, String[] permissions, int requestCode, PermissionsResultListener listener) {
            if (permissions == null || permissions.length == 0) return;
            mRequestCode = requestCode;
            mListener = listener;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                List<String> mPermissionList = checkPermission(permissions);
                if (!mPermissionList.isEmpty()) {// 检查是否声明了权限
                    String[] temp = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
                    requestEachPermissions(desc, temp, requestCode);
                } else {
                    // 已经申请权限
                    if (mListener != null) {
                        mListener.onPermissionGranted();
                    }
                }
            } else {
                if (mListener != null) {
                    mListener.onPermissionGranted();
                }
            }
        }
    
        /**
         * 申请权限前判断是否需要声明
         *
         * @param desc
         * @param permissions
         * @param requestCode
         */
        private void requestEachPermissions(String desc, String[] permissions, int requestCode) {
    
                if (showRationale(permissions)) {// 需要再次声明
                    showRationaleDialog(desc, permissions, requestCode);
                } else {
                    requestPermissions(permissions, requestCode);
                }
    
        }
    
        /**
         * 弹出声明的 Dialog
         *
         * @param desc
         * @param permissions
         * @param requestCode
         */
        private void showRationaleDialog(String desc, final String[] permissions, final int requestCode) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle("提示")
                    .setMessage(desc)
                    .setPositiveButton("确认", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.dismiss();
                            requestPermissions(permissions, requestCode);
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.dismiss();
                        }
                    })
                    .setCancelable(false)
                    .show();
        }
    
    
        /**
         * 再次申请权限时,是否需要声明
         *
         * @param permissions
         * @return
         */
        private boolean showRationale(String[] permissions) {
            for (String permission : permissions) {
                if (shouldShowRequestPermissionRationale(permission)){
                    return true;
                }
            }
            return false;
        }
    
    
        /**
         * 检察每个权限是否申请
         *
         * @param permissions
         * @return true 需要申请权限,false 已申请权限
         */
        private List<String> checkPermission(String[] permissions) {
            List<String> data = new ArrayList<>();
            for (String permission : permissions) {
                if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) {
                    data.add(permission);
                }
            }
            return data;
        }
    
        /**
         * 申请权限结果的回调
         *
         * @param requestCode
         * @param permissions
         * @param grantResults
         */
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == mRequestCode) {
                if (checkEachPermissionsGranted(grantResults)) {
                    if (mListener != null) {
                        mListener.onPermissionGranted();
                    }
                } else {// 用户拒绝申请权限
                    if (mListener != null) {
                        mListener.onPermissionDenied();
                    }
                }
            }
        }
    
        /**
         * 检查回调结果
         *
         * @param grantResults
         * @return
         */
        private boolean checkEachPermissionsGranted(int[] grantResults) {
            for (int result : grantResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    return false;
                }
            }
            return true;
        }
    
    
        /**
         * 权限申请接口
         */
        public interface PermissionsResultListener {
    
            void onPermissionGranted();
    
            void onPermissionDenied();
    
        }
    }
    

    相关文章

      网友评论

          本文标题:BaseFragment 运行时权限

          本文链接:https://www.haomeiwen.com/subject/gbtqmctx.html