@@ -89,8 +89,11 @@ public class RNCWebChromeClient extends WebChromeClient implements LifecycleEven
8989
9090 protected boolean mHasOnOpenWindowEvent = false ;
9191
92+ private GrantedPermissionManager grantedPermissionManager ;
93+
9294 public RNCWebChromeClient (RNCWebView webView ) {
9395 this .mWebView = webView ;
96+ this .grantedPermissionManager = new GrantedPermissionManager ();
9497 }
9598
9699 @ Override
@@ -188,12 +191,15 @@ public void onPermissionRequest(final PermissionRequest request) {
188191 }
189192 }
190193
191- if (this .shouldShowRequestPermissionDialog (grantedPermissions )) {
192- String alertMessage = this .getRequestPermissionAlertMessage (request , grantedPermissions );
194+ String host = this .getUrlHostSafely (request );
195+
196+ if (this .shouldShowRequestPermissionDialog (host , grantedPermissions )) {
197+ String alertMessage = this .getRequestPermissionAlertMessage (host , grantedPermissions );
193198
194199 this .showRequestPermissionDialog (
195200 alertMessage ,
196201 (dialog , which ) -> {
202+ grantedPermissionManager .add (host , grantedPermissions );
197203 this .grantOrRequestPermission (request , requestedAndroidPermissions );
198204 },
199205 (dialog , which ) -> {
@@ -206,9 +212,13 @@ public void onPermissionRequest(final PermissionRequest request) {
206212
207213 // CW-22083: 如果網頁要求麥克風或攝影機權限,就顯示權限請求對話框。
208214 // 參數只需要傳入已經被授權的權限即可。未授權的權限會由手機系統的權限請求對話框處理。
209- private boolean shouldShowRequestPermissionDialog (List <String > grantedPermissions ) {
210- return grantedPermissions .contains (PermissionRequest .RESOURCE_AUDIO_CAPTURE ) ||
215+ private boolean shouldShowRequestPermissionDialog (String host , List <String > grantedPermissions ) {
216+ boolean isAudioOrVideo = grantedPermissions .contains (PermissionRequest .RESOURCE_AUDIO_CAPTURE ) ||
211217 grantedPermissions .contains (PermissionRequest .RESOURCE_VIDEO_CAPTURE );
218+ boolean hasUserSeenPermissionDialog = grantedPermissionManager .containsAll (
219+ host ,
220+ grantedPermissions );
221+ return isAudioOrVideo && !hasUserSeenPermissionDialog ;
212222 }
213223
214224 // 如果 requestedAndroidPermissions 為空,表示手機系統已經給予所有權限給 app。app 可以直接 grant 權限給 webview。
@@ -230,7 +240,7 @@ private void grantOrRequestPermission(PermissionRequest request, List<String> re
230240 requestPermissions (requestedAndroidPermissions );
231241 }
232242
233- private String getDisplayHostName (PermissionRequest request ) {
243+ private String getUrlHostSafely (PermissionRequest request ) {
234244 try {
235245 Uri originUri = request .getOrigin ();
236246 return originUri .getHost ();
@@ -239,7 +249,7 @@ private String getDisplayHostName(PermissionRequest request) {
239249 }
240250 }
241251
242- private String getRequestPermissionAlertMessage (PermissionRequest request , List <String > permissions ) {
252+ private String getRequestPermissionAlertMessage (String host , List <String > permissions ) {
243253 List <String > permissionNames = new ArrayList <>();
244254 for (String permission : permissions ) {
245255 switch (permission ) {
@@ -255,7 +265,6 @@ private String getRequestPermissionAlertMessage(PermissionRequest request, List<
255265 }
256266 }
257267
258- String host = this .getDisplayHostName (request );
259268 String permissionNamesJoined = String .join (" and " , permissionNames );
260269
261270 return String .format ("Allow " + host + " to use your " + permissionNamesJoined + "?" );
0 commit comments