오늘은 Android 기기에 사진을 저장하기 위한 권한 얻기 과정을 살펴보겠습니다.
이틀에 걸쳐 헤맸던 부분인데, 이 글을 읽으시는 분들에게 도움이 되었으면 좋겠습니다.
1. 필요한 플러그인 받기
우선 오늘 사용할 플러그인들은 device_info_plus, permission_handler입니다.
pub.dev에서 싹 다 받아줍니다.
device_info_plus : android 버전 정보를 얻기 위한 플러그인으로, 버전에 따라 처리 방법을 분기해주기 위함
permission_handler : 앱의 이미지 접근 권한 획득을 위함
2. AndroidManifest.xml 에 태그 추가하기
사용중인 에뮬레이터의 버전별로 필요한 태그를 추가해줍니다.
https://pub.dev/packages/permission_handler
공식 문서에 따르면, Android 13(API 33) 부터는 READ_MEDIA_IMAGES, READ_MEDIA_VIDEO를, 그 이전 버전은 READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE를 쓰라고 나옵니다.
android>app>src>main 경로의 AndroidManifest.xml 경로에 가서 manifest 태그와 application 태그에 밑줄친 부분들을 추가해줍니다.
3. 권한 요청하기
권한을 요청하는 함수는 위처럼 똑같지만, Android 13 이상인 경우와 미만인 경우 permission 인자에 들어가야 하는 값이 다릅니다.
Android 13 이상인 경우 : Permission.photos / Permission.videos 사용
Android 13 미만인 경우 : Permission.storage 사용
간단한 예시 코드 전체와 함께 살펴보겠습니다.
_requestPermission 함수가 비동기식이므로, onPressed 속성에 async 선언을 해주고 인자로 Permission.photos를 넣어줍니다.
낮은 버전일 경우 photos만 storage로 바꿔주면 됩니다.
그러면 정상적으로 권한을 물어봅니다.
4. 권한 요청하기 심화(버전별 케이스 분류)
그런데, 사용자의 버전이 뭔지 모르는 상황이니까 안전하게 기기의 버전 정보를 받아서 그에 맞게 처리해주는게 좋을 것 같습니다. android 버전이 13 이상인 경우와 그 외의 케이스로 분기해봅시다.
이 때, 기기의 버전 정보를 받기 위해 처음에 설치한 device_info_plus를 씁니다.
권한이 없을 경우 앱의 설정 화면을 열어주는 openAppSettings 까지 추가해줬습니다.
don't allow 할 경우 설정 화면으로 잘 열리는 것도 확인이 됩니다.
전체 코드 첨부합니다.
+ 간혹 아래와 같은 에러가 뜨는 경우 flutter clean 혹은 에뮬레이터 재실행을 해보시기 바랍니다.
+ sdk 버전과 관련된 에러가 콘솔창에 뜰 경우, build.gradle에서 요구하는 대로 버전을 바꿔줍시다.
끝.
읽어주셔서 감사합니다.
다음에는 이걸 응용해서 위젯의 스크린샷을 찍고 갤러리에 저장해보겠습니다.
'Flutter' 카테고리의 다른 글
[Flutter] targetSDK API 수준 업데이트하기 (0) | 2025.01.22 |
---|---|
[Flutter] 구글 플레이스토어 비공개 테스트 중에 앱 업데이트 하기 (0) | 2025.01.22 |
만다라트 : 만다라트 양식, 오타니 만다라트 양식, 만다라트 어플 다운, 만다라트 계획표 (0) | 2025.01.20 |
[Flutter] flutter_native_splash 사용하기 (0) | 2025.01.19 |
[Flutter] 로그인 유효성 체크하는 텍스트 폼 만들기 (0) | 2024.12.30 |