This is an automated email from the ASF dual-hosted git repository.

erisu pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/cordova-plugin-media-capture.git


The following commit(s) were added to refs/heads/master by this push:
     new f21e0a0  feat(android)!: support API 33+ permissions (#262)
f21e0a0 is described below

commit f21e0a0b093f44f90548b5b0fd7ac52d817532e4
Author: ochakov <[email protected]>
AuthorDate: Thu Jul 20 09:52:13 2023 +0300

    feat(android)!: support API 33+ permissions (#262)
    
    * Replace READ_EXTERNAL_STORAGE permission with READ_MEDIA_AUDIO, 
READ_MEDIA_VIDEO and READ_MEDIA_IMAGES
    * Fix READ_MEDIA_* permission on older SDKs
    * Do not request new permissions on older SDKs as they do not support
---
 plugin.xml               |  7 +++++--
 src/android/Capture.java | 37 +++++++++++++++++++++++++------------
 2 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/plugin.xml b/plugin.xml
index 50cb485..1455e80 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -78,8 +78,11 @@ xmlns:android="http://schemas.android.com/apk/res/android";
 
         <config-file target="AndroidManifest.xml" parent="/*">
             <uses-permission android:name="android.permission.RECORD_AUDIO" />
-            <uses-permission 
android:name="android.permission.READ_EXTERNAL_STORAGE" />
-            <uses-permission 
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+            <uses-permission 
android:name="android.permission.READ_MEDIA_AUDIO" />
+            <uses-permission 
android:name="android.permission.READ_MEDIA_IMAGES" />
+            <uses-permission 
android:name="android.permission.READ_MEDIA_VIDEO" />
+            <uses-permission 
android:name="android.permission.READ_EXTERNAL_STORAGE" 
android:maxSdkVersion="32" />
+            <uses-permission 
android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
android:maxSdkVersion="32" />
         </config-file>
 
         <source-file src="src/android/Capture.java" 
target-dir="src/org/apache/cordova/mediacapture" />
diff --git a/src/android/Capture.java b/src/android/Capture.java
index 07b4338..f008eba 100644
--- a/src/android/Capture.java
+++ b/src/android/Capture.java
@@ -19,9 +19,7 @@
 package org.apache.cordova.mediacapture;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.OutputStream;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -79,10 +77,18 @@ public class Capture extends CordovaPlugin {
     private static final int CAPTURE_PERMISSION_DENIED = 4;
     private static final int CAPTURE_NOT_SUPPORTED = 20;
 
-    private static final String[] storagePermissions = new String[]{
-        Manifest.permission.READ_EXTERNAL_STORAGE,
-        Manifest.permission.WRITE_EXTERNAL_STORAGE
-    };
+    private static String[] storagePermissions;
+    static {
+        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+            storagePermissions = new String[]{
+            };
+        } else {
+            storagePermissions = new String[] {
+                Manifest.permission.READ_EXTERNAL_STORAGE,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE
+            };
+        }
+    }
 
     private boolean cameraPermissionInManifest;     // Whether or not the 
CAMERA permission is declared in AndroidManifest.xml
 
@@ -246,15 +252,22 @@ public class Capture extends CordovaPlugin {
         return isMissingPermissions;
     }
 
-    private boolean isMissingStoragePermissions(Request req) {
-        return isMissingPermissions(req, new 
ArrayList<>(Arrays.asList(storagePermissions)));
+    private boolean isMissingPermissions(Request req, String mediaPermission) {
+        ArrayList<String> permissions = new 
ArrayList<>(Arrays.asList(storagePermissions));
+        if (mediaPermission != null && android.os.Build.VERSION.SDK_INT >= 
Build.VERSION_CODES.TIRAMISU) {
+            permissions.add(mediaPermission);
+        }
+        return isMissingPermissions(req, permissions);
     }
 
-    private boolean isMissingCameraPermissions(Request req) {
+    private boolean isMissingCameraPermissions(Request req, String 
mediaPermission) {
         ArrayList<String> cameraPermissions = new 
ArrayList<>(Arrays.asList(storagePermissions));
         if (cameraPermissionInManifest) {
             cameraPermissions.add(Manifest.permission.CAMERA);
         }
+        if (mediaPermission != null && android.os.Build.VERSION.SDK_INT >= 
Build.VERSION_CODES.TIRAMISU) {
+            cameraPermissions.add(mediaPermission);
+        }
         return isMissingPermissions(req, cameraPermissions);
     }
 
@@ -262,7 +275,7 @@ public class Capture extends CordovaPlugin {
      * Sets up an intent to capture audio.  Result handled by 
onActivityResult()
      */
     private void captureAudio(Request req) {
-        if (isMissingStoragePermissions(req)) return;
+        if (isMissingPermissions(req, Manifest.permission.READ_MEDIA_AUDIO)) 
return;
 
         try {
             Intent intent = new 
Intent(android.provider.MediaStore.Audio.Media.RECORD_SOUND_ACTION);
@@ -287,7 +300,7 @@ public class Capture extends CordovaPlugin {
      * Sets up an intent to capture images.  Result handled by 
onActivityResult()
      */
     private void captureImage(Request req) {
-        if (isMissingCameraPermissions(req)) return;
+        if (isMissingCameraPermissions(req, 
Manifest.permission.READ_MEDIA_IMAGES)) return;
 
         // Save the number of images currently on disk for later
         this.numPics = queryImgDB(whichContentStore()).getCount();
@@ -314,7 +327,7 @@ public class Capture extends CordovaPlugin {
      * Sets up an intent to capture video.  Result handled by 
onActivityResult()
      */
     private void captureVideo(Request req) {
-        if (isMissingCameraPermissions(req)) return;
+        if (isMissingCameraPermissions(req, 
Manifest.permission.READ_MEDIA_VIDEO)) return;
 
         Intent intent = new 
Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to