brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Aug 28. 2017

Sharing Content

Sharing Content between Android apps

Sharing Content


안드로이드에서는 특정 콘텐츠를 다른 앱이나 SNS를 통해 공유할 수 있습니다.

이를 위해 안드로이드뿐만 아니라 많은 앱 개발사나 SNS에서는 개발자들을 위한 SDK를 제공하고, 이를 기반으로 손쉽게 구현할 수 있습니다.




Sharing content through specific app


#01 Sharing content through specific app



SNS에 공유하기 버튼을 클릭하면, SNS 선택 창이 나타나게 해주세요.




많은 앱들을 보면 콘텐츠를 어디로 공유할지를 선택하는 커스텀한 UI들이 있습니다.

보통 아래와 같은 이유들로 인해 커스텀한 선택 UI를 이용합니다.


1. 커스텀한 콘텐츠를 공유

#02 Facebook Open graph with custom action


단순 텍스트나 이미지가 아닌, 각 앱이나 SNS에 맞게 커스텀한 콘텐츠를 공유할 수 있습니다.

페이스북을 예로 들면 자신이 방문한 장소의 사진 이미지, 텍스트와 함께 페이스북에서만 이용하는 "방문함"이라는 액션을 추가하여 공유할 수 있습니다.

이 외에도 해쉬 태그나 인용구를 추가하는 등 다양한 콘텐츠를 공유할 수 있는데, 이를 위해서는 커스텀한 선택 UI를 통해 별도의 작업이 필요합니다. 


2. 특정 앱이나 SNS에만 공유

정책이나 여러 이유들로 인해 특정 앱이나 SNS에만 공유해야 하는 경우도 있습니다.

이럴 때는 특정 앱이나 SNS만 선택할 수 있는 UI를 추가해야 합니다.


3. 그냥

잘 모르거나 그냥 별 다른 이유 없이 다른 앱에서 하니까 따라 하는 경우도 있습니다.




사실 콘텐츠를 공유만 할 수 있다면 3번째 이유도 문제는 없습니다. 하지만 안드로이드에서 제공하는 아주 간단하고 쉬운 방법을 두고 굳이 어렵고 복잡하게 개발할 필요는 없어 보입니다.


안드로이드에서 제공하는 ShareCompat을 이용하여 간단하게 구현하는 방법에 대해서 작성하겠습니다.





Sharing content through all apps


#03 Sharing content through all apps


#01 Sharing text

#04 Sharing text with ShareCompat


먼저 ShareCompat는 간단히 말하면 공유 Intent(암시적 Intent)를 만들어 주는 클래스입니다.


텍스트를 공유하기 위해서는 setType(String mimeType) API를 통해 MIME type을 "text/plain"으로 설정해야 합니다. 

그리고 setText(CharSequence text) API를 통해 공유할 텍스트를 설정합니다.

만약 startActivity()로 전송한 공유 인텐트를 처리할 앱이 없다면 호출이 실패하고 앱이 작동 중단됩니다. 이를 방지하기 위해서는 Intent 객체의 resolveActivity()를 호출하여 결과가 null이 아닌 경우 Intent를 처리할 수 있는 앱이 최소한 하나는 있다는 뜻이며, startActivity()를 호출해도 안전합니다. 결과가 null이면 해당 Intent를 사용해서는 안 됩니다.




#02 Sharing HTML text

#04 Sharing HTML text with ShareCompat


HTML 텍스트를 공유하기 위해서는 setType(String mimeType) API를 통해 MIME type을 "text/html"로 설정해야 합니다.

그리고 setHtmlText(String htmlText) API를 통해 공유할 HTML 텍스트를 설정합니다.


이 외에도 여러 API를 통해 주제(Subject)나 이메일 수신자 등 여러 가지 설정을 할 수 있습니다.

자세한 내용은 아래 링크를 참고해 주시기 바랍니다.




#03 Sharing images and files

#05 Sharing an image with ShareCompat


이미지나 파일을 공유하기 위해서는 setStream(Uri streamUri) API를 이용합니다.


이 API에 들어가는 'Uri uriToImage' 변수를 보면 이미지 파일의 경로처럼 보이지만 알고 보면 단순한 이미지 파일의 경로가 아닙니다.

만약 이미지 파일의 경로를 쓴다면 다른 앱들이 접근 가능한 파일명을 써야 하는데, 그러기 위해서는 WRITE_EXTERNAL_STORAGE permission이 필요하고 반대로 앱이 이 정보를 수신할 때 또한 READ_EXTERNAL_STORAGE permission이 꼭 필요합니다. 게다가 Android 6.0 마쉬멜로우에서는 runtime에서 요구되어야 하는 위험한 permission입니다.


이를 회피하기 위해서는 FileProvider 클래스를 이용하여 STORAGE permission을 요구하지 않는 방식으로 이미지 파일들을 공유할 수 있습니다.

Intent의 addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)을 통해 해당 uri의 접근 permission을 보장할 수 있습니다.


FileProvider는 자동으로 파일의 type을 구분하기 때문에 앞서 설명한 text나 html text처럼 MIME type을 별도로 설정할 필요도 없습니다.


FileProvider와 파일 공유법에 대한 자세한 내용은 아래 링크들을 참고해 주시기 바랍니다.




#04 Android default UI for Sharing contents 



ShareCompat을 이용했을 때 나타나는 안드로이드 기본 UI입니다.

왼쪽은 텍스트/html 텍스트, 오른쪽은 이미지/파일 공유 UI입니다.


간단한 코드 몇 줄로 이용 가능한 모든 앱으로 콘텐츠들을 공유할 수 있습니다.

앞서 설명한 커스텀한 콘텐츠나 특정 앱에서만 공유해야 하는 경우가 아니라면, 안드로이드에서 제공하는 기본 기능을 통해 구현하시기 바랍니다.







그동안 암시적 Intent를 이용하여 공유 기능들을 구현했었는데, ShareCompat를 이용하면 더 간단하게 구현할 수 있습니다.

이미 구현되어 있는 코드는 유지하고 앞으로 구현할 코드는 ShareCompat을 이용해야 겠네요.

작가의 이전글 Dialog, Toast, Snackbar
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari