앱이 다른 앱에 데이터를 보낼 수 있는 것처럼 확인할 수 있습니다. 사용자가 애플리케이션과 상호작용하는 방식 및 다른 애플리케이션에서 받을 데이터 유형을 생각해 보세요. 예를 들어 소셜 미디어 텍스트 콘텐츠를 수신하는 데 관심이 있을 수 있는 네트워킹 응용 프로그램은 다른 앱에서 가져온 것입니다.
다른 앱의 사용자는 Android Sharesheet나 인텐트 리졸버를 통해 앱에 데이터를 자주 전송합니다. 앱에 데이터를 전송하는 앱은 해당 데이터의 MIME 유형을 설정해야 합니다. 앱은 다음과 같은 방법으로 다른 앱에서 전송한 데이터를 받을 수 있습니다.
- 일치하는
intent-filter
태그가 매니페스트에 있는Activity
- 앱에서 공유 바로가기를 게시함.
직접 공유 대상은 앱 내의 특정 Activity로 연결되는 딥 링크입니다. 사람 또는 그룹을 나타내는 경우가 많으며 Android Sharesheet에 표시됩니다. 예를 들어 메시지 앱은 어떤 사람과 관련하여 이 사람과 나눈 대화로 직접 딥 링크를 통해 연결되는 직접 공유 타겟을 제공할 수 있습니다. 자세한 내용은 자세한 내용은 직접 공유 타겟을 제공하세요. 참조하세요.
MIME 유형 지원
앱은 최대한 다양한 MIME 유형을 받을 수 있어야 합니다.
예를 들어 텍스트, 이미지, 동영상을 보내는 데 설계된 메시지 앱은 text/*
, image/*
, video/*
수신을 지원하는 것이 좋습니다. 몇 가지를 소개해 드리겠습니다
Android에서 간단한 데이터를 주고받기 위한 일반적인 MIME 유형을 살펴봅니다.
수신자가 다음에 등록합니다. | 발신자 전송 |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
지원되는 파일 확장자 | application/pdf |
MIME 미디어 유형의 IANA 공식 레지스트리를 참고하세요.
효과적인 공유 타겟 만들기
사용자가 특정 활동과 연결된 공유 타겟을 탭할 때 사용하기 전에 공유 콘텐츠를 확인하고 수정할 수 있어야 합니다. 이것은 특히 텍스트 데이터에 중요합니다
활동을 통해 데이터 수신
활동이 포함된 데이터를 수신하려면 매니페스트를 업데이트하고 사용자가 앱을 인식하는지 확인해야 합니다.
매니페스트 업데이트하기
인텐트 필터는 앱 구성요소에서 허용하는 인텐트를 시스템에 알립니다.
다음에서 ACTION_SEND
작업을 사용하여 인텐트를 구성한 방법과 비슷합니다.
다른 앱으로 간단한 데이터 보내기
단원에서는 이 작업으로 인텐트를 수신하는 인텐트 필터를 만듭니다. 나
<intent-filter>
요소를 사용하여 매니페스트에서 인텐트 필터를 정의합니다.
예를 들어 앱이 텍스트 콘텐츠 수신을 처리하는 경우 모든 유형의 이미지를 하나 이상 포함하는 매니페스트는 다음 스니펫과 같습니다.
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
다른 앱이
인텐트를 전달하고 애플리케이션인 startActivity()
에 전달합니다.
Android Sharesheet 또는 인텐트 리졸버에 옵션으로 나열되어 있습니다. 사용자가 앱을 선택하면 해당 활동(위 예에서는 .ui.MyActivity
)이 시작됩니다. 그런 다음 콘텐츠를 적절하게
처리하는 것은 개발자의 몫입니다
사용할 수 있습니다.
수신되는 콘텐츠 처리하기
Intent
에서 전송한 콘텐츠를 처리하려면 다음을 호출합니다.
getIntent()
: Intent
객체를 가져옵니다. 객체를 가져온 후 콘텐츠를 검사하여 다음에 할 작업을 결정할 수 있습니다. 이 활동을 시스템의 다른 부분(예: 런처)에서 시작할 수 있는 경우에는 인텐트를 검사할 때 이 점을 고려합니다.
수신 데이터를 각별히 주의하여 확인하세요. 다른 애플리케이션에서 어떤 데이터가 들어올지 알 수 없습니다. 예를 들어 잘못된 MIME 유형이 설정되었을 수도 있고 전송 중인 이미지가 아주 클 수도 있습니다. 또한, 기본('UI') 스레드가 아니라 별도의 스레드에서 바이너리 데이터를 처리해야 합니다.
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... when { intent?.action == Intent.ACTION_SEND -> { if ("text/plain" == intent.type) { handleSendText(intent) // Handle text being sent } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } intent?.action == Intent.ACTION_SEND_MULTIPLE && intent.type?.startsWith("image/") == true -> { handleSendMultipleImages(intent) // Handle multiple images being sent } else -> { // Handle other intents, such as being started from the home screen } } ... } private fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update UI to reflect text being shared } } private fun handleSendImage(intent: Intent) { (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let { // Update UI to reflect image being shared } } private fun handleSendMultipleImages(intent: Intent) { intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let { // Update UI to reflect multiple images being shared } }
자바
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ... } void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared } } void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared } } void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared } }
데이터를 받은 후 UI를 업데이트하려면 EditText
를 채우기만 하면 됩니다. 재미있는 사진 필터를 이미지에 적용하는 것과 같이 더 복잡한 방법도 있습니다. 어떤 방법을 선택할지는 앱에 따라 다릅니다.
사용자가 앱을 인식하게 만들기
앱은 다음과 같이 표현됩니다. icon 및 label Sharesheet 및 인텐트 리졸버. 아이콘과 라벨은 둘 다 매니페스트에 정의되어 있습니다. 활동 또는 인텐트 필터 라벨을 설정하여 더 자세한 컨텍스트를 제공할 수 있습니다.
Android 10 (API 수준 29)부터 Android Sharesheet는
application
태그에 매니페스트를 추가해야 합니다. Android는 intent-filter
및 activity
태그에 설정된 아이콘을 무시합니다.