다른 앱에 데이터를 공유하는 방법을 알아본다.
공유해볼 데이터는 텍스트와 이미지다.
이미지는 갤러리에 저장되어 있는 이미지를 사용할 것이기에,
간단한 사전 세팅이 필요하다.
✅ Manifest 파일에 Permission & FileProvider 설정
AndroidManifest.xml
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
...
<application>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="{패키지 경로}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepath" />
</provider>
</application>
API LEVEL 33부터 저장소 관련 권한이 READ_MEDIA_IMAGES로 변경되었다.
33 미만의 경우는 포스팅 하지 않는다.
✅ FileProvider xml 파일 세팅
위 Manifest 파일의 meta-data 내용을 보면,
android:resource="@xml/filepath" 라고 작성해 놓았다.
[res] → [xml] 경로 안에 filepath.xml 파일을 생성해주자.
filepath.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="test_path" path="." />
</paths>
위 파일의 내용은 지금으로서는 딱히 중요하지 않다.
일단은 공유할 파일명에 "test_path" 가 포함될 것이다 정도로만 알고 있으면 된다.
✅ Permission 요청 세팅
private fun checkPermission() {
TedPermission.create()
.setPermissionListener(object : PermissionListener {
override fun onPermissionGranted() {
shareImage()
}
override fun onPermissionDenied(deniedPermissions: List<String>) {
Log.d(TAG, "onPermissionDenied: 권한 거부됨")
}
})
.setDeniedMessage("권한을 허용해 주셔야\n사용 가능합니다.")
.setPermissions(android.Manifest.permission.READ_MEDIA_IMAGES)
.check()
}
테드 퍼미션 라이브러리를 사용하여 간단히 권한 요청을 해주었다.
✅ Intent 사용하여 외부 앱에 이미지 공유
필자의 개인 폰에 저장되어 있는 이미지를 사용할 것이며,
갤러리 내 이미지 상세정보에서 경로와 파일명을 파악해놓자.
private fun shareImage() {
try {
val file = Environment.getExternalStoragePublicDirectory("${Environment.DIRECTORY_DCIM}/Camera/20241006_134150.jpg")
val fileUri = FileProvider.getUriForFile(this, "{패키지 경로}.provider", file)
Intent().apply {
setAction(Intent.ACTION_SEND)
setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
putExtra(Intent.EXTRA_STREAM, fileUri)
setDataAndType(fileUri, "image/jpg")
startActivity(Intent.createChooser(this, "공유하기"))
}
} catch (e: Exception) {
// 작업 실패 시 예외 처리
}
}
Intent.ACTION_SEND를 사용하여 외부 앱에 데이터를 공유할 수 있다.
※ 갤러리에 있는 이미지만 공유할 수 있나요?
Intent에 적용된 데이터를 보면 알겠지만,
파일의 URI만 알면 다른 방식으로도 이미지를 공유할 수 있다.
예를 들면 화면 스크린 샷을 찍고 공유할 수도 있고,
카메라로 찍은 사진의 URI를 가지고 공유할 수도 있다.
'공유하기'가 메인인 포스팅이므로
스크린 샷, 카메라로 사진 찍기 등은 별도 포스팅으로 대체한다.
✅ Android Sharesheet
Intent.createChooser() 메서드를 호출하면 Android Sharesheet 라는 UI를 만날 수 있다.
Android Sharesheet는 공유할 수 있는 앱을 자동으로 추천해준다.
대표적으로 카톡, 문자메시지 등이 포함된다.
✅ 이미지 전송된 카카오톡 화면
하찮은 내 앱에서 카톡으로 이미지 공유에 성공했다.
✅ 텍스트 데이터 공유
private fun shareText() {
Intent().apply {
setAction(Intent.ACTION_SEND)
setType("text/plain")
putExtra(Intent.EXTRA_TEXT, "텍스트 공유하기!")
startActivity(Intent.createChooser(this, "공유하기"))
}
}
이미지를 공유하는 예제에서 형식만 조금 수정해주면 된다.
MIME 타입을 "text/plain"으로 변경해주고, Extra 값도 변경해준다.
✅ 텍스트 전송된 카카오톡 화면
텍스트도 공유된 것을 확인할 수 있다.
Intent를 사용하여 데이터를 공유해보았다.
위 예제들처럼 간단한 데이터를 공유할 때는 유용하게 사용할 수 있을 것 같다.
'Android (안드로이드)' 카테고리의 다른 글
[Android] 화면 스크린샷 찍고 갤러리에 저장하기 (0) | 2024.11.25 |
---|---|
[Android] 갤러리에서 이미지 불러오기 (15) | 2024.11.13 |
[Android] 프로젝트에 다국어 지원하기 strings.xml / strings.xml ←→ 스프레드 시트 변환 (8) | 2024.10.09 |
[Android] QR코드 스캔 · 생성 라이브러리 - ZXing 사용해보기 / 스캔 화면 세로모드 고정 (2) | 2024.10.04 |
[Android] 앱 상태 확인하기 / 백그라운드 · 포그라운드 체크 / 현재 최상위 액티비티 확인 / 현재 최상위 프래그먼트 확인 (2) | 2024.10.03 |