[Flutter] Android / IOS 다운로드 폴더 접근
- 개요 안드로이드에서는 내 파일/Download 폴더 IOS에서는 File, 어플리케이션에서 저장되는 파일을 내 핸드폰에서 확인하고 저장하기 위해서는 아래와 같이 하시면 됩니다. - 예제 [pubspec.yaml] path_pr
islet4you.tistory.com
이전 포스팅에서 외부 폴더에 접근하기 위해서 사용했었는데 앱을 배포할려고 심사를 올린 것이 리젝이 되었습니다.
MediaStore API를 사용하도록 앱을 업데이트하고 모든 파일 액세스(MANAGE_EXTERNAL_STORAGE)권한을 삭제하시기 바랍니다.
물론 보완하도록 url 을 하나 보내줬는데요.
https://developer.android.com/training/data-storage/shared/media
공유 저장소의 미디어 파일에 액세스 | Android 개발자 | Android Developers
DataStore는 로컬 데이터를 저장하는 최신 방법을 제공합니다. SharedPreferences 대신 DataStore를 사용해야 합니다. 자세한 내용은 DataStore 가이드를 참고하세요. 공유 저장소의 미디어 파일에 액세스 컬
developer.android.com
공유 저장소의 미디어 파일에 액세스를 하는 방법을 공유를 해줬습니다.
하지만 현재 개발하고 있는 언어는 Flutter 라서 이 부분을 native로 빼기란 힘들것 같다는 느낌이 들더라구요.
https://pub.dev/packages/media_store_plus
media_store_plus | Flutter Package
To use Android MediaStore API in Flutter, It supports both read & write operation in every android version through flutter.
pub.dev
안드로이드에서 문제가 되었던 부분은 위의 패키지를 가지고 해결을 할 수 있었습니다.
우선 AndroidManifest.xml 에 아래와 같이 넣어줍니다.
<!-- required from API level 33 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- To read images created by other apps -->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <!-- To read audios created by other apps -->
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- To read vidoes created by other apps -->
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE" <!-- To read all files until API level 32 -->
android:maxSdkVersion="32" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" <!-- To write all files until API level 29. We will MediaStore from API level 30 -->
android:maxSdkVersion="29" />
<application
---------------------------
android:requestLegacyExternalStorage="true">
<!-- Need for API level 29. Scoped Storage has some issue in Android 10. So, google recommanded to add this. -->
<!-- Read more from here: https://developer.android.com/training/data-storage/shared/media#access-other-apps-files-->
</application>
소스로 해결한 부분은 아래와 같습니다.
var mediaStorePlugin = MediaStore();
int sdkVersionInt = await mediaStorePlugin.getPlatformSDKInt();
MediaStore.appFolder = '원하는 폴더명';
file = File('임시로저장될폴더/임시로저장될파일명');
file.writeAsBytes(response.bodyBytes);
bool msDownloadResult = await mediaStorePlugin!.saveFile(tempFilePath: file.path,
dirType: DirType.download,
dirName: DirName.download
);
혹시나 저처럼 이런 경우가 생기신 개발자를 위해서 포스팅을 합니다.
도움이 되셨다면 구독부탁드려요 ^^
[햄버거 메뉴]Flutter Drawer 제어방법 (0) | 2023.05.24 |
---|---|
[InAppWebView] Android Intent 처리방법 (0) | 2023.05.24 |
[Flutter] GetX로 페이지 이동시 오류 아닌 오류 (0) | 2023.05.19 |
[Flutter] Safari Debug 하는 방법 (0) | 2023.05.03 |
[Flutter] Http 제어 해보기 (feat. TimeoutException, SocketException) (0) | 2023.04.14 |