#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 생성
- path : 공유할 이미지가 저장된 스토리지 Sub 디렉토리 명
- ex)현 예제 상에서 이미지는 getExternalFilesDir() /ShareImgFolder/ShareImage.jpg 에 저장 되어 있음
- 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, ""));
}
문제 있을시 알려 주세요.
좋은 하루 되세요!
'Android - 기능' 카테고리의 다른 글
[Android] 바(Bar) 프로그레스 애니메이션 (0) | 2022.03.14 |
---|---|
[Android] 원형(Circle) 프로그레스 애니메이션 (0) | 2022.02.25 |
[Andoird] 카메라 촬영/갤러리 이미지 가져오기 (0) | 2021.11.24 |
[Android] startActivityForResult @deprecated (0) | 2021.11.17 |
[Android] OutLineTextView - 글자 외곽선 더하기 (1) | 2021.11.14 |