본문 바로가기

Android - 기능

[Android] 이미지 공유/Text 공유

#What

  • Intent Chooser를 사용해 이미지나 텍스트를 사용자 선택에 따라 다른 앱으로 공유하는 기능
  • 이미지 공유의 경우 이미지 파일을 저장 후 파일 URI 형태로 공유 해야 함
  • 이미지를 앱 전용공간(App-specific storage)에 저장 후 공유하는 형태의 예제((참고로 앱 공용공간(Shared storage)에 저장 시 갤러리에 자동으로 보여지게 됩니다)
  • 앱 전용공간 파일을 공유시 FileProvider 사용 필요

요렇게

 


 

#How - 이미지 공유

1) Maifest에 FileProvider 설정

<application></application> 내부에 추가

autohrities : data를 식별하는 Uri 권한 / 1개 이상 필수 / 여러개는 세미콜론 구분

exported : 다른 애플리케이션에서 Provider를 사용할 수 있는지 여부

grantUriPermissions :  파일을 공유받을 다른 앱에 임시로 Uri 접근(읽기 및 쓰기) 권한을 허용

@xml/filepaths : 공유할 파일 경로 기재

 

[Manifest]

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

 

 

2) @xml/filepaths 생성

  1. path : 공유할 이미지가 저장된 스토리지 Sub 디렉토리 명
    • ex)현 예제 상에서 이미지는 getExternalFilesDir() /ShareImgFolder/ShareImage.jpg 에 저장 되어 있음
  2. name : 보안상의 이유로 사용되며 실제 폴더명 대신 사용됨(contentUri 생성 시)

[filepaths.xml]

<?xml version="1.0" encoding="utf-8"?>
<paths>

    <!--<file-path> =  내부 앱 스토리지 / getFileDir -->
    <!--<cache-path> =  내부 앱 캐시 스토리지 / getCacheDir -->
    <!--<external-files-path> = 외부 앱 전용 스토리지 file / getExternalFilesDir 사용시-->
    <!--<external-cache-path> = 외부 앱 전용 스토리지 cache / getExternalCacheDir 사용시-->
    <!--<external-path> = 공용 외부 저장소 사용 시 / Environment.getExternalStoragyDirectory-->
    //공유할 파일이 저장된 저장소에 따라 tag가 달라짐
<external-files-path name="providerShareImages" path="ShareImgFolder/"/>
</paths>

 

 

3) 이미지 공유 Intent 실행

    /**
     * @param context Context
     * @param bitmap 공유하고자 하는 이미지
     */
    private fun shareImage(context: Context, bitmap: Bitmap) {
        /**
         *1) 이미지 저장(/storage/emulated/0/Android/data/[앱 패키지명]/files/ShareImgFolder)
         */
        val imagePath = File(context.getExternalFilesDir(null)?.absolutePath + "/ShareImgFolder")
        imagePath.mkdirs()
        val filePath = imagePath.absolutePath + "/ShareImage.jpg"
        Utils.saveBitmapToFile(bitmap, filePath, Bitmap.CompressFormat.JPEG) //bitmap 파일저장

        /**
         *2) Share Intent 생성
         */
        val shareIntent = Intent().apply {
            val mediaFile = File(filePath)
            // file extension 으로 부터 타입 추론 ex)image/jpeg
            val mediaType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(mediaFile.extension)
            // Get URI from 'manifest 정의 한 FilepRovider'
            val contentUri =
                FileProvider.getUriForFile(
                    applicationContext,
                    BuildConfig.APPLICATION_ID + ".provider",
                    mediaFile
                )

            // contentUri 셋팅
            // 기타 프로퍼티 설정
            putExtra(Intent.EXTRA_STREAM, contentUri)
            type = mediaType
            action = Intent.ACTION_SEND
            flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
            setDataAndType(contentUri, contentResolver.getType(contentUri));
        }

        /**
         *3) Intent 실행 ->공유할 앱 선택할 수 있는 화면 나타남
         */
        startActivity(Intent.createChooser(shareIntent, ""))
    }

 


 

#How - TEXT 공유 

매우 간단

 

    /**
     * 텍스트 공유
     */
    protected fun shareSayText(shareText: String) {
        val shareIntent = Intent(Intent.ACTION_SEND)
        shareIntent.type = "text/*"
        shareIntent.putExtra(Intent.EXTRA_TEXT, shareText)
        startActivity(Intent.createChooser(shareIntent, ""));
    }

문제 있을시 알려 주세요.

 

좋은 하루 되세요!