Android 안전한 공유 시트 열기 – ShareCompat 한 줄로 끝내기 (+파일 URI/권한 완벽 가이드)

✨ 개요

안드로이드에서 이미지를 다른 앱으로 공유할 때 가장 간단하고 안전한 방법은 ShareCompat.IntentBuilder를 쓰는 것입니다.
한 줄로 공유 시트를 띄울 수 있고, content:// 권한 처리까지 깔끔하게 해결됩니다.

핵심 한 줄:
ShareCompat.IntentBuilder(context).setType("image/*").setStream(uri).startChooser()

1. 언제 ShareCompat를 써야 할까?

ShareCompatandroidx.core에 포함되어 있으며, 내부적으로 권한 플래그액션 선택을 안전하게 구성해줍니다.


2. 사용법

Gradle 의존성 - 프로젝트가 androidx를 쓴다면 보통 이미 포함되어 있습니다.

dependencies {
    implementation "androidx.core:core-ktx:1.13.1" // or newer
}

단일 이미지 공유

fun shareImage(context: Context, uri: Uri, title: String = "공유하기") {
    ShareCompat.IntentBuilder(context)
        .setType("image/*")
        .setStream(uri)                       // content:// 형태 권장
        .setChooserTitle(title)
        .startChooser()
}

여러 장 이미지 공유

fun shareImages(context: Context, uris: List<Uri>, title: String = "사진 공유") {
    ShareCompat.IntentBuilder(context)
        .setType("image/*")
        .also { builder -> uris.forEach { builder.addStream(it) } }
        .setChooserTitle(title)
        .startChooser()
}

텍스트 + 이미지 함께 공유

fun shareImageWithText(context: Context, uri: Uri, text: String) {
    ShareCompat.IntentBuilder(context)
        .setType("image/*")
        .setText(text)
        .setStream(uri)
        .setChooserTitle("공유하기")
        .startChooser()
}

MediaStore 에서 바로 가져와 공유하기

fun shareMediaStoreImage(context: Context, mediaStoreUri: Uri) {
    ShareCompat.IntentBuilder(context)
        .setType("image/*")
        .setStream(mediaStoreUri)
        .setChooserTitle("공유하기")
        .startChooser()
}

3. 안정성 높이기 : FileProvider로 content URI 만들기

갤러리/다운로드 폴더의 파일을 직접 공유할 때는 file:// 대신 FileProvider로 변환하세요.

AndroidManifest.xml

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

res/xml/file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="images" path="Pictures/" />
    <cache-path name="cache" path="shared/" />
</paths>

File -> content URL 변환

fun fileToContentUri(context: Context, file: File): Uri =
    FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", file)

4. 결론



Related Posts