플러터에서는 permission_handler로 권한을 얻어온다.

Flutter 앱을 만들던 도중 카메라와 저장소에 접근하여 정보를 얻어올 일이 생겼습니다.

이에 대해 어떻게 해결할지 찾아보다가, pub.dev의 권한 관련 최고 인기작 permission_handler를 통해 문제를 해결했습니다.

지금부터 그 과정을 공유해볼게요 : )

 

permission_handler 적용

일단 늘 그랬듯 pubspec.yaml에 permission_handler를 추가해줍니다.

해당 패키지의 공식 문서는 아래를 참고해주세요.

https://pub.dev/packages/permission_handler

 

pub get을 통해 설치했다면 

android의 경우 android/app/src/main/AndroidManifest.xml 을 열어줍니다.

그리고 <application> 과 들여쓰기를 맞춰서, <application> 위에 다음 태그를 적어줍니다.

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

(다른 권한에 대해서는 위의 공식 페이지를 참고해주세요.)

 

iOS의 경우 info.plist를 수정해야합니다.

아래를 참고하시되 카메라만 수정하실 거라면 Info.plist의 source에 아래 코드 정도만 붙여넣어 주셔도 무방합니다.

(iOS는 External Storage 접근이 불가능합니다.)

https://github.com/Baseflow/flutter-permission-handler/blob/develop/permission_handler/example/ios/Runner/Info.plist

    <key>NSCameraUsageDescription</key>
    <string>camera</string>

 

 

이제, 권한배열에 대한 처리를 해줍시다.

해당 권한들에 대해 statuses는 그 정보를 가지고 있고,

카메라나 저장소 둘 중 어떤 것 중 하나라도 Grant되어 있지 않다면 false입니다.

(이는 안드로이드 기준인데, iOS의 storage는 아마 default로 denied 상태이지 않을까 추측해봅니다.)

Future<bool> _getStatuses() async {
    Map<Permission, PermissionStatus> statuses =
        await [Permission.storage, Permission.camera].request();

    if (await Permission.camera.isGranted &&
        await Permission.storage.isGranted) {
      return Future.value(true);
    } else {
      return Future.value(false);
    }
  }

 

자, 여기까지 했으면 다 했습니다.

저는 다음 글에서 다룰 QR code와 연계하여 이를 활용했는데,

제가 직접 생성한 임의의 버튼을 누르면 아래 _scan 함수가 실행되고,

_scan함수는 _getStautses 함수를 호출하여 permission 요청을 실행합니다.

Future _scan() async {
    await _getStatuses();
    String? qrString = await scanner.scan();
    if (qrString != null) {
      setState(() {
        _qrString = qrString;
      });
    }
  }

 

추가로, 권한 세팅을 거부했을 경우 특히 iOS는 해당 permission을 영구적으로 거부한 것으로 처리하기 때문에 직접 settings에 들어가서 권한을 얻어야 합니다. 이를 위해 openAppSettings() 함수를 호출해줘야 합니다. 자세한 설명은 아래 링크로 들어가셔서 확인해주세요 :)

https://pub.dev/packages/app_settings

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom