티스토리 뷰
CSV 파일을 옮긴다고 가정할때, 두 가지 방법이 있다
MediaStore에 추가한다- 단점은 모든 앱에서 사용할 수 있다는 점
- ContentProvider를 사용하면 수신 애플리케이션에 필요한 파일에 액세스 할 수 있는 올바른 권한이 있는지 확인한다
- ContentProvider를 만드는 쉬운 방법은 Android FileProvider를 사용하는 것
Android FileProvider 예제
- Android FileProvider 는 ContentProvider의 하위 클래스
- content:// Uri 대신 file:// 방식의 Uri를 만들어야 한다
- 파일의 content만 노출되어 실제 위치는 가려지기 때문에 이 방식은 더 안전한다
FielProvider는 사실 ContentProvider이고 AndroidManifest.xml에서 추가된다
<application
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.vladsonkin.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
라인별로 살펴보면
- android:name 파일 프로바이더 클래스를 AndroidX로 부터 조회한다
- android:authorities 안드로이드 시스템에서 다른 프로바이더와 구별되기 위한 유니크 값
- 보통은 앱의 도메인 이름 + "fileprovider"로 만든다
- andorid:exported public 또는 not에 대한 설정
- public 이면 다른앱에서 다른 권한없이 접근 가능
- android:grantUriPermissions 파일에 대한 임시접근을 허용한다
- <meta-data> 프로바이더의 공유 경로 설명
그리고 app/res/xml 폴더 아래에 provider_paths.xml 를 생성한다
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="share" path="external_files"/>
</paths>
- <files-paths> 앱 내부에의 file/directory
- <cache-path> 캐시 경로
- <external-path> 외부저장소의 root 경로
- <external-files-path> 나의 앱의 외부저장소 경로
- <external-cache-path> 나의 앱의 외부 캐시 저장소 경로
- <external-media-path> 나의 앱의 미디어 저장소 경로
그리고 아래와 같이 작성하여 파일을 공유할 수 있다
val csvUri = FileProvider.getUriForFile(this, getPackageName(), csvFile)
val intent = ShareCompat.IntentBuilder.from(this)
.setStream(csvUri)
.setType("text/csv")
.intent
.setAction(Intent.ACTION_SEND)
.setDataAndType(csvUri, "text/csv")
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
startActivity(intent)
여기서 FileProvider의 도움으로 file Uri 를 가져올 수 있다
share intent 를 만들고 실행한다
공유 파일이 실행되는 앱에서는 실제 위치를 알지 못한다
요약
- 파일이 앱 디렉토리에 있는 경우에도 파일을 공유 할 수 있다
- 파일의 위치는 숨겨지기 때문에 파일 공유에 안전한 접근이다
- 공유할 파일의 위치와 시기는 사용자가 결정하기 때문에 안전하다
참고
'개발' 카테고리의 다른 글
JPEG, PNG, BMP (0) | 2019.05.09 |
---|
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크