Android (안드로이드)

[Android] 다른 앱에 데이터 공유하기 / 외부 앱에 이미지 공유하기

Oscar:) 2024. 10. 10. 09:00
728x90

 

 

 

다른 앱에 데이터를 공유하는 방법을 알아본다.

공유해볼 데이터는 텍스트와 이미지다.

 

 

 


 

 

 

 

이미지는 갤러리에 저장되어 있는 이미지를 사용할 것이기에,

간단한 사전 세팅이 필요하다.

 

 

 

✅ 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를 사용하여 데이터를 공유해보았다.

위 예제들처럼 간단한 데이터를 공유할 때는 유용하게 사용할 수 있을 것 같다.

 

 

 

728x90