[플러터] 안드로이드 외부 저장 장치의 파일 목록을 얻으려고하면 디렉토리 만 가져올 수 있습니다.
디렉토리에서 파일 목록 검색
Directory pDir = Directory(_target);
var plist = pDir.listSync();
for( var p in plist ){
print( p.path );
}
파일 일람의 취득에는 Directory 클래스의 listSync()나 list() 메소드를 사용합니다. _target은 대상 디렉토리의 이름을 포함합니다. AndroidManifest.xml에는 외부 스토리지 권한으로 인해 다음 설명이 포함되어 있습니다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
여기서 _target="/storage/emulated/0/DCIM"; 와 외부 스토리지의 이름을 넣어 실행해 보면 다음과 같이 되었습니다.
I/flutter ( 9998): /storage/emulated/0/DCIM/mei
I/flutter ( 9998): /storage/emulated/0/DCIM/Camera
I/flutter ( 9998): /storage/emulated/0/DCIM/.thumbnails
I/flutter ( 9998): /storage/emulated/0/DCIM/LINE
I/flutter ( 9998): /storage/emulated/0/DCIM/Facebook
File 앱으로 확인하면, 이 디렉토리에는 더 여러가지 들어가 있습니다만, plist에는 저장되지 않습니다. 표시되는 모든 디렉토리입니다. "/storage/emulated/0/DCIM"대신에 "/"를 지정하면 다음과 같이 명백하게 권한 예외가 발생합니다. 생각해 버렸습니다.
W/1.ui ( 9998): type=1400 audit(0.0:2766): avc: denied { read } for name="/" dev="dm-4" ino=2 scontext=u:r:untrusted_app:s0:c134,c257,c512,c768 tcontext=u:object_r:rootfs:s0 tclass=dir permissive=0 app=com.example.filer_permission
런타임에 앱에 권한 부여
결론부터 말하면 런타임에 사용자에게 명시적으로 지정하지 않으면 권한을 얻을 수 없다는 지금 당연한 이야기였습니다. 옛날에는 AndroidManifest.xml에 쓰는 것만으로 좋았지 만.
설정 앱 정보에서 타겟 앱 설정을 열면 '권한이 부여되지 않았습니다'라는 메시지가 표시되므로 거기를 클릭하여 필요한 권한을 부여합니다.
미디어에 대한 액세스만 허용을 선택하여 돌아갑니다.
다시 실행하면 이번에는 파일 목록에 여러 가지가 있습니다.
I/flutter (14631): /storage/emulated/0/DCIM/IMG_00000001.jpg
I/flutter (14631): /storage/emulated/0/DCIM/IMG_00000002.jpg
I/flutter (14631): /storage/emulated/0/DCIM/IMG_00000003.jpg
I/flutter (14631): /storage/emulated/0/DCIM/IMG_00000004.jpg
I/flutter (14631): /storage/emulated/0/DCIM/saturdaynight.mp3
I/flutter (14631): /storage/emulated/0/DCIM/Skrillex.mp3
I/flutter (14631): /storage/emulated/0/DCIM/PCM.wav
I/flutter (14631): /storage/emulated/0/DCIM/type3_14.25kbps.amr
I/flutter (14631): /storage/emulated/0/DCIM/type5_18.25kbps.amr
I/flutter (14631): /storage/emulated/0/DCIM/type6_19.85kbps.amr
I/flutter (14631): /storage/emulated/0/DCIM/type7_23.05kbps.amr
I/flutter (14631): /storage/emulated/0/DCIM/type8_23.85kbps.amr
I/flutter (14631): /storage/emulated/0/DCIM/mei
I/flutter (14631): /storage/emulated/0/DCIM/Camera
I/flutter (14631): /storage/emulated/0/DCIM/.thumbnails
I/flutter (14631): /storage/emulated/0/DCIM/LINE
I/flutter (14631): /storage/emulated/0/DCIM/Facebook
아래와 같이 런타임에 필요한 권한이 없을 때 처리를 하는 라이브러리도 있는 것 같습니다만, baseflow.com이라는 라이브러리에 의존하고 있어, 셋업이 여러가지 번거롭고, 프로그램 구조도 바뀌어 버리기 때문에, 잠시는 수동으로 처리.
Reference
이 문제에 관하여([플러터] 안드로이드 외부 저장 장치의 파일 목록을 얻으려고하면 디렉토리 만 가져올 수 있습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/picpie/items/07ac9e9bcd5f77a5a3ac텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)