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 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 openSettings() async { await _permissionService.openSettings(); } @override void dispose() { _controller?.dispose(); super.dispose(); } }