[camera] Support Android 30 (#3299)
diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md
index c9f9dd0..b07e3b8 100644
--- a/packages/camera/camera/CHANGELOG.md
+++ b/packages/camera/camera/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.5.8+17
+
+* Added Android 30 support.
+
## 0.5.8+16
* Moved package to camera/camera subdir, to allow for federated implementations.
diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java
index 2384393..9cf111b 100644
--- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java
+++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java
@@ -4,6 +4,7 @@
import static io.flutter.plugins.camera.CameraUtils.computeBestPreviewSize;
import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.ImageFormat;
@@ -16,12 +17,16 @@
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureFailure;
import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.params.OutputConfiguration;
+import android.hardware.camera2.params.SessionConfiguration;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.CamcorderProfile;
import android.media.Image;
import android.media.ImageReader;
import android.media.MediaRecorder;
import android.os.Build;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
import android.util.Size;
import android.view.OrientationEventListener;
import android.view.Surface;
@@ -39,6 +44,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.Executors;
public class Camera {
private final SurfaceTextureEntry flutterTexture;
@@ -325,12 +331,42 @@
}
};
- // Collect all surfaces we want to render to.
- List<Surface> surfaceList = new ArrayList<>();
- surfaceList.add(flutterSurface);
- surfaceList.addAll(remainingSurfaces);
// Start the session
- cameraDevice.createCaptureSession(surfaceList, callback, null);
+ if (VERSION.SDK_INT >= VERSION_CODES.P) {
+ // Collect all surfaces we want to render to.
+ List<OutputConfiguration> configs = new ArrayList<>();
+ configs.add(new OutputConfiguration(flutterSurface));
+ for (Surface surface : remainingSurfaces) {
+ configs.add(new OutputConfiguration(surface));
+ }
+ createCaptureSessionWithSessionConfig(configs, callback);
+ } else {
+ // Collect all surfaces we want to render to.
+ List<Surface> surfaceList = new ArrayList<>();
+ surfaceList.add(flutterSurface);
+ surfaceList.addAll(remainingSurfaces);
+ createCaptureSession(surfaceList, callback);
+ }
+ }
+
+ @TargetApi(VERSION_CODES.P)
+ private void createCaptureSessionWithSessionConfig(
+ List<OutputConfiguration> outputConfigs, CameraCaptureSession.StateCallback callback)
+ throws CameraAccessException {
+ cameraDevice.createCaptureSession(
+ new SessionConfiguration(
+ SessionConfiguration.SESSION_REGULAR,
+ outputConfigs,
+ Executors.newSingleThreadExecutor(),
+ callback));
+ }
+
+ @TargetApi(VERSION_CODES.LOLLIPOP)
+ @SuppressWarnings("deprecation")
+ private void createCaptureSession(
+ List<Surface> surfaces, CameraCaptureSession.StateCallback callback)
+ throws CameraAccessException {
+ cameraDevice.createCaptureSession(surfaces, callback, null);
}
public void startVideoRecording(String filePath, Result result) {
diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml
index 7088faf..f2151fc 100644
--- a/packages/camera/camera/pubspec.yaml
+++ b/packages/camera/camera/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin for getting information about and controlling the
camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video,
and streaming image buffers to dart.
-version: 0.5.8+16
+version: 0.5.8+17
homepage: https://github.com/flutter/plugins/tree/master/packages/camera/camera
dependencies: