투케이2K

491. (kotlin/코틀린) [유틸 파일] goAppInnerFileShareIntent : 앱 내부 저장소 파일 공유 - Intent.createChooser 본문

Kotlin

491. (kotlin/코틀린) [유틸 파일] goAppInnerFileShareIntent : 앱 내부 저장소 파일 공유 - Intent.createChooser

투케이2K 2024. 4. 24. 20:02

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Kotlin

 

[소스 코드]

 

        // -----------------------------------------------------------------------------------------
        // TODO [SEARCH FAST] : [goAppInnerFileShareIntent] : 앱 내부 저장소 파일 공유 수행
        // -----------------------------------------------------------------------------------------
        fun goAppInnerFileShareIntent(mContext: Context, path: String, mime: String) {

            /**
             * // -----------------------------------------
             * [goAppInnerFileShareIntent 메소드 설명]
             * // -----------------------------------------
             * 1. 앱 내부 저장소 파일 공유 수행
             * // -----------------------------------------
             * 2. 호출 방법 :
             *
             * var filePath = filesDir.absolutePath // [/data/user/0/com.example.javaproject/files]
             * filePath += "/test.txt"
             *
             * C_Intent.goAppInnerFileShareIntent(this@A_Intro, filePath, "text/plain")
             *
             * // -----------------------------------------
             * 3. 주의 사항 :
             *
             * 앱 내부 저장소가 아닌 외부 저장소 및 공용 저장소 파일을 공유하기 수행 시 [첨부할 수 없습니다. 지원되지 않는 파일입니다] 메시지 표시
             *
             * >> 앱 내부 저장소는 특별한 권한이 없어도 파일 읽기 및 쓰기 가능
             * // -----------------------------------------
             * 4. TODO 사전 설정 준비 사항
             *
             * - AndroidManifest.xml 파일에 provider 지정
             * <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/provider_paths" />
             * </provider>
             *
             * - provider 파일에서 path 설정 필요
             * <?xml version="1.0" encoding="utf-8"?>
             * <paths xmlns:android="http://schemas.android.com/apk/res/android">
             *     <files-path name="files" path="."/>
             *     <external-files-path name="external_files_path" path="." />
             *     <external-path name="external_files" path="."/>
             * </paths>
             *
             * // -----------------------------------------
             */

            try {
                // ===============================================================
                S_Log._D_("앱 내부 저장소 파일 공유 수행 인텐트 이동 실시", null)
                // ===============================================================
                if (C_Util.stringNotNull(path) === true && C_Util.stringNotNull(mime)) {

                    // -----------------------------------------------------
                    // [File 생성]
                    // -----------------------------------------------------
                    val file = File(path)

                    if (file.exists() == false) { // [해당 파일이 존재 하지 않음]
                        // ===============================================================
                        S_Log._E_("앱 내부 저장소 파일 공유 수행 인텐트 이동 실패", arrayOf("ERROR : file not exists"))
                        // ===============================================================
                        return
                    }


                    // -----------------------------------------------------
                    // [URL 지정]
                    // -----------------------------------------------------
                    val fileUri = FileProvider.getUriForFile(mContext, mContext.packageName + ".provider", file)


                    // -----------------------------------------------------
                    // [Intent 지정]
                    // -----------------------------------------------------
                    val intentShareFile = Intent(Intent.ACTION_SEND)
                    intentShareFile.type = mime // TODO [mime 파일 타입]
                    intentShareFile.putExtra(Intent.EXTRA_STREAM, fileUri) // TODO [파일 주소]
                    //intentShareFile.putExtra(Intent.EXTRA_SUBJECT, "My subject");
                    // intentShareFile.putExtra(Intent.EXTRA_TEXT, "My text");
                    mContext.startActivity(Intent.createChooser(intentShareFile, "Choose")) // TODO [파일 공유]

                } else {
                    // ===============================================================
                    S_Log._E_("앱 내부 저장소 파일 공유 수행 인텐트 이동 실패", arrayOf("ERROR : path , mime null"))
                    // ===============================================================
                }

            } catch (e: Exception) {
                S_Log._printStackTrace_(mContext, S_FinalMsg.LOG_BUG_STATE, null, e)
            }
        }

 

반응형
Comments