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

앱이 다른 앱에 데이터를 전송할 수 있는 것처럼 다른 앱에서도 데이터를 수신할 수 있습니다. 사용자가 애플리케이션과 상호작용하는 방식과 다른 애플리케이션에서 수신하려는 데이터 유형에 대해 생각해 보세요. 예를 들어 소셜 네트워킹 애플리케이션이 다른 앱에서 흥미로운 웹 URL과 같은 텍스트 콘텐츠를 수신하는 데 관심이 있을 수 있습니다.

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

  • 일치하는 intent-filter 태그가 매니페스트에 있는 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
    }
}

Java

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 태그에 설정된 아이콘을 무시합니다.