diff --git a/plugin.xml b/plugin.xml index 687493d37..a9296f5e8 100644 --- a/plugin.xml +++ b/plugin.xml @@ -54,7 +54,9 @@ - + + + permissions = new ArrayList<>(); + + if (android.os.Build.VERSION.SDK_INT >= 33) { + // if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + // Android API 33 and higher + switch (mediaType) { + case PICTURE: + permissions.add("android.permission.READ_MEDIA_IMAGES"); + break; + case VIDEO: + permissions.add("android.permission.READ_MEDIA_VIDEO"); + break; + default: + permissions.add("android.permission.READ_MEDIA_IMAGES"); + permissions.add("android.permission.READ_MEDIA_VIDEO"); + break; + } + } else { + // Android API 32 or lower + permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE); + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + + if (!storageOnly) { + // Add camera permission when not storage. + permissions.add(Manifest.permission.CAMERA); + } + + return permissions.toArray(new String[0]); + } + private String getTempDirectoryPath() { File cache = cordova.getActivity().getCacheDir(); // Create the cache directory if it doesn't exist @@ -241,8 +274,14 @@ private String getTempDirectoryPath() { * @param encodingType Compression quality hint (0-100: 0=low quality & high compression, 100=compress of max quality) */ public void callTakePicture(int returnType, int encodingType) { - boolean saveAlbumPermission = PermissionHelper.hasPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) - && PermissionHelper.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); + String[] storagePermissions = getPermissions(true, mediaType); + boolean saveAlbumPermission; + if (android.os.Build.VERSION.SDK_INT >= 29) { + // if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + saveAlbumPermission = this.saveToPhotoAlbum ? hasPermissions(storagePermissions) : true; + } else { + saveAlbumPermission = hasPermissions(storagePermissions); + } boolean takePicturePermission = PermissionHelper.hasPermission(this, Manifest.permission.CAMERA); // CB-10120: The CAMERA permission does not need to be requested unless it is declared @@ -273,10 +312,9 @@ public void callTakePicture(int returnType, int encodingType) { } else if (saveAlbumPermission && !takePicturePermission) { PermissionHelper.requestPermission(this, TAKE_PIC_SEC, Manifest.permission.CAMERA); } else if (!saveAlbumPermission && takePicturePermission) { - PermissionHelper.requestPermissions(this, TAKE_PIC_SEC, - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}); + PermissionHelper.requestPermissions(this, TAKE_PIC_SEC, storagePermissions); } else { - PermissionHelper.requestPermissions(this, TAKE_PIC_SEC, permissions); + PermissionHelper.requestPermissions(this, TAKE_PIC_SEC, getPermissions(false, mediaType)); } } @@ -1216,6 +1254,7 @@ private void checkForDuplicateImage(int type) { // delete the duplicate file if the difference is 2 for file URI or 1 for Data URL if ((currentNumOfImages - numPics) == diff) { cursor.moveToLast(); + @SuppressLint("Range") int id = Integer.valueOf(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID))); if (diff == 2) { id--; @@ -1389,4 +1428,13 @@ private String getFileNameFromUri(Uri uri) { String path = external_storage.getAbsolutePath() + partial_path; return path; } + + private boolean hasPermissions(String[] permissions) { + for (String permission: permissions) { + if (!PermissionHelper.hasPermission(this, permission)) { + return false; + } + } + return true; + } }