ActionBar
에서 ShareActionProvider
를 추가 하여 공유하는 방법이다.(https://developer.android.com/training/sharing/shareaction.html)
- ACTION_SEND 엑션을 통해서 바로 다른 앱으로 데이터를 전달하는 방법이다. 예를 들어서 어떤 글이나 URL을 E-mail 또는 소셜네트워킹 앱으로 공유하는 경우를 생각해 보자
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(sendIntent);
- 위와같이 인텐트를 실행했을때 설치되어 있는 어플리케이션중에 ACTION_SEND필터와 “text/plain”과 같은 MimeType을 셋팅한 어플리케이션이 있을 경우 안드로이드는 해당 어플리케이션을 실행하게 된다. 한개 이상의 어플리케이션이 매칭될경우 아래와 같이 앱을 선택하는 다이얼 로그가 나타난다.
- 아래와 같이 위 소스를 수정하여 Intent.createChooser()를 명시적으로 호출하는경우 몇가지 장점을 얻을 수 있다.
-
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));
- 이전에 선택한 앱이 있더라도 앱을 선택하는 창이 나타나게 된다.
- 매칭되는 앱이 없는 경우에 안드로이드 시스템 메세지가 보이게 된다.
- Chooser 다이얼로그의 제목을 지정 할 수 있다.
ACTION_SEND
을 활용하여 전송하기 위해서는 적절한 MIME타입 지정과 EXTRA_STREAM에 uri 를 지정해야 한다
. 일반적으로 이미지를 공유하는 방식이지만 기본적으로 모든 바이너리 파일에 대해서 적용 가능하다.Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
-
"*/*” MIME을 활용 할 수 있다. 그러나 이경우에는 일반적인 데이타 스트림을 다루는
엑티비티에게만 매칭된다.
- 데이터를 받는 어플리케이션에서는 Uri가 가르키는 데이터에 접속하기 위해서 권한이 필요하다. 추천하는 방법은 다음과 같다.
-
데이터를
ContentProvider
에 저장하고 ContentsProvider를 통해서 데이터 접속 하도록 한다.
-
시스템의
MediaStore
를 활용한다. 미디어 스토어는 비디오와 오디오를 위해서 만들어 졌지만 안드로이드 3.0 이상에서는 non-media 타입에 대해서도 지원을 한다. MediaStore에 저장을 하면 content:// 와 같은 형태로 접근이 가능하다(단, 미디어스캔이 끝난 이후에). MediaStore에 저장되면 모든 앱에서 접근이 가능하다.
multiple 컨텐츠를 공유하기 위해서는 ACTION_SEND_MULTIPLE
액션을 사용해야 한다. MIME 타입은 공유하는 컨텐츠 종류에 따라 달라진다. 예를 들어 3개의 JPEG 이미지를 공유하는 경우 타입은 여전희 "image/jpeg” 이다
. 또는 여러개의 이미지 종류가 섞여있는 경우 "image/*”
로 설정하면 어떠한 타입의 이미지가 와도 핸들링이 가능하다. "*/*” 를 사용한다면 모든 타입에 대해서 공유를 할 수 있음을 의미한다.
이러한 경우에는 받는쪽에서 데이터 타입에 따른 핸들링 하는 부분이 보다 추가 되어야 한다.(타입이 명확하지 않은 부분에 대한 verify 필요함)
ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Share images to.."));
'Programming' 카테고리의 다른 글
Android TestCase 빌드시 메모리 문제 (Robolectric) (0) | 2017.04.26 |
---|---|
안드로이드 MVC, MVP Pattern (0) | 2017.04.05 |
Android Clean Architecture (0) | 2017.04.03 |
다른 App으로 부터 데이터 전달 받기 (0) | 2017.03.28 |
안드로이드 화면 사이즈별 대응(Supporting Diffrent Screen) (0) | 2017.03.25 |