Flutter 개발

Flutter에서 permission_handler 사용법 완벽 가이드

withmilk 2025. 5. 18. 14:13

Flutter로 앱을 만들다 보면 꼭 필요한 기능이 있어요. 바로 사용자에게 권한(permission)을 요청하는 기능인데요. 예를 들어 위치를 가져오거나, 카메라를 켜거나, 마이크를 사용할 때 꼭 권한을 먼저 받아야 해요. 이때 사용하는 게 바로 permission_handler 패키지예요!

 

✅ 이 글에서 배울 내용

  • permission_handler 설치 방법
  • 안드로이드와 iOS 설정
  • 권한 요청 및 상태 확인 코드
  • 실전 예제: 카메라 권한 요청
  • 자주 묻는 질문(FAQ)

📦 permission_handler 설치 방법

pubspec.yaml에 permission_handler 패키지를 추가한 모습

터미널에서 다음 명령어로 설치를 마무리해 주세요.

flutter pub get


혹은 VS Code를 사용해서 개발하시는 분들은, pubspec.yaml 파일을 저장하기만 해도

자동으로 flutter pub get이 실행돼요!

VS Code에서 자동으로 flutter pub get이 실행 완료된 모습.

Output View에서 오른쪽의 토글에서 flutter(project name) 을 클릭해서 탭을 전환해서 확인해보면,

자동으로 flutter pub get --no-example이 실행된 결과를 확인할 수 있습니다.

 

확인해보면 +permission_handler 12.0.0+1 버전이 잘 설치됐어요.

dependencies 설치 중에 에러가 발생하는 것도 이 View를 통해서 확인할 수 있습니다.

 

설치가 끝났다면 이제 각 플랫폼별로 설정을 해줘야 해요.


⚙️ Android와 iOS 설정하기

공식 문서를 따라서 설치를 진행하는 과정을 자세하게 설명해볼게요.

오늘은 2가지 권한을 요청해볼게요. 바로 카메라와 마이크 사용권한이에요.

 

Android

현재 일자 기준으로는 Android는 추가로 설정을 진행할 것이 없어요.

android/app/src/main/AndroidManifest.xml 파일에 pemission_handler 사용을 위해 필요한 권한을 추가해주시면 됩니다.

manifest 태그 밑에 바로 추가해주시면 돼요. <application> 태그 밖에 써주세요!

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

Camera와 Audio Record를 사용하는 앱이라고 manifest파일에 명시한 모습

 

iOS

iOS도 마찬가지로 권한을 설정해야 하지만, iOS에서는 2가지 작업을 진행해주셔야 해요.

먼저 ios/Runner/Info.plist 파일에 permission_handler 사용을 위해 필요한 권한을 일단 설정해볼까요?

Info.plist에는 권한 팝업이 뜰 때 사용자에게 "왜 이 권한이 필요한가?" 에 대해서 설명하는 문구가 필요해요.

여기에 설정한 문구대로 실제로 권한 요청 팝업이 나타날 때 그대로 보여요.

<key>NSCameraUsageDescription</key>
<string>이 앱은 카메라를 사용해야 해요</string>
<key>NSMicrophoneUsageDescription</key>
<string>이 앱은 마이크를 사용해야 해요</string>

Info.plist에 팝업에서 보일 문구를 설정한 모습

 

두번째로는 ios/Podfile에 permission_handler에서 사용하는 매크로 설정을 해줘야 합니다.

공식 문서의 iOS 토글을 열어서, 첫번째 스텝의 target.build_configuration... 부분을 복사해서

아래 사진처럼 똑같이 ios/Podfile의 post_install에 붙여넣어주세요.

Podfile에 macro 설정을 추가한 모습

 

이 작업을 통해서, permission_handler iOS빌드에 내가 어떤 권한을 사용할 것인지 알려주는 거랍니다.

자세히 확인해보면 'PERMISSION_*=1' 이라고 쭉 나열되어있어요.

 

내가 필요한 것 빼고는 다 없애주시면 되는데, "나 이 권한은 안써~" 라고 표시하는 방법은 총 3가지입니다.

  1. 필요한 것 뺴고 삭제한다.
  2. 필요한 것 빼고는 주석 처리해놓는다.
  3. 필요한 것 빼고는 'PERMISSION_*=0'으로 0으로 변경한다.

저희는 카메라랑 마이크빼고는 아래와 같이 다 지워줄게요.

Camera와 Microphone만 사용한다고 기재하고 다 지워준 모습

 

이제 Android와 iOS에서 permission_handler를 사용하기 위한 설정은 다 마쳤습니다.

이제 실제로 코드를 작성해서 권한 요청이 잘 되는지 확인해볼까요?


전체 코드

// permission_request_view.dart

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';

class PermissionRequestView extends StatefulWidget {
  const PermissionRequestView({super.key});

  @override
  _PermissionRequestViewState createState() => _PermissionRequestViewState();
}

class _PermissionRequestViewState extends State<PermissionRequestView> {
  PermissionStatus? _cameraStatus;

  @override
  void initState() {
    super.initState();
  }

  Future<void> _requestCameraPermission() async {
    var status = await Permission.camera.request();
    setState(() {
      _cameraStatus = status;
    });
    if (status.isGranted) {
      print("카메라 접근 허용됨!");
    } else if (status.isPermanentlyDenied) {
      openAppSettings(); // 설정창으로 유도
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                _requestCameraPermission();
              },
              child: Text('카메라 권한 요청'),
            ),
            Text(_cameraStatus.toString()),
          ],
        ),
      ),
    );
  }
}

 

코드 설명

아주 간단한 page를 하나 만들어서 테스트 해볼게요.

권한 요청을 할 수 있는 버튼 하나와 권한 상태를 보여주는 텍스트 두 개의 위젯으로 구성된 화면입니다.

간단한 팝업 테스트 화면

 

버튼을 누르면, Permission.camera.request()를 통해서 권한 요청팝업을 띄우게 돼요.

아까 Info.plist에 적어둔 권한 요청 문구가 잘 보이는 것을 확인할 수 있어요.

권한 요청 팝업

 

유저가 권한을 허용했다면 아래처럼 가운데에 PermissionStatus.granted 상태가 잘 보이게 됩니다.

유저가 권한을 허용한 상태

 

반대로 유저가 권한을 거절했다면 PermissionStatus.isPermanentlyDenied 상태가 표시되면서

openAppSettings함수를 호출해서 자동으로 앱 설정이 열리도록 구현했어요.

사용자가 권한을 거절했을 경우 앱 설정창으로 유도할 수도 있어요. 이 기능도 permission_handler가 지원해줘서 정말 편하답니다.

유저가 권한을 거절한 상태
자동으로 앱 설정이 켜진 모습. 카메라가 허용되지 않았다.


🙋 자주 묻는 질문 (FAQ)

Q. 사용자가 권한을 거절하면 어떻게 해야 하나요?
A. isPermanentlyDenied 상태일 경우 설정창으로 유도할 수 있어요.

Q. 여러 권한을 한 번에 요청할 수 있나요?
A. 네! Permission.camera.request()뿐 아니라

await [Permission.camera, Permission.microphone].request();처럼 배열로 한 번에 요청 가능해요.

같은 코드에서 camera와 microphone을 한 번에 요청하도록 변경한 모습. Map으로 반환된다.


✨ 마무리하며

오늘은 Flutter 앱을 만들 때 꼭 필요한 permission_handler 패키지에 대해서 함께 알아봤어요.

처음엔 권한 요청이 어렵게 느껴질 수 있지만, 하나하나 따라 해보면 생각보다 간단하다는 걸 느끼셨을 거예요 😊

 

앞으로 위치, 카메라, 마이크, 파일 접근 등 다양한 권한을 다뤄야 할 일이 많을 텐데요.

이번 포스트를 잘 참고해서 앱 개발에 자신감을 가져보세요!

다음에는 실전 프로젝트에서 자주 쓰이는 권한 처리 꿀팁이나 에러 대처 방법도 소개해볼게요.

 

혹시 궁금한 점이 있다면 댓글이나 메일로 언제든지 질문해 주세요. 도움이 되었다면 좋아요와 공유도 부탁드려요 🙌
다음 포스트에서 또 만나요!