티스토리 뷰

CSV 파일을 옮긴다고 가정할때, 두 가지 방법이 있다

  1. MediaStore에 추가한다
    • 단점은 모든 앱에서 사용할 수 있다는 점
  2. 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>

라인별로 살펴보면

  1. android:name 파일 프로바이더 클래스를 AndroidX로 부터 조회한다
  2. android:authorities 안드로이드 시스템에서 다른 프로바이더와 구별되기 위한 유니크 값
    • 보통은 앱의 도메인 이름 + "fileprovider"로 만든다
  3. andorid:exported public 또는 not에 대한 설정
    • public 이면 다른앱에서 다른 권한없이 접근 가능
  4. android:grantUriPermissions 파일에 대한 임시접근을 허용한다
  5. <meta-data> 프로바이더의 공유 경로 설명

그리고 app/res/xml 폴더 아래에 provider_paths.xml 를 생성한다

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <files-path name="share" path="external_files"/>
</paths>
  1. <files-paths> 앱 내부에의 file/directory
  2. <cache-path> 캐시 경로
  3. <external-path> 외부저장소의 root 경로
  4. <external-files-path> 나의 앱의 외부저장소 경로
  5. <external-cache-path> 나의 앱의 외부 캐시 저장소 경로
  6. <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 를 만들고 실행한다

공유 파일이 실행되는 앱에서는 실제 위치를 알지 못한다

요약

  • 파일이 앱 디렉토리에 있는 경우에도 파일을 공유 할 수 있다
  • 파일의 위치는 숨겨지기 때문에 파일 공유에 안전한 접근이다
  • 공유할 파일의 위치와 시기는 사용자가 결정하기 때문에 안전하다

참고

- How To Share Files With Android FileProvider

'개발' 카테고리의 다른 글

JPEG, PNG, BMP  (0) 2019.05.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크