본문 바로가기
Flutter/Package

앱 권한 관리를 손쉽게 해주는 permission_handler 패키지 사용법 가이드

by Maccrey Coding 2024. 7. 16.
728x90
반응형

 

모바일 앱 개발 시 사용자로부터 다양한 권한을 요청하는 경우가 많습니다.

하지만 권한 요청 및 관리 과정은 복잡하고 시간이 많이 소요될 수 있습니다.

permission_handler 패키지는 Flutter 앱에서 권한 요청 및 관리를 간편하게 처리하도록 도와주는 기능을 제공합니다.

이 블로그 글에서는 permission_handler 패키지의 주요 기능, 사용법, 활용 사례 등을 자세히 살펴보겠습니다.

 

1. permission_handler 패키지 소개

 

permission_handler 패키지는 다음과 같은 기능을 제공합니다.

  • 사용자 권한 상태 확인: 앱이 요청할 수 있는 모든 권한의 상태를 확인할 수 있습니다.
  • 권한 요청: 사용자에게 특정 권한을 요청할 수 있습니다.
  • 권한 요청 결과 처리: 사용자가 권한을 허용하거나 거부했을 때 적절한 처리를 수행할 수 있습니다.
  • 권한 설정 열기: 사용자가 앱 설정에서 권한 설정을 변경할 수 있도록 설정 화면을 열 수 있습니다.

2. permission_handler 패키지 설치 및 사용

pub add permission_handler
 
 
import 'package:permission_handler/permission_handler.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 앱 실행 전에 권한 상태 확인
  checkPermissionStatus();

  runApp(MyApp());
}

void checkPermissionStatus() async {
  // 권한 요청 및 결과 처리
  await _requestCameraPermission();
  await _requestLocationPermission();
}

Future<void> _requestCameraPermission() async {
  // 카메라 권한 상태 확인
  final status = await Permission.camera.status;

  // 권한이 거부된 경우 다시 요청
  if (status.isDenied) {
    final result = await Permission.camera.request();
    if (result.isGranted) {
      // 권한 허용 시 처리
      print('Camera permission granted');
    } else {
      // 권한 거부 시 처리
      print('Camera permission denied');
    }
  } else if (status.isPermanentlyDenied) {
    // 설정에서 권한 변경을 안내
    openAppSettings();
  }
}

Future<void> _requestLocationPermission() async {
  // 위치 정보 권한 상태 확인
  final status = await Permission.location.status;

  // 권한이 거부된 경우 다시 요청
  if (status.isDenied) {
    final result = await Permission.location.request();
    if (result.isGranted) {
      // 권한 허용 시 처리
      print('Location permission granted');
    } else {
      // 권한 거부 시 처리
      print('Location permission denied');
    }
  } else if (status.isPermanentlyDenied) {
    // 설정에서 권한 변경을 안내
    openAppSettings();
  }
}
 

3. permission_handler 패키지 활용 사례

  • 카메라 앱: 사진 촬영을 위해 카메라 권한을 요청합니다.
  • 지도 앱: 사용자 위치 정보를 기반으로 지도를 표시하기 위해 위치 정보 권한을 요청합니다.
  • 연락처 앱: 연락처 목록에 접근하기 위해 연락처 권한을 요청합니다.
  • 저장소 앱: 파일 저장 및 읽기를 위해 저장소 권한을 요청합니다.

EX) permission_handler를 사용한 퍼미션 요청 명령어 예시

 

permission_handler 패키지는 Flutter 앱에서 다양한 권한을 간편하게 요청하고 관리하도록 도와줍니다. 이 블로그 글에서는 permission_handler 패키지를 사용하여 앱에서 자주 사용하는 권한을 요청하는 명령어 예시를 살펴보겠습니다.

1. 카메라 권한 요청

import 'package:permission_handler/permission_handler.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 카메라 권한 상태 확인
  checkCameraPermissionStatus();

  runApp(MyApp());
}

Future<void> checkCameraPermissionStatus() async {
  // 카메라 권한이 거부된 경우 다시 요청
  final status = await Permission.camera.status;
  if (status.isDenied) {
    final result = await Permission.camera.request();
    if (result.isGranted) {
      // 권한 허용 시 처리
      print('Camera permission granted');
    } else {
      // 권한 거부 시 처리
      print('Camera permission denied');
    }
  } else if (status.isPermanentlyDenied) {
    // 설정에서 권한 변경을 안내
    openAppSettings();
  }
}
 

설명:

  • Permission.camera.status를 사용하여 카메라 권한의 현재 상태를 확인합니다.
  • 권한이 거부된 경우 Permission.camera.request()를 사용하여 권한을 다시 요청합니다.
  • 사용자가 권한을 허용하면 print('Camera permission granted')를 출력합니다.
  • 사용자가 권한을 거부하면 print('Camera permission denied')를 출력합니다.
  • 사용자가 설정에서 권한을 영구적으로 거부한 경우 openAppSettings()를 사용하여 설정 화면을 엽니다.

2. 위치 정보 권한 요청

import 'package:permission_handler/permission_handler.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 위치 정보 권한 상태 확인
  checkLocationPermissionStatus();

  runApp(MyApp());
}

Future<void> checkLocationPermissionStatus() async {
  // 위치 정보 권한이 거부된 경우 다시 요청
  final status = await Permission.location.status;
  if (status.isDenied) {
    final result = await Permission.location.request();
    if (result.isGranted) {
      // 권한 허용 시 처리
      print('Location permission granted');
    } else {
      // 권한 거부 시 처리
      print('Location permission denied');
    }
  } else if (status.isPermanentlyDenied) {
    // 설정에서 권한 변경을 안내
    openAppSettings();
  }
}
 

설명:

  • Permission.location.status를 사용하여 위치 정보 권한의 현재 상태를 확인합니다.
  • 권한이 거부된 경우 Permission.location.request()를 사용하여 권한을 다시 요청합니다.
  • 사용자가 권한을 허용하면 print('Location permission granted')를 출력합니다.
  • 사용자가 권한을 거부하면 print('Location permission denied')를 출력합니다.
  • 사용자가 설정에서 권한을 영구적으로 거부한 경우 openAppSettings()를 사용하여 설정 화면을 엽니다.

3. 저장소 권한 요청

import 'package:permission_handler/permission_handler.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 저장소 권한 상태 확인
  checkStoragePermissionStatus();

  runApp(MyApp());
}

Future<void> checkStoragePermissionStatus() async {
  // 저장소 권한이 거부된 경우 다시 요청
  final status = await Permission.storage.status;
  if (status.isDenied) {
    final result = await Permission.storage.request();
    if (result.isGranted) {
      // 권한 허용 시 처리
      print('Storage permission granted');
      // 예: 파일 읽기 및 쓰기 작업 수행
      await readAndWriteFile();
    } else {
      // 권한 거부 시 처리
      print('Storage permission denied');
    }
  } else if (status.isPermanentlyDenied) {
    // 설정에서 권한 변경을 안내
    openAppSettings();
  }
}

Future<void> readAndWriteFile() async {
  // 파일 읽기
  final file = await File('myfile.txt').readAsString();
  print('File contents: $file');

  // 파일에 쓰기
  await File('myfile.txt').writeAsString('Hello, world!');
}
 

설명:

  1. import 'package:permission_handler/permission_handler.dart';: permission_handler 패키지를 가져옵니다.
  2. checkStoragePermissionStatus(): 저장소 권한 상태를 확인하는 비동기 함수입니다.
  3. await Permission.storage.status;: 현재 저장소 권한 상태를 가져옵니다.
  4. status.isDenied: 사용자가 저장소 권한을 아직 허용하지 않은 경우입니다.
  5. final result = await Permission.storage.request();: 사용자에게 저장소 권한을 요청합니다.
  6. result.isGranted: 사용자가 저장소 권한을 허용한 경우입니다.
  7. print('Storage permission granted');: 권한 허용 메시지를 출력합니다.
  8. await readAndWriteFile();: (선택 사항) 파일 읽기 및 쓰기 작업을 수행하는 함수를 호출합니다.
  9. print('Storage permission denied');: 사용자가 저장소 권한을 거부한 경우입니다.
  10. status.isPermanentlyDenied: 사용자가 설정에서 저장소 권한을 영구적으로 거부한 경우입니다.
  11. openAppSettings();: 앱 설정 화면을 엽니다. 사용자는 설정에서 직접 권한을 변경할 수 있습니다.
  12. readAndWriteFile(): (선택 사항) 예시 파일 읽기 및 쓰기 작업을 수행하는 함수입니다.

4. 마이크 권한 요청

import 'package:permission_handler/permission_handler.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 마이크 권한 상태 확인
  checkMicrophonePermissionStatus();

  runApp(MyApp());
}

Future<void> checkMicrophonePermissionStatus() async {
  // 마이크 권한이 거부된 경우 다시 요청
  final status = await Permission.microphone.status;
  if (status.isDenied) {
    final result = await Permission.microphone.request();
    if (result.isGranted) {
      // 권한 허용 시 처리
      print('Microphone permission granted');
    } else {
      // 권한 거부 시 처리
      print('Microphone permission denied');
    }
  } else if (status.isPermanentlyDenied) {
    // 설정에서 권한 변경을 안내
    openAppSettings();
  }
}
 

설명:

  • Permission.microphone.status를 사용하여 마이크 권한의 현재 상태를 확인합니다.
  • 권한이 거부된 경우 Permission.microphone.request()를 사용하여 권한을 다시 요청합니다.
  • 사용자가 권한을 허용하면 print('Microphone permission granted')를 출력합니다.
  • 사용자가 권한을 거부하면 print('Microphone permission denied')를 출력합니다.
  • 사용자가 설정에서 권한을 영구적으로 거부한 경우 openAppSettings()를 사용하여 설정 화면을 엽니다.

5. 연락처 권한 요청

import 'package:permission_handler/permission_handler.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 연락처 권한 상태 확인
  checkContactsPermissionStatus();

  runApp(MyApp());
}

Future<void> checkContactsPermissionStatus() async {
  // 연락처 권한이 거부된 경우 다시 요청
  final status = await Permission.contacts.status;
  if (status.isDenied) {
    final result = await Permission.contacts.request();
    if (result.isGranted) {
      // 권한 허용 시 처리
      print('Contacts permission granted');
    } else {
      // 권한 거부 시 처리
      print('Contacts permission denied');
    }
  } else if (status.isPermanentlyDenied) {
    // 설정에서 권한 변경을 안내
    openAppSettings();
  }
}
 

설명:

  • Permission.contacts.status를 사용하여 연락처 권한의 현재 상태를 확인합니다.
  • 권한이 거부된 경우 Permission.contacts.request()를 사용하여 권한을 다시 요청합니다.
  • 사용자가 권한을 허용하면 print('Contacts permission granted')를 출력합니다.
  • 사용자가 권한을 거부하면 print('Contacts permission denied')를 출력합니다.
  • 사용자가 설정에서 권한을 영구적으로 거부한 경우 openAppSettings()를 사용하여 설정 화면을 엽니다.

6. SMS 권한 요청

import 'package:permission_handler/permission_handler.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // SMS 권한 상태 확인
  checkSmsPermissionStatus();

  runApp(MyApp());
}

Future<void> checkSmsPermissionStatus() async {
  // SMS 권한이 거부된 경우 다시 요청
  final status = await Permission.sms.status;
  if (status.isDenied) {
    final result = await Permission.sms.request();
    if (result.isGranted) {
      // 권한 허용 시 처리
      print('SMS permission granted');
      // 예: SMS 메시지 읽기 및 전송 작업 수행
      await readAndSendMessage();
    } else {
      // 권한 거부 시 처리
      print('SMS permission denied');
    }
  } else if (status.isPermanentlyDenied) {
    // 설정에서 권한 변경을 안내
    openAppSettings();
  }
}

Future<void> readAndSendMessage() async {
  // SMS 메시지 읽기
  final messages = await sms.getMessages();
  for (final message in messages) {
    print('Message: ${message.body}');
  }

  // SMS 메시지 전송
  final result = await sms.sendMessage('+1234567890', 'Hello, world!');
  print('SMS sent: ${result.success}');
}

설명:

  1. import 'package:permission_handler/permission_handler.dart';: permission_handler 패키지를 가져옵니다.
  2. checkSmsPermissionStatus(): SMS 권한 상태를 확인하는 비동기 함수입니다.
  3. await Permission.sms.status;: 현재 SMS 권한 상태를 가져옵니다.
  4. status.isDenied: 사용자가 SMS 권한을 아직 허용하지 않은 경우입니다.
  5. final result = await Permission.sms.request();: 사용자에게 SMS 권한을 요청합니다.
  6. result.isGranted: 사용자가 SMS 권한을 허용한 경우입니다.
  7. print('SMS permission granted');: 권한 허용 메시지를 출력합니다.
  8. await readAndSendMessage();: (선택 사항) SMS 메시지 읽기 및 전송 작업을 수행하는 함수를 호출합니다.
  9. print('SMS permission denied');: 사용자가 SMS 권한을 거부한 경우입니다.
  10. status.isPermanentlyDenied: 사용자가 설정에서 SMS 권한을 영구적으로 거부한 경우입니다.
  11. openAppSettings();: 앱 설정 화면을 엽니다. 사용자는 설정에서 직접 권한을 변경할 수 있습니다.
  12. readAndSendMessage(): (선택 사항) 예시 SMS 메시지 읽기 및 전송 작업을 수행하는 함수입니다.

4. 주의 사항

  • permission_handler 패키지는 Flutter 2.0 이상을 지원합니다.
  • 앱이 요청하는 권한은 앱의 기능에 필수적인 경우에만 요청해야 합니다.
  • 사용자는 앱이 요청하는 권한을 거부할 권리가 있습니다.
  • 앱은 사용자가 거부한 권한을 다시 요청하기 전에 충분한 이유를 설명해야 합니다.

5. 마무리: permission_handler로 앱 권한 관리 쉽게 해결하기

 

permission_handler 패키지: 앱 권한 관리의 강력한 동맹

permission_handler 패키지는 Flutter 앱에서 권한 요청 및 관리를 손쉽게 처리하도록 도와주는 필수 도구입니다. 이 블로그 글을 통해 여러분은 다음과 같은 내용을 배우셨습니다.

  • permission_handler 패키지 소개: 주요 기능, 사용법, 활용 사례
  • 사용 단계별 안내: 권한 상태 확인, 권한 요청, 결과 처리
  • 활용 사례: 카메라, 위치 정보, 연락처 등 다양한 권한 관리
  • API: Permission, PermissionStatus, PermissionRequestResult 등 주요 클래스
  • 사용자 정의 권한: 앱에서 사용하는 특정 권한에 대한 더 많은 제어
  • 최신 정보: 공식 문서를 통해 최신 버전과 변경 사항 확인

 

6. permission_handler 패키지 API

 

permission_handler 패키지는 다음과 같은 주요 API를 제공합니다.

  • Permission 클래스: 특정 권한에 대한 정보와 기능을 제공합니다.
  • PermissionStatus 클래스: 권한의 현재 상태를 나타냅니다.
  • PermissionStatus.denied: 사용자가 권한을 거부한 경우
  • PermissionStatus.granted: 사용자가 권한을 허용한 경우
  • PermissionStatus.permanentlyDenied: 사용자가 설정에서 권한을 영구적으로 거부한 경우
  • PermissionStatus.restricted: 사용자가 권한을 사용할 수 없는 경우 (예: 기기 관리자에 의해 제한됨)
  • PermissionStatus.undetermined: 권한 상태가 아직 확인되지 않은 경우
  • PermissionRequestResult 클래스: 권한 요청 결과를 나타냅니다.
  • PermissionRequestResult.granted: 사용자가 권한을 허용한 경우
  • PermissionRequestResult.denied: 사용자가 권한을 거부한 경우
  • PermissionRequestResult.permanentlyDenied: 사용자가 설정에서 권한을 영구적으로 거부한 경우
  • PermissionRequestResult.failed: 권한 요청이 실패한 경우
  • openAppSettings(): 앱 설정 화면을 열 수 있습니다.

7. 사용자 정의 권한

permission_handler 패키지는 사용자 정의 권한을 생성하고 관리하는 기능을 제공합니다. 이 기능을 사용하면 앱에서 사용하는 특정 권한에 대한 더 많은 제어를 할 수 있습니다.

 

8. 최신 정보 및 변경 사항

permission_handler 패키지의 최신 정보 및 변경 사항은 [공식 문서]([유효하지 않은 URL 삭제됨] 확인할 수 있습니다.

 

9. 마무리

permission_handler 패키지는 Flutter 앱에서 권한 요청 및 관리를 손쉽게 처리하는 필수 도구입니다. 이 블로그 글을 통해 permission_handler 패키지의 작동 방식과 활용 방법을 이해하셨기를 바랍니다.

참고 자료:

저는 여러분의 Flutter 앱 개발에 도움이 되는 정보를 제공하기 위해 최선을 다하고 있습니다.

궁금한 점이나 개선할 부분이 있으면 언제든지 말씀해주세요.

728x90
반응형