[Android] 공유하기에 내 앱 뜨게 하기(사진 공유, 링크 공유)

곽의진·2023년 9월 12일
4

Android

목록 보기
7/17
post-thumbnail
post-custom-banner

✅ 안드로이드 공유하기란?

안드로이드 운영 체제에서는 사용자가 갤러리 앱, 웹 브라우저 등에서 "공유하기" 옵션을 선택할 때, 바텀 다이얼로그를 통해 여러 앱을 선택할 수 있도록 지원합니다. 이러한 공유 메커니즘에 자신의 앱을 추가하고 싶다면, 다음과 같이 설정하면 됩니다.

✅ 구현하는 방법

내 앱을 공유하기 앱 리스트에서 보여주기

우선, 공유할 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

MIME type은 Multipurpose Internet Mail Extensions의 약자로, 파일이나 데이터의 포맷을 설명하는 문자열 식별자입니다. 이는 웹 브라우저, 이메일 클라이언트, 다른 소프트웨어들이 어떻게 특정 형식의 데이터를 처리할 것인지를 결정하는 데 사용됩니다.

MIME type은 일반적으로 type/subtype 형식으로 이루어져 있습니다. 여기서 type은 데이터의 큰 카테고리를 나타내고, subtype은 그 카테고리 내에서의 구체적인 파일 포맷을 나타냅니다.

예시는 다음과 같습니다.

  • text/plain: 일반 텍스트 파일
  • text/html: HTML 문서
  • image/jpeg: JPEG 이미지 파일
  • audio/mp3: MP3 오디오 파일

🙋‍♂️ 현재 저의 사이드 프로젝트에서는 사진 공유 기능을 필요로 하고 있기 때문에 모든 이미지 파일에 접근하기 위해 image/* MIME type을 intent-filter에 선언하였습니다.

  • 만약 링크공유라면 text/plain을 사용하시면 됩니다.

참고 링크

Activity 에서 intentFilter로 들어온 데이터 핸들링

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 앱이 갤러리 공유하기 리스트에 뜬 것을 확인할 수 있습니다.

profile
Android Developer
post-custom-banner

0개의 댓글