본문으로 바로가기

[flutter flow] 화면잠금 기능 구현... ?

category 인턴일지🌱 2025. 4. 23. 15:14

 

과연 flutter flow내에서 가능할 것인가.....

타이머 실행시 화면잠금 기능 구현하기

[ios] 스크린타임에 권한 허용 받아 접근 제한하기 

열품타 같은 앱에서 사용자가 타이머를 실행시키면 다른 앱 접근이 제한된다.
스크린 타임을 통해 구현된 것으로,
앱 진입시 사용자에게 스크린 타임 접근 권한을 묻는다.
권한이 허용되면 아마 다운타임이 켜지는 것 같음.
사용자는 타이머 사용시에도 접근 가능한 앱을 선택할 수 있는데
앱 내에서 이루어지는 게 아니라 허용 앱을 선택하면 
설정 - 스크린타임 - 항상 허용 으로 연결되는 듯 하다. 

스크린 타임 권한이 허용 되었을 때 다운타임을 켜고 끄는 방법은 더 찾아봐야 할 듯 하다. 

https://haram22.tistory.com/73

 

[iOS] DeviceActivity 정리 및 스크린타임 접근 권한, 앱 제한하기

지난 글에 이어 이번에는 DeviceActivity를 어떻게 구현하는지에 대한 글이다.다음 공식 문서를 참고하였다 !https://developer.apple.com/documentation/DeviceActivity DeviceActivity | Apple Developer DocumentationMonitor devic

haram22.tistory.com

 

[android]

안드로이드에서는 UsageStatsManager로 현재 실행중인 앱을 확인하고
유튜브나 크롬이 실행중이면 차단할 수 있다고 한다.

dependencies:
  usage_stats: ^0.2.0
import 'package:usage_stats/usage_stats.dart';

Future<void> getCurrentApp() async {
  bool permissionGranted = await UsageStats.checkUsagePermission();
  if (!permissionGranted) {
    UsageStats.grantUsagePermission();
    return;
  }

  DateTime endDate = DateTime.now();
  DateTime startDate = endDate.subtract(Duration(seconds: 10));

  List<UsageInfo> usageStats = await UsageStats.queryUsageStats(startDate, endDate);

  usageStats.sort((a, b) => b.lastTimeUsed!.compareTo(a.lastTimeUsed!));
  String? topPackageName = usageStats.first.packageName;

  print('현재 실행 중인 앱: $topPackageName');
}

 

현재 사용자가 실행 중인 앱을 감지하는 코드 

 

dependencies:
  flutter_overlay_window: ^0.2.0
import 'package:flutter_overlay_window/flutter_overlay_window.dart';

Future<void> showOverlay() async {
  final permission = await FlutterOverlayWindow.isPermissionGranted();
  if (!permission) {
    await FlutterOverlayWindow.requestPermission();
  }

  await FlutterOverlayWindow.showOverlay(
    height: 600,
    width: 400,
    alignment: OverlayAlignment.center,
    enableDrag: false,
    flag: OverlayFlag.focusPointer,
  );
}

 

오버레이를 띄우는 코드 

 

void startFocusTimer(Duration duration) {
  Timer.periodic(Duration(seconds: 2), (timer) async {
    final currentApp = await getCurrentApp();
    if (isBlockedApp(currentApp)) {
      showOverlay(); // 차단 화면 띄우기
    }

    if (timer.tick * 2 >= duration.inSeconds) {
      timer.cancel();
      removeOverlay(); // 타이머 종료 시 오버레이 제거
    }
  });
}

 

타이머가 작동중일 때 오버레이를 띄우는 코드 

 

하지만 android와 ios 코드를 다르게 작성할 순 없는 법.....
우째야할까.....