Android는 인텐트와 관련 Extras를 사용하여 사용자가 정보를 즐겨 사용하는 앱을 손쉽게 사용할 수 있습니다.
Android에서는 사용자가 두 가지 방식으로 앱 간에 데이터를 공유할 수 있습니다.
- Android Sharesheet는 주로 앱 외부 및/또는 직접 콘텐츠를 전송하도록 설계되었습니다. 공유할 수 있습니다. 예를 들어, 친구와 URL을 공유합니다.
- Android 인텐트 리졸버는 다음 단계로 넘어갈 것입니다. 예를 들어 앱에서 PDF를 열고 사용자에게 원하는 시청자를 선택합니다.
인텐트를 구성할 때 인텐트가 실행할 작업을 지정합니다.
Android에서 ACTION_SEND
작업을 사용합니다.
한 활동에서 다른 활동으로 데이터를 보낼 수 있고
할 수도 있습니다 서비스 계정을
지정할 수 있습니다 시스템에서 호환되는 활동을 자동으로 식별합니다.
데이터를 수신하고 사용자에게 표시하는 데 사용됩니다. 인텐트 리졸버의 경우
하나의 활동만 인텐트를 처리할 수 있는 경우 해당 활동이 즉시 시작됩니다.
Android Sharesheet를 사용하는 이유
![](https://developer.android.com/static/images/training/sharing/sharesheet.png?authuser=0000&hl=ko)
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+를 통해 친구와 기사나 웹사이트를 공유할 때 이메일이나 소셜 네트워킹에 의지할 수 있습니다. 다음은 그 방법을 보여주는 예입니다.
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과 같은 일부 이메일 앱에는
추가 혜택(예: String[]
)
EXTRA_EMAIL
및 EXTRA_CC
사용
putExtra(String, String[])
인텐트에 추가할 수 있습니다.
바이너리 콘텐츠 전송
ACTION_SEND
작업을 사용하여 바이너리 데이터를 공유할 수 있습니다.
적절한 MIME 유형을 설정하고 엑스트라
EXTRA_STREAM
, 다음 형식:
다음 예에 나와 있습니다.
이것은 일반적으로 이미지를 공유하는 데 사용되지만 모든 유형의 바이너리 콘텐츠를 공유하는 데 사용할 수 있습니다.
Kotlin
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별 권한을 사용하는 것입니다. 수신 애플리케이션에 대한 액세스만 허용합니다. GCP 콘솔에서 이와 같은ContentProvider
는FileProvider
도우미 클래스. MediaStore
시스템을 사용합니다.MediaStore
주로 동영상, 오디오 및 이미지 MIME 유형에 사용됩니다. 하지만 Android 3.0 (API)부터 레벨 11)에서 미디어가 아닌 유형도 저장할 수 있습니다. 자세한 내용은MediaStore.Files
다음을 사용하여 파일을MediaStore
에 삽입할 수 있습니다.scanFile()
, 그 후에는content://
스타일Uri
제공된onScanCompleted()
있습니다. 시스템MediaStore
에 추가하면 콘텐츠에 액세스할 수 있습니다. 액세스할 수 있습니다.
올바른 MIME 유형 사용
현재 데이터에 사용 가능한 가장 구체적인 MIME 유형을 제공합니다.
있습니다. 예를 들어 일반 텍스트를 공유할 때는 text/plain
를 사용합니다. 몇 가지를 소개해 드리겠습니다
Android에서 간단한 데이터를 보낼 때의 일반적인 MIME 유형은 다음과 같습니다.
수신기는 | 발신자 전송 |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
지원되는 파일 확장자 | application/pdf |
MIME 유형에 관한 자세한 내용은 이아나 MIME 미디어 유형의 공식 레지스트리입니다.
제공된 MIME 유형에 따라 Android Sharesheet에 콘텐츠 미리보기가 표시될 수 있습니다. 다소 유용함 미리보기 기능은 특정 유형에만 제공됩니다.
여러 콘텐츠 공유
여러 콘텐츠를 공유하려면 ACTION_SEND_MULTIPLE
를 사용합니다.
콘텐츠를 가리키는 URI 목록과 함께 표시됩니다. 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, 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
를 참조하세요.
예를 들면 다음과 같습니다.
Kotlin
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));
미리보기는 다음과 같습니다.
![](https://developer.android.com/static/images/training/sharing/sharing_content_preview.png?authuser=0000&hl=ko)
Sharesheet에 맞춤 작업 추가
![](https://developer.android.com/static/images/training/sharing/sharesheet_custom_actions.png?authuser=0000&hl=ko)
Android Sharesheet의 맞춤 작업 스크린샷
Android 14 (API 수준 34) 이상에서는 앱이 Android Sharesheet에 맞춤 작업을 추가할 수 있습니다.
맞춤 작업은 Android Sharesheet 상단에 작은 작업 아이콘으로 표시됩니다.
아이콘을 클릭하면 호출되는 작업으로 Intent
를 지정할 수 있습니다.
Android Sharesheet에 맞춤 작업을 추가하려면 먼저
ChooserAction
다음 코드로 교체합니다.
ChooserAction.Builder
입니다.
아이콘을 클릭하면 호출되는 작업으로 PendingIntent
를 지정할 수 있습니다. 만들기
모든 맞춤 작업을 포함하는 배열이며 이를
EXTRA_CHOOSER_CUSTOM_ACTIONS
공유 Intent
Kotlin
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개까지 지정
다음 단계를 따르세요.
![](https://developer.android.com/static/images/training/sharing/customshare.png?authuser=0000&hl=ko)
Intent.EXTRA_CHOOSER_TARGETS
및 Intent.EXTRA_INITIAL_INTENTS
추가 대상
호출 이후 공유 인텐트
Intent.createChooser()
:
Kotlin
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
를 추가합니다.
Kotlin
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
를 만들고
IntentSender
(Intent.createChooser()
):
Kotlin
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
:
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); }
Sharesheet에 맞춤 작업 추가
Android 14 (API 수준 34) 이상에서는 앱이 Android Sharesheet에 맞춤 작업을 추가할 수 있습니다.
ChooserAction
만들기
다음 코드로 교체합니다.
ChooserAction.Builder
입니다.
아이콘을 클릭하면 호출되는 작업으로 PendingIntent
를 지정할 수 있습니다. 만들기
모든 맞춤 작업을 포함하는 배열이며 이를
EXTRA_CHOOSER_CUSTOM_ACTIONS
공유 Intent
Kotlin
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 인텐트 리졸버 사용
![](https://developer.android.com/static/images/training/sharing/send_intent.png?authuser=0000&hl=ko)
ACTION_SEND
인텐트 리졸버 스크린샷
Android 인텐트 리졸버는 잘 정의된 작업 흐름의 일부로 데이터를 다른 앱에 전송할 때 가장 적절하게 사용할 수 있습니다.
Android 인텐트 리졸버를 사용하려면 호출하는 것처럼 인텐트를 만들고 extras를 추가하세요.
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);
자세히 알아보기
데이터 전송에 대한 자세한 내용은 다음을 참고하세요. 인텐트 및 인텐트 필터.