120 lines
3.2 KiB
Dart
120 lines
3.2 KiB
Dart
import 'dart:io';
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:camera/camera.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:mobdr/core/components/custom_camera_preview.dart';
|
|
import 'package:mobdr/service/shared_prefs.dart';
|
|
|
|
class CameraPage extends StatefulWidget {
|
|
const CameraPage({Key? key, required this.photoFiles}) : super(key: key);
|
|
final List<File> photoFiles;
|
|
@override
|
|
_CameraPageState createState() => _CameraPageState();
|
|
}
|
|
|
|
class _CameraPageState extends State<CameraPage> {
|
|
CameraController? controller;
|
|
late List cameras;
|
|
late int selectedCameraIdx;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
// Remove the constraint when entering, this is ok
|
|
// not to away since the app is in portrait mode by
|
|
// default
|
|
SystemChrome.setPreferredOrientations([
|
|
DeviceOrientation.portraitUp,
|
|
DeviceOrientation.landscapeLeft,
|
|
DeviceOrientation.landscapeRight,
|
|
]);
|
|
|
|
availableCameras().then((availableCameras) {
|
|
cameras = availableCameras;
|
|
if (cameras.isNotEmpty) {
|
|
setState(() {
|
|
selectedCameraIdx = 0;
|
|
});
|
|
_initCameraController(cameras[selectedCameraIdx]).then((void v) {});
|
|
} else {
|
|
print("No camera available");
|
|
}
|
|
}).catchError((err) {
|
|
print('Error: $err.code\nError Message: $err.message');
|
|
});
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
// Dispose the controller when the widget is disposed.
|
|
controller?.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
Future _initCameraController(CameraDescription cameraDescription) async {
|
|
ResolutionPreset getResolutionPresetFromPhotoQuality(String photoQuality) {
|
|
switch (photoQuality) {
|
|
case 'low':
|
|
return ResolutionPreset.low;
|
|
case 'medium':
|
|
return ResolutionPreset.medium;
|
|
case 'high':
|
|
return ResolutionPreset.high;
|
|
case 'veryHigh':
|
|
return ResolutionPreset.veryHigh;
|
|
case 'ultraHigh':
|
|
return ResolutionPreset.ultraHigh;
|
|
case 'max':
|
|
return ResolutionPreset.max;
|
|
default:
|
|
return ResolutionPreset
|
|
.veryHigh; // Default value if quality is not recognised
|
|
}
|
|
}
|
|
|
|
ResolutionPreset resolutionPreset =
|
|
getResolutionPresetFromPhotoQuality(SharedPrefs().photoQuality);
|
|
|
|
if (controller != null) {
|
|
await controller!.dispose();
|
|
}
|
|
|
|
controller = CameraController(cameraDescription, resolutionPreset,
|
|
enableAudio: false);
|
|
controller!.addListener(() {
|
|
if (mounted) {
|
|
setState(() {});
|
|
}
|
|
if (controller!.value.hasError) {
|
|
print('Camera error ${controller!.value.errorDescription}');
|
|
}
|
|
});
|
|
|
|
try {
|
|
await controller!.initialize();
|
|
} on CameraException catch (e) {
|
|
print(e.description);
|
|
}
|
|
|
|
if (mounted) {
|
|
setState(() {});
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
if (controller == null || !controller!.value.isInitialized) {
|
|
return const Center(
|
|
child: CircularProgressIndicator(
|
|
color: Colors.red,
|
|
));
|
|
}
|
|
return CustomCameraPreview(
|
|
photoFiles: widget.photoFiles,
|
|
cameraController: controller!,
|
|
);
|
|
}
|
|
}
|