1. 程式人生 > >解決Android 6.0動態新增許可權問題

解決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();
 
 
 
 
//功能清單必須要新增的許可權