다른 앱으로 간단한 데이터 보내기

Android는 인텐트 및 관련 엑스트라를 사용하여 사용자가 선호하는 앱을 통해 빠르고 쉽게 정보를 공유할 수 있도록 합니다.

Android에서는 사용자가 두 가지 방식으로 앱 간에 데이터를 공유할 수 있습니다.

  • Android Sharesheet는 주로 앱 외부나 다른 사용자에게 직접 콘텐츠를 보내도록 설계되었습니다. 예를 들어, 친구와 URL을 공유합니다.
  • Android 인텐트 리졸버는 데이터를 잘 정의된 작업의 다음 단계로 전달하는 데 가장 적합합니다. 예를 들어, 앱에서 PDF를 열고 사용자가 선호하는 뷰어를 선택할 수 있도록 합니다.

인텐트를 구성할 때 인텐트가 실행할 작업을 지정해야 합니다. Android에서는 ACTION_SEND 작업을 사용하여 프로세스 경계를 넘어서까지 하나의 활동에서 다른 활동으로 데이터를 보냅니다. 데이터 및 데이터의 유형을 지정해야 합니다. 시스템에서 자동으로 데이터를 수신할 수 있는 호환되는 활동을 확인하여 사용자에게 표시합니다. 인텐트 리졸버의 경우 하나의 활동만 인텐트를 처리할 수 있으면 이 활동이 즉시 시작됩니다.

Android Sharesheet를 사용해야 하는 이유

여러 앱에서 사용자를 위한 일관성을 확보하려면 Android Sharesheet를 사용하는 것이 좋습니다. 앱이 자체 공유 타겟 목록을 표시하거나 자체 Sharesheet 변형을 만들어서는 안 됩니다.

Android Sharesheet는 한 번의 탭만으로 사용자에게 관련 앱 제안과 함께 적절한 사람과 정보를 공유할 수 있는 기능을 제공합니다. Sharesheet는 맞춤 솔루션에 사용할 수 없는 일관된 순위의 타겟을 제안할 수 있습니다. 이는 Sharesheet가 시스템에서만 사용할 수 있는 앱 및 사용자 활동에 관한 정보를 고려할 수 있기 때문입니다.

또한 Android Sharesheet에는 개발자를 위한 여러 가지 편리한 기능이 있습니다. 예를 들어 사용자는 다음을 할 수 있습니다.

Android Sharesheet 사용

모든 유형의 공유에 대해 인텐트를 만들고 작업을 Intent.ACTION_SEND로 설정하세요. Android Sharesheet를 표시하려면 Intent.createChooser()Intent 객체에 전달하여 호출해야 합니다. 항상 Android Sharesheet를 표시하는 인텐트의 버전을 반환합니다.

텍스트 콘텐츠 보내기

가장 간단하고 일반적인 Android Sharesheet 사용은 하나의 활동에서 다른 활동으로 텍스트 콘텐츠를 보내는 것입니다. 예를 들어, 대부분의 브라우저에서 현재 표시된 페이지의 URL을 다른 앱과 텍스트로 공유할 수 있습니다. 이는 이메일이나 소셜 네트워크를 통해 친구와 글 또는 웹사이트를 공유하는 경우에 유용합니다. 다음은 이 작업의 수행 방법을 보여주는 예입니다.

Kotlin

    val sendIntent: Intent = Intent().apply {
        action = Intent.ACTION_SEND
        putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
        type = "text/plain"
    }

    val shareIntent = Intent.createChooser(sendIntent, null)
    startActivity(shareIntent)
    

자바

    Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
    sendIntent.setType("text/plain");

    Intent shareIntent = Intent.createChooser(sendIntent, null);
    startActivity(shareIntent);
    

선택적으로, 이메일 수신자(EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC), 이메일 제목(EXTRA_SUBJECT) 등의 추가 정보를 포함하는 엑스트라를 추가할 수 있습니다.

참고: Gmail과 같은 일부 이메일 앱의 경우 EXTRA_EMAILEXTRA_CC 등의 엑스트라에 String[]이 필요하며, putExtra(String, String[])을 사용하여 이러한 엑스트라를 인텐트에 추가합니다.

바이너리 콘텐츠 보내기

ACTION_SEND 작업을 사용하여 바이너리 데이터를 공유하세요. 적절한 MIME 유형을 설정하고 엑스트라 EXTRA_STREAM에 데이터의 URI를 배치하세요. 이는 일반적으로 이미지를 공유하는 데 사용되지만 모든 유형의 바이너리 콘텐츠를 공유하는 데 사용될 수도 있습니다.

Kotlin

    val shareIntent: Intent = Intent().apply {
        action = Intent.ACTION_SEND
        putExtra(Intent.EXTRA_STREAM, uriToImage)
        type = "image/jpeg"
    }
    startActivity(Intent.createChooser(shareIntent, resources.getText(R.string.send_to)))
    

자바

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

수신 애플리케이션에는 Uri가 가리키는 데이터에 액세스할 수 있는 권한이 필요합니다. 이를 위해 권장되는 방법은 다음과 같습니다.

  • 사용자 자신의 ContentProvider에 데이터를 저장하여 다른 앱이 제공자에 액세스할 수 있는 올바른 권한을 갖도록 합니다. 액세스를 제공하는 데 선호되는 메커니즘은 일시적이며 수신 애플리케이션에 관한 액세스만 부여하는 URI별 권한을 사용하는 것입니다. FileProvider 도우미 클래스를 사용하면 이와 같은 ContentProvider를 쉽게 만들 수 있습니다.
  • 시스템 MediaStore를 사용합니다. MediaStore는 주로 동영상, 오디오 및 이미지 MIME 유형에 사용되지만 Android 3.0(API 레벨 11)부터 미디어가 아닌 유형을 저장할 수도 있습니다(자세한 내용은 MediaStore.Files 참조). scanFile()을 사용하여 MediaStore에 파일을 삽입할 수 있으며, 이후 공유하는 데 적합한 content:// 스타일 Uri가 제공된 onScanCompleted() 콜백에 전달됩니다. 시스템 MediaStore에 추가되면 기기의 모든 앱에서 콘텐츠에 액세스할 수 있습니다.

올바른 MIME 유형 사용

보내는 데이터와 관련하여 가장 구체적인 MIME 유형을 제공해야 합니다. 예를 들어, 일반 텍스트를 공유할 때는 text/plain을 사용해야 합니다. 다음은 Android에서 간단한 데이터를 보내는 경우의 몇 가지 일반적인 MIME 유형입니다.

  • text/plain, text/rtf, text/html, text/json, 수신자가 text/*에 등록해야 함
  • image/jpg, image/png, image/gif, 수신자가 image/*에 등록해야 함
  • video/mp4, video/3gp, 수신자가 video/*에 등록해야 함
  • application/pdf, 수신자가 지원되는 파일 확장자에 등록해야 함
  • MIME 유형 */*를 사용할 수 있지만 이 유형은 권장되지 않으며 일반 데이터 스트림을 처리할 수 있는 활동과만 일치합니다.

Android Sharesheet는 제공된 MIME 유형에 따라 콘텐츠 미리보기를 표시할 수 있습니다. 일부 미리보기 기능은 특정 유형에만 사용할 수 있습니다.

MIME 미디어 유형의 IANA 공식 레지스트리를 참조하세요.

여러 콘텐츠 공유

여러 콘텐츠를 공유하려면 콘텐츠를 가리키는 URI 목록과 함께 ACTION_SEND_MULTIPLE 작업을 사용하세요. MIME 유형은 공유하는 콘텐츠의 혼합에 따라 다릅니다. 예를 들어 세 개의 JPEG 이미지를 공유하는 경우 유형은 여전히 "image/jpg"입니다. 이미지 유형이 혼합된 경우 모든 유형의 이미지를 처리하는 활동과 일치하는 "image/*"여야 합니다. 혼합된 유형을 공유할 수 있지만 수신자가 전송될 내용을 명확히 알 수 없으므로 권장되지 않습니다. 여러 유형을 보내야 하는 경우 "*/*"를 사용하세요. 데이터를 파싱하고 처리하는 것은 수신 애플리케이션의 책임입니다. 다음 예를 참조하세요.

Kotlin

    val imageUris: ArrayList<Uri> = arrayListOf(
            // Add your image URIs here
            imageUri1,
            imageUri2
    )

    val shareIntent = Intent().apply {
        action = Intent.ACTION_SEND_MULTIPLE
        putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris)
        type = "image/*"
    }
    startActivity(Intent.createChooser(shareIntent, "Share images to.."))
    

자바

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

제공된 URIs가 수신 애플리케이션에서 액세스할 수 있는 데이터를 가리키는지 확인하세요.

서식 있는 콘텐츠를 텍스트 미리보기에 추가

Android 10(API 레벨 29)부터 Android Sharesheet에 공유 중인 텍스트의 미리보기가 표시됩니다. 경우에 따라 공유 중인 텍스트를 이해하기 어려울 수 있습니다. https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4와 같은 복잡한 URL을 공유하는 경우를 고려해 보세요. 다양한 기능의 미리보기를 통해 사용자에게 공유 중인 내용을 확인시켜 줄 수 있습니다.

텍스트를 미리 보는 경우 제목, 미리보기 이미지 또는 둘 다를 설정할 수 있습니다. Intent.createChooser()를 호출하기 전에 Intent.EXTRA_TITLE에 설명을 추가하세요. ClipData를 통해 관련된 미리보기 이미지를 추가하세요.

참고: 이미지 콘텐츠 URI는 대개 FileProvider의 구성된 <cache-path>에서 제공되어야 합니다. 파일 공유를 참조하세요. 미리보기 이미지로 사용할 이미지를 읽을 수 있는 올바른 권한을 Sharesheet에 부여해야 합니다. Intent.FLAG_GRANT_READ_URI_PERMISSION을 참조하세요.

다음 예를 참조하세요.

Kotlin

     val share = Intent.createChooser(Intent().apply {
          action = Intent.ACTION_SEND
          putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/")

          // (Optional) Here we're setting the title of the content
          putExtra(Intent.EXTRA_TITLE, "Introducing content previews")

          // (Optional) Here we're passing a content URI to an image to be displayed
          setClipData(contentUri);
          setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
      }, null)
      startActivity(share)
    

자바

    Intent sendIntent = new Intent(Intent.ACTION_SEND);
    sendIntent.putExtra(Intent.EXTRA_TEXT, "Hello!");

    // (Optional) Here we're setting the title of the content
    sendIntent.putExtra(Intent.EXTRA_TITLE, "Send message");

    // (Optional) Here we're passing a content URI to an image to be displayed
    sendIntent.setClipData(contentUri);
    sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    // Show the Sharesheet
    startActivity(Intent.createChooser(sendIntent, null));
    

미리보기는 다음과 같습니다.

맞춤 타겟 추가

Android Sharesheet에서는 사용자가 ChooserTargetServices에서 로드된 공유 바로가기 및 ChooserTargets 앞에 표시될 제한된 수의 ChooserTarget 객체를 지정할 수 있습니다. 앱 제안 앞에 나열되는 활동을 가리키는 제한된 수의 인텐트를 지정할 수도 있습니다.

Intent.createChooser()를 호출한 Intent.EXTRA_CHOOSER_TARGETSIntent.EXTRA_INITIAL_INTENTS를 공유 인텐트에 추가하세요.

Kotlin

    val share = Intent.createChooser(myShareIntent, null).apply {
        putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray)
        putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray)
    }
    

자바

    val share = Intent.createChooser(myShareIntent, null)
    share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray);
    share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
    

이 기능은 주의해서 사용하세요. 맞춤 IntentChooserTarget을 추가할 때마다 시스템 제안 수가 감소됩니다. 맞춤 타겟을 추가하는 것은 일반적으로 권장되지 않습니다. Intent.EXTRA_INITIAL_INTENTS 추가의 일반적인 적절한 예는 사용자가 공유 콘텐츠에 대해 취할 수 있는 추가 작업을 제공하는 것입니다. 예를 들어, 사용자가 이미지를 공유하고 Intent.EXTRA_INITIAL_INTENTS가 대신 사용자에게 링크를 보낼 수 있는 기능을 제공하는 데 사용됩니다. Intent.EXTRA_CHOOSER_TARGETS 추가의 일반적인 적절한 예는 앱에서 제공하는 관련 사용자 또는 기기를 나타내는 것입니다.

구성요소별로 특정 구성요소 제외

Intent.EXTRA_EXCLUDE_COMPONENTS.를 제공하여 특정 타겟을 제외할 수 있습니다. 이는 제어할 수 있는 타겟을 삭제하는 데만 사용됩니다. 일반적인 사용 사례는 사용자의 인텐트가 앱 외부에서 공유될 가능성이 높기 때문에 사용자가 앱 내에서 공유할 때 앱의 공유 타겟을 숨기는 것입니다.

Intent.createChooser()를 호출한 후 Intent.EXTRA_EXCLUDE_COMPONENTS를 인텐트에 추가하세요.

Kotlin

    val share = Intent.createChooser(myShareIntent, null).apply {
      // Only use components you have control over
      share.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, myComponentArray)
    }
    

자바

    share = Intent.createChooser(myShareIntent, null);
    // Only use components you have control over
    share.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, myComponentArray);
    

공유 정보 가져오기

사용자가 공유하는 시기와 사용자가 선택한 타겟을 아는 것이 유용할 수 있습니다. Android Sharesheet는 사용자가 IntentSender를 통해 클릭하는 타겟의 ComponentName을 제공하여 이를 가능하게 합니다.

먼저 BroadcastReceiver에 관한 PendingIntent를 만들고 Intent.createChooser()IntentSender를 제공합니다.

Kotlin

    var share = new Intent(Intent.ACTION_SEND);
    ...
    val pi = PendingIntent.getBroadcast(myContext, requestCode, Intent(myContext, MyBroadcastReceiver.class),
    Intent.FLAG_UPDATE_CURRENT)
    share = Intent.createChooser(share, null, pi.intentSender);
    

자바

    Intent share = new Intent(ACTION_SEND);
    ...
    PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode,
                    new Intent(myContext, MyBroadcastReceiver.class),
                    FLAG_UPDATE_CURRENT);
    share = Intent.createChooser(share, null, pi.getIntentSender());
    

MyBroadcastReceiver에서 콜백을 수신하고 다음을 확인합니다. Intent.EXTRA_CHOSEN_COMPONENT

Kotlin

    override fun onReceive(context: Context, intent: Intent) {
      ...
      val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
    }
    

자바

    @Override public void onReceive(Context context, Intent intent) {
      ...
      ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
    }
    

Android 인텐트 리졸버 사용

ACTION_SEND 인텐트 리졸버 스크린샷

Android 인텐트 리졸버는 잘 정의된 작업 흐름의 일부로 데이터를 다른 앱에 전송할 때 가장 적절하게 사용할 수 있습니다.

Android 인텐트 리졸버를 사용하려면 Android Sharesheet를 호출할 때와 같이 인텐트를 만들고 엑스트라를 추가하세요. 그러나 Intent.createChooser()는 호출하지 마세요.

ACTION_SEND 및 MIME 유형과 일치하는 필터를 사용하는 여러 애플리케이션이 설치되어 있는 경우 시스템에서 사용자가 공유할 타겟을 선택할 수 있는 인텐트 리졸버라는 명확성 대화상자를 표시합니다. 하나의 애플리케이션이 일치하면 이 애플리케이션이 실행됩니다.

다음은 Android 인텐트 리졸버를 사용하여 텍스트를 보내는 방법의 예입니다.

Kotlin

    val sendIntent: Intent = Intent().apply {
        action = Intent.ACTION_SEND
        putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
        type = "text/plain"
    }
    startActivity(sendIntent)
    

자바

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

자세히 알아보기

데이터 보내기에 관한 자세한 내용은 인텐트 및 인텐트 필터를 참조하세요.