/ ANDROID, FILE PROVIDER, CACHE

File Provider Path 디렉리터 영역 매칭

Android 7(N)부터는 넘겨받을 파일경로를 전달하기 위해서는 직접 FileProvider를 정의해야 합니다. 얼마전 기존 프로젝트에 Android 11(R) 대응을 위해 Scoped Storage 적용을 진행하면서 기존 external 영역에 생성한 폴더에서 직접 관리하던 파일들을 cache, files, external(Media/Download)로 구분하는 처리가 추가되었습니다. 이로 인해 external경로 이외에도 파일프로바이더로 제공할 수 있도록 수정이 필요했습니다.

추가 할 수 있는 path의 종류와 가르키는 영역 정리

path directory scope
files-path context.getFilesDir()
cache-path context.getCacheDir()
external-cache-path context.getExternalCacheDir()
external-path Environment.getExternalStorageDirectory()
external-media-path context.getExternalMediaDirs() (only API 21+ Devices)

manifest > provider > meta-data > resource 에 정의한 file_paths.xml 파일을 아래처럼 수정했습니다.

<!-- res/xml/file_paths.xml -->
<path>
    <external-path name="external_files" path="."/>
    <cache-path name="files" path="."/>  #cache 영역 전체(.)를 files라는 이름으로 공유 
</path> 

연관코드

<!--manifest.Xml-->
<manifest>
    <application>
        ...
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true"
            tools:replace="android:authorities">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
        ...
    </application>
</manifest>

public void requestCaptureImage(Activity activity, Uri uri) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
    } else {
        File file = new File(uri.getPath());
        Uri photoUri = FileProvider.getUriForFile(MainApplication.getInstance(), BuildConfig.APPLICATION_ID, file);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
    }
    activity.startActivityForResult(intent, RequestCode.ACTION_IMAGE_CAPTURE.getCode());
}

Error trace

Caused by: java.lang.IllegalArgumentException: Couldn't find meta-data for provider with authority com.mond.al.fileProvider
        at androidx.core.content.FileProvider.parsePathStrategy(FileProvider.java:606)
        at androidx.core.content.FileProvider.getPathStrategy(FileProvider.java:579)
        at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:417)

Search

Get more post