다른 앱에서 간단한 데이터 받기

앱은 데이터를 다른 앱으로 보낼 수 있을 뿐 아니라 다른 앱의 데이터를 받을 수도 있습니다. 사용자가 애플리케이션과 상호작용하는 방식 및 다른 애플리케이션에서 받을 데이터 유형을 생각해 보세요. 예를 들어 소셜 네트워크 애플리케이션이라면 다른 앱에서 흥미로운 웹 URL 같은 텍스트 콘텐츠를 받고 싶을 수 있습니다.

다른 앱의 사용자는 Android Sharesheet나 인텐트 리졸버를 통해 앱에 데이터를 자주 전송합니다. 앱에 데이터를 전송하는 앱은 해당 데이터의 MIME 유형을 설정해야 합니다. 앱은 다음과 같은 방법으로 다른 앱에서 전송한 데이터를 받을 수 있습니다.

  • 일치하는 intent-filter 태그가 매니페스트에 있는 Activity
  • 앱에서 공유 바로가기를 게시함.

직접 공유 대상은 앱 내의 특정 Activity로 연결되는 딥 링크입니다. 사람 또는 그룹을 나타내는 경우가 많으며 Android Sharesheet에 표시됩니다. 예를 들어 메시지 앱은 어떤 사람과 관련하여 이 사람과 나눈 대화로 직접 딥 링크를 통해 연결되는 직접 공유 타겟을 제공할 수 있습니다. 자세한 안내는 직접 공유 타겟 제공을 참고하세요.

MIME 유형 지원

앱은 최대한 다양한 MIME 유형을 받을 수 있어야 합니다. 예를 들어 텍스트, 이미지, 동영상을 보내는 데 설계된 메시지 앱은 text/*, image/*, video/* 수신을 지원하는 것이 좋습니다. 다음은 Android에서 간단한 데이터를 주고받는 데 사용되는 몇 가지 일반적인 MIME 유형입니다.

수신자가 다음에 등록합니다. 발신자 전송
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
지원되는 파일 확장자 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)이 시작됩니다. 그런 다음, 원하는 대로 코드 및 UI 내에서 콘텐츠를 적절하게 처리하면 됩니다.

수신되는 콘텐츠 처리하기

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를 채우기만 하면 됩니다. 재미있는 사진 필터를 이미지에 적용하는 것과 같이 더 복잡한 방법도 있습니다. 어떤 방법을 선택할지는 앱에 따라 다릅니다.

사용자가 앱을 인식하게 만들기

앱은 Android Sharesheet 및 인텐트 리졸버에서 아이콘라벨로 표현됩니다. 아이콘과 라벨은 둘 다 매니페스트에 정의되어 있습니다. 활동 또는 인텐트 필터 라벨을 설정하여 더 자세한 컨텍스트를 제공할 수 있습니다.

Android 10 (API 수준 29)부터 Android Sharesheet는 application 태그의 매니페스트에 설정된 아이콘만 사용합니다. Android는 intent-filteractivity 태그에 설정된 아이콘을 무시합니다.