본 내용은 Android Devloper site 의 내용을 발췌한 내용입니다.


인텐트를 활용한 방식이 어플리케이션간의 데이터 공유방식중 가장 일반적인 방식이다.
Android에서 다른 앱으로 데이터를 전달하기 위해서는 ACTION_SEND 엑션을 활용한다. 

데이터를 공유 하는 방법중에 가장 좋은 방법은  ActionBar 에서 ShareActionProvider 를 추가 하여 공유하는 방법이다.(https://developer.android.com/training/sharing/shareaction.html)


TEXT 컨텐츠 보내기

  • 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 다이얼로그의 제목을 지정 할 수 있다.



Binary 컨텐츠 보내기

바이너리 데이터를  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 컨텐츠 보내기

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.."));














+ Recent posts