Android는 인텐트 및 관련 extra를 사용하여 사용자가 선호하는 앱을 통해 빠르고 쉽게 정보를 공유할 수 있도록 합니다.
Android에서는 사용자가 두 가지 방식으로 앱 간에 데이터를 공유할 수 있습니다.
- Android Sharesheet는 주로 앱 외부 및/또는 직접 콘텐츠를 전송하도록 설계되었습니다. 공유할 수 있습니다. 예를 들어, 친구와 URL을 공유합니다.
- Android 인텐트 리졸버는 데이터를 잘 정의된 작업의 다음 단계로 전달하는 데 가장 적합합니다. 예를 들어 앱에서 PDF를 열고 사용자가 선호하는 뷰어를 선택할 수 있도록 합니다.
인텐트를 구성할 때 인텐트가 실행할 작업을 지정합니다.
Android에서는 ACTION_SEND
작업을 사용하여 프로세스 경계를 넘어서까지 하나의 활동에서 다른 활동으로 데이터를 보냅니다. 데이터 및 데이터의 유형을 지정해야 합니다. 시스템에서 자동으로 데이터를 수신할 수 있는 호환되는 활동을 확인하여 사용자에게 표시합니다. 인텐트 리졸버의 경우 하나의 활동만 인텐트를 처리할 수 있으면 이 활동이 즉시 시작됩니다.
Android Sharesheet를 사용하는 이유

여러 앱에서 사용자를 위한 일관성을 확보하려면 Android Sharesheet를 사용하는 것이 좋습니다. 앱의 자체 공유 타겟 목록을 표시하거나 자체 Sharesheet 변형을 만들지 마세요.
Android Sharesheet를 사용하면 사용자는 탭 한 번으로 관련성 높은 앱 추천을 받아볼 수 있습니다. Sharesheet는 맞춤 솔루션에 사용할 수 없는 타겟을 제안할 수 있으며 일관된 순위를 사용합니다. 이는 Sharesheet가 앱 및 사용자 활동에 대한 정보를 고려할 수 있기 때문입니다. 시스템에서만 사용할 수 있는 것입니다
또한 Android Sharesheet에는 개발자를 위한 여러 가지 편리한 기능이 있습니다. 예를 들어 다음을 수행하세요.
- 사용자가 공유를 완료한 시기와 위치 확인
- 맞춤
ChooserTarget
및 앱 타겟 추가 - Android 10 (API 수준 29)부터 서식 있는 텍스트 콘텐츠 미리보기 제공
- 특정 구성요소 이름과 일치하는 타겟 제외
Android Sharesheet 사용
모든 유형의 공유에 대해 인텐트를 만들고 작업을 Intent.ACTION_SEND
로 설정합니다.
Android Sharesheet를 표시하려면 Intent.createChooser()
를 호출하여 Intent
객체를 전달합니다.
그러면 Android Sharesheet를 항상 표시하는 인텐트의 버전을 반환합니다.
텍스트 콘텐츠 보내기
Android Sharesheet의 가장 간단하고 일반적인 용도는 전달할 수 있습니다 예를 들어 대부분의 브라우저는 현재 표시된 페이지를 다른 앱과 함께 사용할 수 있습니다. 이 기능은 Google+를 통해 친구와 기사나 웹사이트를 공유할 때 이메일이나 소셜 네트워킹에 의지할 수 있습니다. 다음은 그 방법을 보여주는 예입니다.
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_EMAIL
및 EXTRA_CC
와 같은 extra에 String[]
이 필요합니다. putExtra(String, String[])
를 사용하여 인텐트에 추가합니다.
바이너리 콘텐츠 전송
ACTION_SEND
작업을 사용하여 바이너리 데이터를 공유할 수 있습니다.
적절한 MIME 유형을 설정하고 엑스트라
EXTRA_STREAM
, 다음 형식:
다음 예에 나와 있습니다.
이는 일반적으로 이미지를 공유하는 데 사용되지만 모든 유형의 바이너리 콘텐츠를 공유하는 데 사용될 수도 있습니다.
val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... putExtra(Intent.EXTRA_STREAM, uriToImage) type = "image/jpeg" } startActivity(Intent.createChooser(shareIntent, null))
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); // Example: content://com.google.android.apps.photos.contentprovider/... shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, null));
수신 애플리케이션에는 Uri
가 가리키는 데이터에 액세스할 수 있는 권한이 필요합니다. 이를 위해 권장되는 방법은 두 가지입니다.
- 고유한
ContentProvider
에 데이터를 저장하여 다른 앱이 제공자에 액세스할 수 있는 올바른 권한을 갖도록 합니다. API를 제공하는 데 선호되는 메커니즘은 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/* |
|
`image/*` |
|
video/* |
|
지원되는 파일 확장자 | application/pdf |
MIME 유형에 관한 자세한 내용은 MIME 미디어 유형의 IANA 공식 레지스트리를 참고하세요.
제공된 MIME 유형에 따라 Android Sharesheet에 콘텐츠 미리보기가 표시될 수 있습니다. 일부 미리보기 기능은 특정 유형에만 사용할 수 있습니다.
여러 콘텐츠 공유
여러 콘텐츠를 공유하려면 콘텐츠를 가리키는 URI 목록과 함께 ACTION_SEND_MULTIPLE
작업을 사용하세요. MIME 유형은 공유하는 콘텐츠의 혼합에 따라 다릅니다. 예를 들어 JPEG 이미지 3개를 공유하는 경우 유형은 "image/jpg"
입니다. 이미지 유형이 혼합된 경우 "image/*"
를 사용하여 모든 유형의 이미지를 처리하는 활동과 일치시킵니다. 혼합된 유형을 공유할 수 있지만 수신자가 전송될 내용을 명확히 알 수 없으므로 권장되지 않습니다. 여러 유형을 보내야 한다면 "*/*"
를 사용하세요. 수신 응용 프로그램이
데이터를 처리하는 방법을 알아봤습니다 예를 들면 다음과 같습니다.
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, null))
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, null));
제공된 Uri
객체가
수신 애플리케이션이 액세스할 수 있는 데이터에 액세스할 수 있습니다.
텍스트 미리보기에 리치 콘텐츠 추가
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
를 참고하세요.
예를 들면 다음과 같습니다.
val share = Intent.createChooser(Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = contentUri flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null) startActivity(share)
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/"); // (Optional) Here you're setting the title of the content sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews"); // (Optional) Here you're passing a content URI to an image to be displayed sendIntent.setData(contentUri); sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Show the Sharesheet startActivity(Intent.createChooser(sendIntent, null));
미리보기는 다음과 같습니다.

Sharesheet에 맞춤 작업 추가

Android Sharesheet의 맞춤 작업 스크린샷
Android 14(API 수준 34) 및 이후 버전에서는 앱이 Android Sharesheet에 맞춤 작업을 추가할 수 있습니다.
맞춤 작업은 Android Sharesheet 상단에 작은 작업 아이콘으로 표시됩니다.
아이콘을 클릭하면 호출되는 작업으로 Intent
를 지정할 수 있습니다.
Android Sharesheet에 맞춤 작업을 추가하려면 먼저
ChooserAction
다음 코드로 교체합니다.
ChooserAction.Builder
입니다.
아이콘을 클릭할 때 호출되는 작업으로 PendingIntent
를 지정할 수 있습니다. 만들기
모든 맞춤 작업을 포함하는 배열이며 이를
EXTRA_CHOOSER_CUSTOM_ACTIONS
공유 Intent
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
커스텀 대상 추가
Android Sharesheet를 사용하면 동일한 작업을 하는 ChooserTarget
객체를
는 ChooserTargetServices
에서 로드된 공유 바로가기와 선택기 타겟 앞에 표시됩니다. 앱 제안 앞에 나열되는 활동을 가리키는 인텐트를 최대 2개 지정할 수도 있습니다.

Intent.EXTRA_CHOOSER_TARGETS
및 Intent.EXTRA_INITIAL_INTENTS
를 다음에 추가
호출 이후 공유 인텐트
Intent.createChooser()
:
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
이 기능은 주의해서 사용하세요. 모든 맞춤 Intent
ChooserTarget
를 추가하면 시스템 제안 수가 줄어듭니다. 일반적으로
맞춤 타겟을 추가하지 않는 것이 좋습니다. 'kubectl get-credentials' 대신
Intent.EXTRA_INITIAL_INTENTS
는 공유 항목에 대해 사용자가 취할 수 있는 추가 작업을 제공하는 것입니다.
있습니다. 예를 들어 사용자가 이미지를 공유하고 Intent.EXTRA_INITIAL_INTENTS
가 대신 링크를 보낼 수 있도록 하는 데 사용됩니다. Intent.EXTRA_CHOOSER_TARGETS
추가의 일반적인 적절한 예
앱에서 제공하는 관련 사용자 또는 기기를
표현하는 것입니다
구성요소별로 특정 타겟 제외
Intent.EXTRA_EXCLUDE_COMPONENTS
를 제공하여 특정 타겟을 제외할 수 있습니다.
제어할 수 있는 타겟을 삭제하는 경우에만 이 작업을 수행하세요. 일반적인 사용 사례는
사용자가 앱 내에서 공유할 때 공유 의도가 공유될 가능성이 높기 때문에 앱의 공유 타겟을 설정합니다.
액세스할 수 있습니다.
Intent.createChooser()
를 호출한 후 인텐트에 Intent.EXTRA_EXCLUDE_COMPONENTS
를 추가합니다.
val share = Intent.createChooser(Intent(), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) }
Intent shareIntent = Intent.createChooser(new Intent(), null); // Only use for components you have control over ComponentName[] excludedComponentNames = { new ComponentName("com.example.android", "ExampleClass") }; shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);
공유 정보 확인
사용자가 공유하는 시기와 사용자가 선택하는 타겟을 아는 것이 유용할 수 있습니다. 이
Android Sharesheet를 사용하면 앱의 ComponentName
를 제공하여
IntentSender
를 사용하여 사용자가 선택한 항목을 타겟팅합니다.
먼저 BroadcastReceiver
의 PendingIntent
를 만들고 Intent.createChooser()
에서 IntentSender
를 제공합니다.
var share = Intent(Intent.ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( myContext, requestCode, Intent(myContext, MyBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.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), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); share = Intent.createChooser(share, null, pi.getIntentSender());
MyBroadcastReceiver
에서 콜백을 수신하고 다음을 확인합니다.
Intent.EXTRA_CHOSEN_COMPONENT
:
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); }
Sharesheet에 맞춤 작업 추가
Android 14 (API 수준 34) 이상에서는 앱이 Android Sharesheet에 맞춤 작업을 추가할 수 있습니다.
ChooserAction
만들기
다음 코드로 교체합니다.
ChooserAction.Builder
입니다.
아이콘을 클릭할 때 호출되는 작업으로 PendingIntent
를 지정할 수 있습니다. 만들기
모든 맞춤 작업을 포함하는 배열이며 이를
EXTRA_CHOOSER_CUSTOM_ACTIONS
공유 Intent
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Android 인텐트 리졸버 사용

ACTION_SEND
인텐트 리졸버 스크린샷
Android 인텐트 리졸버는 잘 정의된 작업 흐름의 일부로 데이터를 다른 앱에 전송할 때 가장 적절하게 사용할 수 있습니다.
Android 인텐트 리졸버를 사용하려면 Android Sharesheet를 호출할 때와 같이 인텐트를 만들고 extra를 추가하세요. 그러나 Intent.createChooser()
는 호출하지 마세요.
일치하는 필터가 있는 애플리케이션이 여러 개 설치되어 있는 경우
ACTION_SEND
MIME 유형을 선택하면 시스템은 인텐트 리졸버라는 명확성 대화상자를 표시합니다.
사용자가 공유할 대상을 선택할 수 있습니다. 하나의 애플리케이션이 일치하면 이 애플리케이션이 실행됩니다.
다음은 Android 인텐트 리졸버를 사용하여 텍스트를 보내는 방법의 예입니다.
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);
자세히 알아보기
데이터 전송에 대한 자세한 내용은 다음을 참고하세요. 인텐트 및 인텐트 필터.