zoukankan      html  css  js  c++  java
  • 权限 动态 访问

    https://blog.csdn.net/xjbclz/article/details/52900923

    先添加依赖:

    implementation 'pub.devrel:easypermissions:0.1.5'

    或者自己实现(这样方便改写里面的方法):

    package com.example.m_evolution.Utils;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface AfterPermissionGranted {
    
        int value();
    
    }
    package com.example.m_evolution.Utils;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.pm.PackageManager;
    import android.support.annotation.StringRes;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.app.Fragment;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AlertDialog;
    import android.util.Log;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    import pub.devrel.easypermissions.AfterPermissionGranted;
    
    /**
     * Utility to request and check System permissions for apps targeting Android M (API >= 23).
     */
    public class MyEasyPermission {
    
        private static final String TAG = "EasyPermissions";
    
        public interface PermissionCallbacks extends
                ActivityCompat.OnRequestPermissionsResultCallback {
    
            void onPermissionsGranted(int requestCode, List<String> perms);
    
            void onPermissionsDenied(int requestCode, List<String> perms);
    
        }
    
        /**
         * Check if the calling context has a set of permissions.
         *
         * @param context the calling context.
         * @param perms   one ore more permissions, such as {@code android.Manifest.permission.CAMERA}.
         * @return true if all permissions are already granted, false if at least one permission
         * is not yet granted.
         */
        public static boolean hasPermissions(Context context, String... perms) {
            for (String perm : perms) {
                boolean hasPerm = (ContextCompat.checkSelfPermission(context, perm) == PackageManager.PERMISSION_GRANTED);
                if (!hasPerm) {
                    return false;
                }
            }
    
            return true;
        }
    
        /**
         * Request a set of permissions, showing rationale if the system requests it.
         *
         * @param object      Activity or Fragment requesting permissions. Should implement
         *                    {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback}
         *                    or
         * @param rationale   a message explaining why the application needs this set of permissions, will
         *                    be displayed if the user rejects the request the first time.
         * @param requestCode request code to track this request, must be < 256.
         * @param perms       a set of permissions to be requested.
         */
        public static void requestPermissions(final Object object, String rationale,
                                              final int requestCode, final String... perms) {
            requestPermissions(object, rationale,
                    android.R.string.ok,
                    android.R.string.cancel,
                    requestCode, perms);
        }
    
        /**
         * Request a set of permissions, showing rationale if the system requests it.
         *
         * @param object         Activity or Fragment requesting permissions. Should implement
         *                       {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback}
         *                       or
         * @param rationale      a message explaining why the application needs this set of permissions, will
         *                       be displayed if the user rejects the request the first time.
         * @param positiveButton custom text for positive button
         * @param negativeButton custom text for negative button
         * @param requestCode    request code to track this request, must be < 256.
         * @param perms          a set of permissions to be requested.
         */
        public static void requestPermissions(final Object object, String rationale,
                                              @StringRes int positiveButton,
                                              @StringRes int negativeButton,
                                              final int requestCode, final String... perms) {
    
            checkCallingObjectSuitability(object);
            final PermissionCallbacks callbacks = (PermissionCallbacks) object;
    
            boolean shouldShowRationale = false;
            for (String perm : perms) {
                shouldShowRationale = shouldShowRationale || shouldShowRequestPermissionRationale(object, perm);
            }
    
            if (shouldShowRationale) {
                AlertDialog dialog = new AlertDialog.Builder(getActivity(object))
                        .setMessage(rationale)
                        .setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                executePermissionsRequest(object, perms, requestCode);
                            }
                        })
                        .setNegativeButton(negativeButton, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // act as if the permissions were denied
                                callbacks.onPermissionsDenied(requestCode, Arrays.asList(perms));
                            }
                        })
                        .setCancelable(false)
                        .create();
                dialog.show();
            } else {
                executePermissionsRequest(object, perms, requestCode);
            }
        }
    
        /**
         * Handle the result of a permission request, should be called from the calling Activity's
         * {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}
         * method.
         * <p/>
         * If any permissions were granted or denied, the Activity will receive the appropriate
         * callbacks through {@link pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks} and methods annotated with
         * {@link pub.devrel.easypermissions.AfterPermissionGranted} will be run if appropriate.
         *
         * @param requestCode  requestCode argument to permission result callback.
         * @param permissions  permissions argument to permission result callback.
         * @param grantResults grantResults argument to permission result callback.
         * @param object       the calling Activity or Fragment.
         * @throws IllegalArgumentException if the calling Activity does not implement
         *                                  {@link pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks}.
         */
        public static void onRequestPermissionsResult(int requestCode, String[] permissions,
                                                      int[] grantResults, Object object) {
    
            checkCallingObjectSuitability(object);
            PermissionCallbacks callbacks = (PermissionCallbacks) object;
    
            // Make a collection of granted and denied permissions from the request.
            ArrayList<String> granted = new ArrayList<>();
            ArrayList<String> denied = new ArrayList<>();
            for (int i = 0; i < permissions.length; i++) {
                String perm = permissions[i];
                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    granted.add(perm);
                } else {
                    denied.add(perm);
                }
            }
    
            // Report granted permissions, if any.
            if (!granted.isEmpty()) {
                // Notify callbacks
                callbacks.onPermissionsGranted(requestCode, granted);
            }
    
            // Report denied permissions, if any.
            if (!denied.isEmpty()) {
                callbacks.onPermissionsDenied(requestCode, denied);
            }
    
            // If 100% successful, call annotated methods
            if (!granted.isEmpty() && denied.isEmpty()) {
                runAnnotatedMethods(object, requestCode);
            }
        }
    
        private static boolean shouldShowRequestPermissionRationale(Object object, String perm) {
            if (object instanceof Activity) {
                return ActivityCompat.shouldShowRequestPermissionRationale((Activity) object, perm);
            } else if (object instanceof Fragment) {
                return ((Fragment) object).shouldShowRequestPermissionRationale(perm);
            } else {
                return false;
            }
        }
    
        private static void executePermissionsRequest(Object object, String[] perms, int requestCode) {
            checkCallingObjectSuitability(object);
    
            if (object instanceof Activity) {
                ActivityCompat.requestPermissions((Activity) object, perms, requestCode);
            } else if (object instanceof Fragment) {
                ((Fragment) object).requestPermissions(perms, requestCode);
            }
        }
    
        private static Activity getActivity(Object object) {
            if (object instanceof Activity) {
                return ((Activity) object);
            } else if (object instanceof Fragment) {
                return ((Fragment) object).getActivity();
            } else {
                return null;
            }
        }
    
        private static void runAnnotatedMethods(Object object, int requestCode) {
            Class clazz = object.getClass();
            for (Method method : clazz.getDeclaredMethods()) {
                if (method.isAnnotationPresent(pub.devrel.easypermissions.AfterPermissionGranted.class)) {
                    // Check for annotated methods with matching request code.
                    pub.devrel.easypermissions.AfterPermissionGranted ann = method.getAnnotation(AfterPermissionGranted.class);
                    if (ann.value() == requestCode) {
                        // Method must be void so that we can invoke it
                        if (method.getParameterTypes().length > 0) {
                            throw new RuntimeException("Cannot execute non-void method " + method.getName());
                        }
    
                        try {
                            // Make method accessible if private
                            if (!method.isAccessible()) {
                                method.setAccessible(true);
                            }
                            method.invoke(object);
                        } catch (IllegalAccessException e) {
                            Log.e(TAG, "runDefaultMethod:IllegalAccessException", e);
                        } catch (InvocationTargetException e) {
                            Log.e(TAG, "runDefaultMethod:InvocationTargetException", e);
                        }
                    }
                }
            }
        }
    
        private static void checkCallingObjectSuitability(Object object) {
            // Make sure Object is an Activity or Fragment
            if (!((object instanceof Fragment) || (object instanceof Activity))) {
                throw new IllegalArgumentException("Caller must be an Activity or a Fragment.");
            }
    
            // Make sure Object implements callbacks
            if (!(object instanceof PermissionCallbacks)) {
                throw new IllegalArgumentException("Caller must implement PermissionCallbacks.");
            }
        }
    }

    相应Activity要实现EasyPermissions.PermissionCallbacks接口

    public class MainActivity implements EasyPermissions.PermissionCallbacks {
        //权限管理
        //必要的权限
        private final String[] perms_permission = {Manifest.permission.INTERNET, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
        private static final int PERMISSION_REQUEST_CODE_INIT = 100;
        public boolean checkInitPermission(Activity activity) {
            // SDK 小于23默认已经授权
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
                return true;
            }
    
            if (EasyPermissions.hasPermissions(activity, perms_permission)) {
                return true;
            } else {
                EasyPermissions.requestPermissions(activity, "是否允许必要的权限", PERMISSION_REQUEST_CODE_INIT, perms_permission);
                return false;
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
            // Forward results to EasyPermissions
            EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
        }
    
        //返回那些已经通过的权限
        @Override
        public void onPermissionsGranted(int requestCode, List<String> perms) {
            Log.d(TAG, "onPermissionsGranted: 权限通过");
            if (requestCode == PERMISSION_REQUEST_CODE_INIT) {
                if (perms.size()==perms_permission.length){
    
                }
            }
        }
    
        //返回那些被拒绝的权限
        @Override
        public void onPermissionsDenied(int requestCode, List<String> perms) {
            Log.d(TAG, "onPermissionsGranted: 权限拒绝");
            if (requestCode == PERMISSION_REQUEST_CODE_INIT) {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("请打开相应权限后再使用此应用");
                builder.setPositiveButton("关闭应用", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        System.exit(0);
                    }
                });
                builder.setCancelable(false);
                builder.create().show();
            }
        }
    }

    安卓本身的权限申请:

    ActivityCompat.requestPermissions(MainActivity.this, perms_permission_storage, PERMISSION_REQUEST_CODE_STORAGE);
  • 相关阅读:
    net应用程序池自动关闭的解决方法
    asp.net 多个txt压缩导出下载
    asp.net 对象转XML,XML转对象
    asp.net Cache缓存的用法
    oracle 增加大字段项
    asp.net简繁体转换
    asp.net 根据连接地址保存文件,图片
    SpringSide从系统全局里面取值
    SpringSide dml操作
    一张表里面形成的树,固定初始化数据
  • 原文地址:https://www.cnblogs.com/zhaozilongcjiajia/p/10855856.html
Copyright © 2011-2022 走看看