Newer
Older
SmTIAS-Capture / lib / services / permission_service.dart
import 'package:permission_handler/permission_handler.dart';

/// カメラ・ストレージのパーミッション確認・要求を行うサービス.
class PermissionService {
  /// 直近の [requestCamera] で得たカメラ権限の状態.
  ///
  /// permission_handler_android 14.1.0 以降,Android では
  /// `Permission.status` が `permanentlyDenied` を返さなくなり,
  /// `request()` の結果でのみ永久拒否を判定できるため保持する.
  PermissionStatus? _lastCameraStatus;

  /// カメラ権限を確認し,未許可なら要求する.
  Future<bool> requestCamera() async {
    final status = await Permission.camera.request();
    _lastCameraStatus = status;
    return status.isGranted;
  }

  /// ストレージ権限を確認し,未許可なら要求する.
  Future<bool> requestStorage() async {
    final status = await Permission.storage.request();
    return status.isGranted;
  }

  /// カメラ権限が永久に拒否されているかを返す.
  ///
  /// [requestCamera] 実行後はその結果で判定する(Android では
  /// `Permission.status` から永久拒否を判定できないため).
  Future<bool> isCameraPermanentlyDenied() async {
    final lastStatus = _lastCameraStatus;
    if (lastStatus != null) {
      return lastStatus.isPermanentlyDenied;
    }
    return await Permission.camera.isPermanentlyDenied;
  }

  /// アプリの設定画面を開く.
  Future<void> openSettings() async {
    await openAppSettings();
  }
}