Skip to content

Commit b489680

Browse files
authored
[camera] Update Android Camera Access Permission Error Codes (#5640)
1 parent bee3709 commit b489680

File tree

4 files changed

+71
-6
lines changed

4 files changed

+71
-6
lines changed

packages/camera/camera_android/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
## NEXT
1+
## 0.10.0
22

3+
* **Breaking Change** Updates Android camera access permission error codes to be consistent with other platforms. If your app still handles the legacy `cameraPermission` exception, please update it to handle the new permission exception codes that are noted in the README.
34
* Ignores missing return warnings in preparation for [upcoming analysis changes](https://github.com/flutter/flutter/issues/105750).
45

56
## 0.9.8+3

packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,32 @@ interface ResultCallback {
2323
void onResult(String errorCode, String errorDescription);
2424
}
2525

26+
/**
27+
* Camera access permission errors handled when camera is created. See {@code MethodChannelCamera}
28+
* in {@code camera/camera_platform_interface} for details.
29+
*/
30+
private static final String CAMERA_PERMISSIONS_REQUEST_ONGOING =
31+
"CameraPermissionsRequestOngoing";
32+
33+
private static final String CAMERA_PERMISSIONS_REQUEST_ONGOING_MESSAGE =
34+
"Another request is ongoing and multiple requests cannot be handled at once.";
35+
private static final String CAMERA_ACCESS_DENIED = "CameraAccessDenied";
36+
private static final String CAMERA_ACCESS_DENIED_MESSAGE = "Camera access permission was denied.";
37+
private static final String AUDIO_ACCESS_DENIED = "AudioAccessDenied";
38+
private static final String AUDIO_ACCESS_DENIED_MESSAGE = "Audio access permission was denied.";
39+
2640
private static final int CAMERA_REQUEST_ID = 9796;
27-
private boolean ongoing = false;
41+
@VisibleForTesting boolean ongoing = false;
2842

2943
void requestPermissions(
3044
Activity activity,
3145
PermissionsRegistry permissionsRegistry,
3246
boolean enableAudio,
3347
ResultCallback callback) {
3448
if (ongoing) {
35-
callback.onResult("cameraPermission", "Camera permission request ongoing");
49+
callback.onResult(
50+
CAMERA_PERMISSIONS_REQUEST_ONGOING, CAMERA_PERMISSIONS_REQUEST_ONGOING_MESSAGE);
51+
return;
3652
}
3753
if (!hasCameraPermission(activity) || (enableAudio && !hasAudioPermission(activity))) {
3854
permissionsRegistry.addListener(
@@ -90,9 +106,9 @@ public boolean onRequestPermissionsResult(int id, String[] permissions, int[] gr
90106

91107
alreadyCalled = true;
92108
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
93-
callback.onResult("cameraPermission", "MediaRecorderCamera permission not granted");
109+
callback.onResult(CAMERA_ACCESS_DENIED, CAMERA_ACCESS_DENIED_MESSAGE);
94110
} else if (grantResults.length > 1 && grantResults[1] != PackageManager.PERMISSION_GRANTED) {
95-
callback.onResult("cameraPermission", "MediaRecorderAudio permission not granted");
111+
callback.onResult(AUDIO_ACCESS_DENIED, AUDIO_ACCESS_DENIED_MESSAGE);
96112
} else {
97113
callback.onResult(null, null);
98114
}

packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@
55
package io.flutter.plugins.camera;
66

77
import static junit.framework.TestCase.assertEquals;
8+
import static org.mockito.Mockito.mock;
9+
import static org.mockito.Mockito.never;
10+
import static org.mockito.Mockito.verify;
811

912
import android.content.pm.PackageManager;
1013
import io.flutter.plugins.camera.CameraPermissions.CameraRequestPermissionsListener;
14+
import io.flutter.plugins.camera.CameraPermissions.ResultCallback;
1115
import org.junit.Test;
1216

1317
public class CameraPermissionsTest {
@@ -24,4 +28,48 @@ public void listener_respondsOnce() {
2428

2529
assertEquals(1, calledCounter[0]);
2630
}
31+
32+
@Test
33+
public void callback_respondsWithCameraAccessDenied() {
34+
ResultCallback fakeResultCallback = mock(ResultCallback.class);
35+
CameraRequestPermissionsListener permissionsListener =
36+
new CameraRequestPermissionsListener(fakeResultCallback);
37+
38+
permissionsListener.onRequestPermissionsResult(
39+
9796, null, new int[] {PackageManager.PERMISSION_DENIED});
40+
41+
verify(fakeResultCallback)
42+
.onResult("CameraAccessDenied", "Camera access permission was denied.");
43+
}
44+
45+
@Test
46+
public void callback_respondsWithAudioAccessDenied() {
47+
ResultCallback fakeResultCallback = mock(ResultCallback.class);
48+
CameraRequestPermissionsListener permissionsListener =
49+
new CameraRequestPermissionsListener(fakeResultCallback);
50+
51+
permissionsListener.onRequestPermissionsResult(
52+
9796,
53+
null,
54+
new int[] {PackageManager.PERMISSION_GRANTED, PackageManager.PERMISSION_DENIED});
55+
56+
verify(fakeResultCallback).onResult("AudioAccessDenied", "Audio access permission was denied.");
57+
}
58+
59+
@Test
60+
public void callback_doesNotRespond() {
61+
ResultCallback fakeResultCallback = mock(ResultCallback.class);
62+
CameraRequestPermissionsListener permissionsListener =
63+
new CameraRequestPermissionsListener(fakeResultCallback);
64+
65+
permissionsListener.onRequestPermissionsResult(
66+
9796,
67+
null,
68+
new int[] {PackageManager.PERMISSION_GRANTED, PackageManager.PERMISSION_GRANTED});
69+
70+
verify(fakeResultCallback, never())
71+
.onResult("CameraAccessDenied", "Camera access permission was denied.");
72+
verify(fakeResultCallback, never())
73+
.onResult("AudioAccessDenied", "Audio access permission was denied.");
74+
}
2775
}

packages/camera/camera_android/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: camera_android
22
description: Android implementation of the camera plugin.
33
repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_android
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
5-
version: 0.9.8+3
5+
version: 0.10.0
66

77
environment:
88
sdk: ">=2.14.0 <3.0.0"

0 commit comments

Comments
 (0)