import 'package:camera/camera.dart';
import 'package:flutter/foundation.dart';
import 'package:mini_tias/services/permission_service.dart';
/// カメラの初期化・プレビュー制御・撮影実行・ライフサイクルを管理する.
class CameraProvider extends ChangeNotifier {
final PermissionService _permissionService = PermissionService();
CameraController? _controller;
bool _isInitialized = false;
String? _errorMessage;
bool _permissionDenied = false;
bool _permissionPermanentlyDenied = false;
CameraController? get controller => _controller;
bool get isInitialized => _isInitialized;
String? get errorMessage => _errorMessage;
bool get permissionDenied => _permissionDenied;
bool get permissionPermanentlyDenied => _permissionPermanentlyDenied;
/// カメラを初期化する.
Future<void> initialize() async {
final granted = await _permissionService.requestCamera();
if (!granted) {
_permissionDenied = true;
_permissionPermanentlyDenied = await _permissionService
.isCameraPermanentlyDenied();
_errorMessage = 'カメラの権限が必要です';
notifyListeners();
return;
}
_permissionDenied = false;
_permissionPermanentlyDenied = false;
try {
final cameras = await availableCameras();
final frontCamera = cameras.firstWhere(
(c) => c.lensDirection == CameraLensDirection.front,
);
_controller = CameraController(
frontCamera,
ResolutionPreset.max,
enableAudio: false,
);
await _controller!.initialize();
await _controller!.setFlashMode(FlashMode.off);
_isInitialized = true;
_errorMessage = null;
} catch (e) {
_errorMessage = 'カメラの初期化に失敗しました: $e';
_isInitialized = false;
}
notifyListeners();
}
/// カメラリソースを解放する.
void disposeCamera() {
_controller?.dispose();
_controller = null;
_isInitialized = false;
notifyListeners();
}
/// アプリの設定画面を開く(権限が永久拒否された場合).
Future<void> openSettings() async {
await _permissionService.openSettings();
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
}