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

GitToTheHub pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cordova-android.git


The following commit(s) were added to refs/heads/master by this push:
     new 24502178 fix: handle permissions for getUserMedia (#1895)
24502178 is described below

commit 245021782bf4645b0743b5705e59a40e8fbbcaf7
Author: jcesarmobile <[email protected]>
AuthorDate: Fri Apr 24 18:53:30 2026 +0200

    fix: handle permissions for getUserMedia (#1895)
    
    * fix: handle permissions for getUserMedia
    
    * remove unused variable
    
    * address comments
---
 .../cordova/engine/SystemWebChromeClient.java      | 43 +++++++++++++++++++++-
 1 file changed, 42 insertions(+), 1 deletion(-)

diff --git a/framework/src/org/apache/cordova/engine/SystemWebChromeClient.java 
b/framework/src/org/apache/cordova/engine/SystemWebChromeClient.java
index 5539ceb9..bf51dc4d 100755
--- a/framework/src/org/apache/cordova/engine/SystemWebChromeClient.java
+++ b/framework/src/org/apache/cordova/engine/SystemWebChromeClient.java
@@ -23,6 +23,9 @@ import java.io.File;
 import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+
+import android.Manifest;
 import android.app.Activity;
 import android.content.ClipData;
 import android.content.Context;
@@ -45,6 +48,9 @@ import android.webkit.PermissionRequest;
 import android.widget.LinearLayout;
 import android.widget.ProgressBar;
 import android.widget.RelativeLayout;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
 import androidx.core.content.FileProvider;
 
 import org.apache.cordova.CordovaDialogsHelper;
@@ -59,6 +65,12 @@ import org.apache.cordova.LOG;
  */
 public class SystemWebChromeClient extends WebChromeClient {
 
+    private interface PermissionListener {
+        void onPermissionSelect(Boolean isGranted);
+    }
+
+    private final ActivityResultLauncher<String[]> permissionLauncher;
+    private PermissionListener permissionListener;
     private static final int FILECHOOSER_RESULTCODE = 5173;
     private static final String LOG_TAG = "SystemWebChromeClient";
     private long MAX_QUOTA = 100 * 1024 * 1024;
@@ -77,6 +89,15 @@ public class SystemWebChromeClient extends WebChromeClient {
         this.parentEngine = parentEngine;
         appContext = parentEngine.webView.getContext();
         dialogsHelper = new CordovaDialogsHelper(appContext);
+        permissionLauncher = 
parentEngine.cordova.getActivity().registerForActivityResult(new 
ActivityResultContracts.RequestMultiplePermissions(), isGranted -> {
+            if (permissionListener != null) {
+                boolean granted = true;
+                for (Map.Entry<String, Boolean> permission : 
isGranted.entrySet()) {
+                    if (!permission.getValue()) granted = false;
+                }
+                permissionListener.onPermissionSelect(granted);
+            }
+        });
     }
 
     /**
@@ -325,7 +346,27 @@ public class SystemWebChromeClient extends WebChromeClient 
{
     @Override
     public void onPermissionRequest(final PermissionRequest request) {
         LOG.d(LOG_TAG, "onPermissionRequest: " + 
Arrays.toString(request.getResources()));
-        request.grant(request.getResources());
+        List<String> permissionList = new ArrayList<>();
+        if 
(Arrays.asList(request.getResources()).contains("android.webkit.resource.VIDEO_CAPTURE"))
 {
+            permissionList.add(Manifest.permission.CAMERA);
+        }
+        if 
(Arrays.asList(request.getResources()).contains("android.webkit.resource.AUDIO_CAPTURE"))
 {
+            permissionList.add(Manifest.permission.MODIFY_AUDIO_SETTINGS);
+            permissionList.add(Manifest.permission.RECORD_AUDIO);
+        }
+        if (!permissionList.isEmpty()) {
+            String[] permissions = permissionList.toArray(new String[0]);
+            permissionListener = (isGranted) -> {
+                if (isGranted) {
+                    request.grant(request.getResources());
+                } else {
+                    request.deny();
+                }
+            };
+            permissionLauncher.launch(permissions);
+        } else {
+            request.grant(request.getResources());
+        }
     }
 
     public void destroyLastDialog(){


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

Reply via email to