코딩하는 일용직 노동자

파일공유시 FileProvider 이용하기. 본문

안드로이드

파일공유시 FileProvider 이용하기.

bacass 2020. 4. 29. 17:26

# 파일공유시 FileProvider 이용하기. FileUriExposedException 해결.

Android 7.0(Nougat / API 24)에서 Intent로 URI 파일 경로 전송시
"file://" 이런식으로 구현되어있으면 FileUriExposedException 오류가 발생하게 되고 앱이 종료됩니다.

앱간 파일을 공유하려면 "file://" 대신 "content://"로 URI를 보내야 합니다.
URI로 데이터를 보내기 위해선 FileProvider 를 이용해야 합니다. 

# 소스파일

var file = File(Environment.getExternalStorageDirectory().path + "/PickNPick/" + it.name)
var uri = FileProvider.getUriForFile(this, "com.aj.pickandpick.fileProvider", file)
Timber.d("Lee uri : $uri")

var intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(uri, "application/pdf")
intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
try {
    startActivity(intent)
} catch (e: Exception) {
    e.printStackTrace()
    showCenterToast("PDF 파일을 보는데 실패하였습니다.")
}

# xml/provider_files

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path
        name="cache"
        path="." /> <!--Context.getCacheDir() 내부 저장소-->
    <files-path
        name="files"
        path="." /> <!--Context.getFilesDir() 내부 저장소-->
    <external-path
        name="external"
        path="."/>  <!--  Environment.getExternalStorageDirectory() 외부 저장소-->
    <external-cache-path
        name="external-cache"
        path="."/> <!--  Context.getExternalCacheDir() 외부 저장소-->
    <external-files-path
        name="external-files"
        path="."/> <!--  Context.getExternalFilesDir() 외부 저장소-->
</paths>

# manifest 에서 아래처럼 설정.

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="com.aj.pickandpick.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true"
    tools:replace="android:authorities">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_files"
        tools:replace="android:resource"/>
</provider>