diff --git a/plugin.xml b/plugin.xml
index ae401e389..0ab177b4f 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -55,7 +55,10 @@
+
+
+
permissions = new ArrayList<>();
+
+ if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ // Android API 33 and higher
+ switch (mediaType) {
+ case PICTURE:
+ permissions.add(Manifest.permission.READ_MEDIA_IMAGES);
+ break;
+ case VIDEO:
+ permissions.add(Manifest.permission.READ_MEDIA_VIDEO);
+ break;
+ default:
+ permissions.add(Manifest.permission.READ_MEDIA_IMAGES);
+ permissions.add(Manifest.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
@@ -243,8 +276,13 @@ 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 >= 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
@@ -275,10 +313,9 @@ public void callTakePicture(int returnType, int encodingType) {
} else if (saveAlbumPermission) {
PermissionHelper.requestPermission(this, TAKE_PIC_SEC, Manifest.permission.CAMERA);
} else if (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));
}
}
@@ -1232,6 +1269,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--;
@@ -1391,4 +1429,13 @@ public void onRestoreStateForActivityResult(Bundle state, CallbackContext callba
this.callbackContext = callbackContext;
}
+
+ private boolean hasPermissions(String[] permissions) {
+ for (String permission: permissions) {
+ if (!PermissionHelper.hasPermission(this, permission)) {
+ return false;
+ }
+ }
+ return true;
+ }
}