FileProvider

2021. 11. 2. 09:04모바일/Android_Java

FileProvider

안드로이드 targetSdkVersion이 30이되면서 파일 공유체계에 혼란이 있었고 실제로 크게 신경쓰지 않고 개발하다가 문제가 있었다. 이기회를 통해 안드로이드 파일체계에 대해 완벽하게 정리하고자 글을 쓰게되었습니다.

getExternalStorageState()

  • 외부저장소 이용가능 여부 상태 반환
  • 외부 저장소가 컴퓨터에 연결되어 있을 수 있고, 스마트폰과 연결되어 있지 않을 수도 있기 떄문에 호출한다.
  • 이를통해 아래 함수를 호출해서 공유로 사용할 수 있는 경로를 반환한다(안드로이드 11에서 사용 불가)

Environment.getExternalStorageDirectory().getPath()

  • /storage/emulated/0

Environment.getDownloadCacheDirectory().getPath

  • /data/cache

getFilesDir()

  • /data/user/0/프로젝트주소/files

getCacheDir().getPath()

  • /data/user/0/프로젝트주소/cache

getDataDir().getPath()

getApplicationInfo().dataDir

  • /data/user/0/프로젝트주소

getExternalFilesDir(null)

  • /storage/emulated/0/android/data/프로젝트주소/files

getExternalChaceDir().getPath

  • /storage/emulated/0/Android/data/프로젝트주소/cache

FileProvider.getUrilForFile

Android 7(API 24)에서 Intent로 URI 파일 경로를 전달 할 때 "file://" 이 포함되어 있으면 FileUriExposedException 앱이 종료하게 된다.앱간 파일을 공유하려면 "file://" 대신 "content://"로 URI를 보내야 합니다. URI로 데이터를 보내기 위해선 임시 액세스 권한을 부여해야 하고 FileProvider를 이용해야 합니다.

출처: https://mixup.tistory.com/98 [투믹스 작업장]

Android 7.0 부터 변경 되었기 때문에 API 24 이상일때 FileProvider를 사용하도록 합니다.

file 객체를 보면 "/data/user/0/com.example/files/sample.png"라고 경로&파일명이 설정되어 있지만

FileProvider를 이용하여 cameraImageUri 객체에 담게 되면 "content://com.example.fileprovider/files/sample.png"로 변경되어 들어가게 됩니다.

그외 다른경로를 설정하려고 하면 file_paths.xml 파일과 경로 얻는 메소드를 다르게 사용되어야 합니다.

files경로

  • 내부 앱 스토리지
<files-path name="files" path="."/>

Cache 경로

<cache-path name="name" path="path" />

getCacheDir()

  • 외부 경로
<external-path name="name" path="path" />

Environment.getExternalStorageDirectory()

  • 외부 Cache 경로
<external-cache-path name="name" path="path" />

Context.getExternalCacheDir().

  • 외부 미디어 경로

Context.getExternalMediaDirs().

    (외부 미디어 경로 얻어오는 함수(getExternalMediaDirs)는 API 21+ 이상에서만 사용할 수 있다고 합니다. )

출처: https://mixup.tistory.com/98 [투믹스 작업장]

참조 : https://developer.android.com/guide/topics/manifest/provider-element?hl=ko

참조 : https://eunplay.tistory.com/81

URL /URI

  • URI(Uniform resource Identifier) 네트워크 상에서 자원 위치를 알려주기 위한 규약.
    URI의 존재는 인터넷에서 요구되는 기본조건으로서 인터넷 프로토콜에 항상 붙어 다닙니다.
  • URL(Uniform Resource Locator) 통합 자원 식별자로 인터넷에 있는 자원을 나타내는 유일한 주소.
  • URI가 URL의 상위 개념.
    (URL이 URI안에 포함 되어있다고 생각하면 될것 같습니다.
    URI 의 하위 개념으로는 URL 말고 URN도 있음.)

URL 와URI 구분

참고 : https://medium.com/@js230023/url-%EA%B3%BC-uri%EC%9D%98-%EC%B0%A8%EC%9D%B4-154d70814d2a