안드로이드 운영 체제에서는 사용자가 갤러리 앱, 웹 브라우저 등에서 "공유하기" 옵션을 선택할 때, 바텀 다이얼로그를 통해 여러 앱을 선택할 수 있도록 지원합니다. 이러한 공유 메커니즘에 자신의 앱을 추가하고 싶다면, 다음과 같이 설정하면 됩니다.
우선, 공유할 Activity가 실행될 때 호출되는 AndroidManifest.xml 파일 내부에 intent-filter를 설정해야 합니다.
<application
...
<activity
android:name=".feature.home.photo.AddPhotoActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
...
</application>
🛠️ 참고: android:exported="true"로 설정해야만 다른 앱에서 이 Activity에 접근할 수 있습니다. 이 설정이 false로 되어있다면 공유하기 리스트에 나의 앱이 보이지 않습니다.
MIME type은 Multipurpose Internet Mail Extensions의 약자로, 파일이나 데이터의 포맷을 설명하는 문자열 식별자입니다. 이는 웹 브라우저, 이메일 클라이언트, 다른 소프트웨어들이 어떻게 특정 형식의 데이터를 처리할 것인지를 결정하는 데 사용됩니다.
MIME type은 일반적으로 type/subtype 형식으로 이루어져 있습니다. 여기서 type은 데이터의 큰 카테고리를 나타내고, subtype은 그 카테고리 내에서의 구체적인 파일 포맷을 나타냅니다.
예시는 다음과 같습니다.
🙋♂️ 현재 저의 사이드 프로젝트에서는 사진 공유 기능을 필요로 하고 있기 때문에 모든 이미지 파일에 접근하기 위해 image/* MIME type을 intent-filter에 선언하였습니다.
- 만약 링크공유라면 text/plain을 사용하시면 됩니다.
Activity에서는 설정한 intent-filter와 일치하는 데이터가 Intent로 전달되면, 아래와 같이 데이터를 핸들링할 수 있습니다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val action: String = intent.action ?:""
val type: String? = intent.type
if (Intent.ACTION_SEND == action && type != null) {
if ("image/*" == type) {
val imageUri = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)
handleSendImage(imageUri)
}
}
}
private fun handleSendImage(imageUri: Uri?) {
if (imageUri != null) {
Timber.d("imageUri: $imageUri")
}
}
intent.action과 intent.type을 확인한 후, 해당 데이터를 적절하게 처리합니다.
해당 사진과 같이 저의 사이드 프로젝트인 Pophory 앱이 갤러리 공유하기 리스트에 뜬 것을 확인할 수 있습니다.