[플러터] 안드로이드 외부 저장 장치의 파일 목록을 얻으려고하면 디렉토리 만 가져올 수 있습니다.

원인은 실행시의 퍼미션 부족으로, 알고 보면 당연하지만, 구그했을 때에 사례가 발견되지 않고 조금 빠졌으므로, 메모로서 남기기로 했습니다.

디렉토리에서 파일 목록 검색


        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이라는 라이브러리에 의존하고 있어, 셋업이 여러가지 번거롭고, 프로그램 구조도 바뀌어 버리기 때문에, 잠시는 수동으로 처리.

좋은 웹페이지 즐겨찾기