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://example.com 의 경우 https://example.com 이라는 서버를 나타내기 때문에 URL이면서 URI
- https://example.com/skin 의 경우 example 서버의 skin이라는 인터넷상의 자원의 위치를 의미하기에 URL 이면서 URI
- https://example.com/one/two/abc.html 의 경우 example 서버의 one/two 디렉토리 아래의 abc.html을 가리키므로 URL이면서 URI
- https://example.com/123 의 경우 좀 다르다. 여기서 URL은 https://example.com까지이고, 내가 원하는 정보에 도달하기위해 123이라는 식별자가 필요하다.
즉, URI 이지만 URL은 아닌 것이다. - https://example.com/one?id=123 의 경우도 마찬가지로 URL은 https://example.com/one 까지이고 내가 원하는 정보에 도달하기 위해서는 ?id=123이라는 식별자가 필요한 것이다.
이또한 URI이지만 URL은 아닌것.
참고 : https://medium.com/@js230023/url-%EA%B3%BC-uri%EC%9D%98-%EC%B0%A8%EC%9D%B4-154d70814d2a