brunch

You can make anything
by writing

C.S.Lewis

by 장대희 May 30. 2016

외부 앱에서 받은 Intent로 에디터 띄우기

내 앱에서 text 또는 image 받기

Android는 Intent를 통해서 할 수 있는 것이 매우 다양하다.

아래 링크는 내가 과거에 간단하게 설명한 Intent 자료이다.(볼륨을 적당히 키우시길... ^^;)

https://prezi.com/koo8tjoozgya/android_app_intent/

아주 자세한 것은 Developer Site를 참조하길 바란다.

https://developer.android.com/reference/android/content/Intent.html




여기서 오늘은 외부 앱에서 이미지를 내 앱으로 공유를 받을 때, 어떻게 처리하는지를 알아본다.

받는 Activity 가 바로 뜨는 앱이면 아래 내용은 필요가 없다. 그냥 읽어서 처리하면 된다.

하지만, 브런치 앱은 MainActivity에서 받아서 EditorActivity로 전달하는 구조이다.

그런데,

프로바이더 Intent일 경우 직접 받는 Activity만 접근이 가능하다.
Main에서 받고 Editor로 전달할 경우 Editor가 이것을 못 받는다 ㅡ.ㅡ;

아래 링크에 가면 왜 그런지 설명이 되어있다. ㅠ.ㅠ

https://developer.android.com/guide/topics/providers/content-provider-basics.html#Intents

These are permissions for a specific content URI that last until the activity that receives them is finished.

받은 Activity 가 finished 되기 전까지만 된다고...



그래서 다음과 같이 해야 한다.


Intent 를 받아서 해당 Uri 를 가지고 이미지 일 경우 내 앱 로컬에 저장시킨다.

저장된 Uri 를 실제 사용하는 Editor Activity 로 던진다.




자 차근차근 따라가 본다.


1. 내 앱이 외부에서 공유되는 내용을 받을 수 있다고 Manifest 에 선언한다.

action SEND로 "text/plain"과 "image/jpeg" "image/png"를 받을 수 있도록 선언한다.

action SEND_MULTIPLE로 두장 이상의 이미지도 받을 수 있도록 한다.


2. 받는 Activity에서 해당 Intent를 처리 하기 전에 Permission을 확인한다.

마시멜로우부터 이용자가 각 앱에 퍼미션을 따로 설정할 수 있도록 되어 있다.

(자유도가 높아질수록 개발자만 죽어난다 ㅡ.ㅡ;;;)

상세한 건 아래 링크를 참조 바란다. @noah.kim이 아주 잘 설명해 놓았다.

https://brunch.co.kr/@babosamo/49

https://brunch.co.kr/@babosamo/50

서두에서 이야기한 것과 같이 잠시 내 앱 저장소에 임시 파일로 저장해야 하기 때문에, Storage Write Permission을 체크하고 가야 한다.


3. 퍼미션이 문제없으면 Uri로 콘텐츠를 받아 로컬에 저장하고 에디터 Activity로 이동한다.

onCreate에서 getIntent()를 아래 그림의 Method로 던진다.

send와 send_multiple 일때만 하고 나머진 따로 한다.

action SEND와 SEND_MULTIPLE 두개를 받는다.

받은 Intent 가 멀쩡하면 다음과 같이 Uri를 이용해서 파일을 저장하고 에디터로 이동시킨다.

text는 그냥 던지고, Image 는 내앱의 저장소에 저장시키게 한다.

Uri Scheme과 host를 보고 더 자세히 구분할 수도 있지만, 그냥 다 로컬에 때려 넣고 넘기는 걸로 작업했다.

Uri 를 내앱의 저장소에 임시로 저장한다.




일반적인 앱들은 공유 Uri를 던질 때의 Scheme 가 "file" 일 경우가 많다.

안드로이드 기본 갤러리는 Scheme가 "content"이며 host는 "media"이다. 아주 노멀 하다.


이 짓을 하게 된 앱은 구글 크롬 때문이다.

이 녀석은 Scheme은 content이지만, host 가 media 가 아니다.

지들의 com.android.chrome.FileProvider 이다. ㅡ.ㅡ;


삽질을 한 것 같은 느낌이지만, 이미지를 받을 수 있는 앱이니 만큼 이렇게라도 해야 되는 것이 맞는 것 같다.


p.s.

이 글은 카카오톡 안드로이드 개발자인 @wilson.a 의 도움을 받아 작성되었습니다.

이 자리를 빌어 다시 한번 감사를 전합니다.

매거진의 이전글 '디지털 노마드 밋업 in 제주'를 다녀와서
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari