解决Android 6.0动态添加权限问题

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        checkApiOver23();
    }

    final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
    String[] DANGEROUS_PERMISSIONS = new String[]{

            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_COARSE_LOCATION,

//            READ_PHONE_STATE / WRITE_SETTINGS / WRITE_EXTERNAL_STORAGE / READ_EXTERNAL_STORAGE
//            MOUNT_UNMOUNT_FILESYSTEMS / SYSTEM_ALERT_WINDOW / ACCESS_COARSE_LOCATION / ACCESS_FINE_LOCATION / GET_TASKS / MANAGE_ACCOUNTS
//            READ_LOGS / CALL_PHONE / SET_DEBUG_APP

    };

    @TargetApi(23)
    public void checkApiOver23() {
        LogUtil.d(TAG, "安装版本:" + Build.VERSION.SDK_INT + " | M版本:" + Build.VERSION_CODES.M);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            LogUtil.d(TAG, "开始动态获取权限");
//            下面权限仅需在 Manifest 中声明即可
//            ACCESS_LOCATION_EXTRA_COMMANDS / ACCESS_NETWORK_STATE / ACCESS_NOTIFICATION_POLICY / ACCESS_WIFI_STATE
//            BLUETOOTH / BLUETOOTH_ADMIN / BROADCAST_STICKY / CHANGE_NETWORK_STATE / CHANGE_WIFI_MULTICAST_STATE
//            CHANGE_WIFI_STATE / DISABLE_KEYGUARD / EXPAND_STATUS_BAR / GET_PACKAGE_SIZE / INTERNET / KILL_BACKGROUND_PROCESSES
//            MODIFY_AUDIO_SETTINGS / NFC / READ_SYNC_SETTINGS / READ_SYNC_STATS / RECEIVE_BOOT_COMPLETED / REORDER_TASKS
//            REQUEST_INSTALL_PACKAGES / SET_TIME_ZONE / SET_WALLPAPER / SET_WALLPAPER_HINTS / TRANSMIT_IR / USE_FINGERPRINT
//            VIBRATE / WAKE_LOCK / WRITE_SYNC_SETTINGS / SET_ALARMF / INSTALL_SHORTCUT / UNINSTALL_SHORTCUT

//            版本中需要声明的权限(过滤掉正确权限)
//            READ_PHONE_STATE / WRITE_SETTINGS / WRITE_EXTERNAL_STORAGE / READ_EXTERNAL_STORAGE
//            MOUNT_UNMOUNT_FILESYSTEMS / SYSTEM_ALERT_WINDOW / ACCESS_COARSE_LOCATION / ACCESS_FINE_LOCATION / GET_TASKS / MANAGE_ACCOUNTS
//            READ_LOGS / CALL_PHONE / SET_DEBUG_APP

//            showRequestPermissionAccessCoarseLocation(DANGEROUS_PERMISSIONS);
//            showRequestPermissionWriteSettings();
            insertDummyContactWrapper();
        } else {
            setCommontData(this);
            init();
        }
    }

    @TargetApi(23)
    private void insertDummyContactWrapper() {
        List<String> permissionsNeeded = new ArrayList<String>();

        final List<String> permissionsList = new ArrayList<String>();
        if (!addPermission(permissionsList, Manifest.permission.ACCESS_COARSE_LOCATION)) {
            LogUtil.d(TAG, "动态添加权限1");
            permissionsNeeded.add("Location");
        }
        if (!addPermission(permissionsList, Manifest.permission.READ_PHONE_STATE)) {
            LogUtil.d(TAG, "动态添加权限2");
            permissionsNeeded.add("Read Contacts");
        }
        if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            LogUtil.d(TAG, "动态添加权限3");
            permissionsNeeded.add("Write Contacts");
        }
        if (permissionsList.size() > 0) {
            if (permissionsNeeded.size() > 0) {
                // Need Rationale
                String message = "You need to grant access to " + permissionsNeeded.get(0);
                for (int i = 1; i < permissionsNeeded.size(); i++)
                    message = message + ", " + permissionsNeeded.get(i);
                showMessageOKCancel(message,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
                            }
                        });
                return;
            }
            return;
        }

        insertDummyContact();
    }

    @TargetApi(23)
    private boolean addPermission(List<String> permissionsList, String permission) {
        if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);
            // Check for Rationale Option
            if (!shouldShowRequestPermissionRationale(permission))
                return false;
        }
        return true;
    }

    private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(BaseActivity.this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {
                Map<String, Integer> perms = new HashMap<String, Integer>();
                // Initial
                perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.READ_PHONE_STATE, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                // Fill with results
                for (int i = 0; i < permissions.length; i++)
                    perms.put(permissions[i], grantResults[i]);

                // Check for ACCESS_FINE_LOCATION
                boolean hasDenyPermission = false;
                if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    hasDenyPermission = true;
                    LogUtil.d(TAG, "权限未获取到:" + Manifest.permission.ACCESS_FINE_LOCATION);
                }

                if (perms.get(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                    hasDenyPermission = true;
                    LogUtil.d(TAG, "权限未获取到:" + Manifest.permission.READ_PHONE_STATE);
                }

                if (perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    hasDenyPermission = true;
                    LogUtil.d(TAG, "权限未获取到:" + Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }

                if (!hasDenyPermission) {
                    // All Permissions Granted
                    insertDummyContact();
                } else {
                    // Permission Denied
                    Toast.makeText(BaseActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT).show();
                }
            }
            break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    private void insertDummyContact() {
        setCommontData(this);
        init();
    }

    // ------------------------------------------------------------------

    /**
     * 设置常用变量
     */
    private void setCommontData(Context context) {}
private abstract void init();
 
 
 
 
//功能清单必须要添加的权限
 
 
 

猜你喜欢

转载自blog.csdn.net/zisetiankong123/article/details/51159165
今日推荐