Study/Dart,Flutter

[Flutter] Android13 권한 READ_EXTERNAL_STORAGE 와Permission_handler

코딩 잘 할거얌:) 2023. 8. 28. 10:34
반응형

굉장히 오랜만에 블로그 포스팅을 하게되었다.

 

우선. 이번 포스팅은 Android13 권한문제때문에 작성하게되었다.

 

 

Flutter Version

Flutter 3.10.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 796c8ef792 (3 months ago) • 2023-06-13 15:51:02 -0700
Engine • revision 45f6e00911
Tools • Dart 3.0.5 • DevTools 2.23.1

 


기존 권한설정

 

우선 Flutter -Android 에서 핸드폰의 내부데이터를 접근하기위해서 사용하는 권한은 다음과 같다.

 

 

AndroidManifest.xml을 살펴보면

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

와 같은 권한 설정이있는데, 어느순간부터 권한이 잘 되지않는다는 문의가 들어와서 확인을 해보았다.

 

Android13 권한 업데이트 

 

https://developer.android.com/about/versions/13/behavior-changes-13?hl=ko 

 

동작 변경사항: Android 13 이상을 타겟팅하는 앱  |  Android 개발자  |  Android Developers

Android 13 이상을 타겟팅하는 앱에 영향을 미치는 Android 13의 변경사항을 알아봅니다.

developer.android.com

권한이 Android13되면서 업데이트된 내용이 몇몇 있다. 확인해보니, 

 

유저의 핸드폰 내부데이터를 세분화되어 권한을 얻어야한다고 적혀있다. 

 

해결법

 

기존에 사용하던 'android.permission.READ_EXTERNAL_STORAGE' 는 Android12까지만 적용되게 하고, 그 이상부터는 새로 적용되는 권한을 AndroidManifest.xml에 추가하면 된다.

 

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> 

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

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

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

이렇게 작성해주면 끝!... 은 아니고, Flutter에서 사용하는 Permission_handler도 적용해야한다.

 

  _androidStoragePermission() async {
    int androidVersion = 0;
    if (Platform.isAndroid) {
      AndroidDeviceInfo androidInfo = await DeviceInfoPlugin().androidInfo;
      androidVersion = int.tryParse(androidInfo.version.release) ?? 0;
    }

    if (androidVersion > 12) {
      await Permission.photos.request();
      await Permission.videos.request();
      await Permission.audio.request();
    } else {
      await Permission.storage.request();
    }
  }

이렇게 android 버전을 확인해서 분기태워주면 끝이다.

728x90