직접 공유 타겟을 사용하면 다른 앱의 사용자가 URL, 이미지 또는 기타 데이터 유형을 앱과 더 쉽고 빠르게 공유할 수 있습니다. 직접 공유는 사용자가 앱을 선택한 다음 연락처를 검색하지 않고도 메시지 앱과 소셜 앱의 연락처를 Android Sharesheet에 직접 표시하여 작동합니다.
ShortcutManagerCompat
는 공유 바로가기를 제공하는 AndroidX API로, 지원 중단된 ChooserTargetService API와 이전 버전과 호환됩니다. 공유 바로가기와 ChooserTargets를 모두 게시하는 데 선호되는 방식입니다. 자세한 내용은
이 페이지의 AndroidX를 사용하여 공유 바로가기와 ChooserTargets 모두 제공하기
를 참고하세요.
직접 공유 타겟 게시하기
Sharesheet 직접 공유 행에는 공유 바로가기 API에서 제공하는 동적 바로가기만 표시됩니다. 직접 공유 타겟을 게시하려면 다음 단계를 완료하세요.
앱의 XML 리소스 파일에서
share-target요소를 선언합니다.<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <share-target android:targetClass="com.example.android.sharingshortcuts.SendMessageActivity"> <data android:mimeType="text/plain" /> <category android:name="com.example.android.sharingshortcuts.category.TEXT_SHARE_TARGET" /> </share-target> </shortcuts>앱이 초기화되면
setDynamicShortcuts를 사용하여 중요도에 따라 동적 바로가기의 순서를 지정합니다.색인이 낮을수록 중요도가 높습니다. 통신 앱을 만드는 경우 앱에 표시되는 대로 최근 항목을 기준으로 정렬된 상위 대화가 될 수 있습니다. 오래된 바로가기는 게시하지 마세요. 지난 30일 동안 사용자 활동이 없는 대화는 오래된 것으로 간주됩니다.
Kotlin
ShortcutManagerCompat.setDynamicShortcuts(myContext, listOf(shortcut1, shortcut2, ..))
자바
List<ShortcutInfoCompat> shortcuts = new ArrayList<>(); shortcuts.add(shortcut1); shortcuts.add(shortcut2); ... ShortcutManagerCompat.setDynamicShortcuts(myContext, shortcuts);
통신 앱을 개발하는 경우 사용자가 연락처에 메시지를 수신하거나 전송할 때마다 즉시 바로가기 사용량을 통해
pushDynamicShortcut바로가기 사용량을 보고합니다. 자세한 내용은 이 페이지의 통신 앱의 바로가기 사용량 보고를 참고하세요. 예를 들어 사용자가 보낸 메시지의 사용량을 보고하려면 바로가기에 기능 결합을 지정하고ShortcutInfoCompat.Builder#addCapabilityBindingactions.intent.SEND_MESSAGE기능을 사용합니다.Kotlin
val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE").build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
자바
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE") .build(); ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
사용자가 연락처를 삭제하면
removeLongLivedShortcut을 사용합니다. 시스템 서비스에서 캐시되는지 여부와 관계없이 바로가기를 삭제하는 데 선호되는 방식입니다. 다음 코드 스니펫은 이 작업을 실행하는 방법을 보여줍니다.Kotlin
val deleteShortcutId = "..." ShortcutManagerCompat.removeLongLivedShortcuts(myContext, listOf(deleteShortcutId))
자바
String deleteShortcutId = "..."; ShortcutManagerCompat.removeLongLivedShortcuts( myContext, Arrays.asList(deleteShortcutId));
직접 공유 타겟의 순위 개선하기
Android Sharesheet에는 정해진 수의 직접 공유 타겟이 표시됩니다. 이러한 추천은 순위별로 정렬됩니다. 다음과 같이 하여 바로가기의 순위를 개선할 수 있습니다.
- 모든
shortcutIds가 고유하고 다른 타겟에 재사용되지 않도록 합니다. - 바로가기가 오래 지속되도록 하려면
setLongLived(true)를 호출합니다. - 대화 관련 바로가기의 경우 상응하는 바로가기를 다시 게시하여 발신 및 수신 메시지의 바로가기 사용량을 보고합니다.
ShortcutManagerCompat.pushDynamicShortcut자세한 내용은 이 페이지의 통신 앱의 바로가기 사용량 보고를 참고하세요. - 관련이 없거나 비활성 직접 공유 타겟(예: 지난 30일 동안 사용자가 메시지를 보내지 않은 연락처)을 제공하지 마세요.
- SMS 앱의 경우 단축 코드 또는 잠재적 스팸으로 식별된 대화의 바로가기를 제공하지 마세요. 사용자가 이러한 대화에 공유할 가능성은 매우 낮습니다.
setCategories()를 호출하여 바로가기를 적절한mimeType속성과 연결합니다. 예를 들어 SMS 앱의 경우 연락처가 RCS 또는 MMS를 지원하지 않으면 상응하는 바로가기를image/*및video/*와 같은 텍스트가 아닌 MIME 유형과 연결하지 않습니다.- 특정 대화의 경우 동적 바로가기가 푸시되고 사용량이 보고되면 바로가기 ID를 변경하지 마세요. 이렇게 하면 순위 지정에 사용량 데이터가 보존됩니다.
사용자가 직접 공유 타겟을 탭하면 앱에서 타겟의 주제에 직접 작업을 실행할 수 있는 UI로 이동해야 합니다. 사용자에게 명확성 UI를 표시하지 말고 탭한 타겟과 관련이 없는 UI에 배치하지 마세요. 예를 들어 메시지 앱의 경우 사용자가 직접 공유 타겟을 탭하면 자신이 선택한 사람과의 대화형식으로 보기로 연결됩니다. 키보드가 표시되고 메시지가 공유 데이터로 미리 채워집니다.
Sharing Shortcuts API
Android 10 (API 수준 29)부터
ShortcutInfo.Builder 공유 타겟에 관한 추가 정보를 제공하는 메서드와 개선사항이 추가되었습니다.
setCategories()- Android 10부터 카테고리는 공유 인텐트 또는 작업을 처리할 수 있는 바로가기를 필터링하는 데도 사용됩니다. 자세한 내용은 공유 타겟 선언하기를 참고하세요. 이 필드는 공유 타겟으로 사용하기 위한 바로가기에 필요합니다.
setLongLived()앱에서 동적 또는 고정된 바로가기로 게시 취소되거나 표시되지 않게 된 경우 바로가기가 유효한지 여부를 지정합니다. 바로가기가 오래 지속되면 동적 바로가기로 게시 취소된 후에도 다양한 시스템 서비스에서 캐시할 수 있습니다.
바로가기가 오래 지속되도록 하면 바로가기의 순위가 향상될 수 있습니다. 자세한 내용은 최적의 순위 지정을 참고하세요.
setShortLabel(),setLongLabel()개별 사용자에게 바로가기를 게시할 때는
setLongLabel()에 전체 이름을 포함하고setShortLabel()에 닉네임 또는 이름과 같은 짧은 이름을 포함하세요.
GitHub에서 공유 바로가기 게시 예시를 살펴보세요.
바로가기 이미지 제공하기
공유 바로가기를 만들려면 setIcon()을 통해 이미지를 추가해야 합니다.
공유 바로가기는 시스템 화면에 표시될 수 있으며 모양이 변경될 수 있습니다.
또한 Android 버전 7, 8 또는 9 (API 수준 25, 26, 27, 28)를 실행하는 일부 기기에서는 배경이 없는 비트맵 전용 아이콘이 표시되어 대비가 크게 감소할 수 있습니다. 바로가기가 의도한 대로 표시되도록 하려면
적응형 비트맵을 사용하여 IconCompat.createWithAdaptiveBitmap() 제공하세요.
적응형 비트맵은 적응형 아이콘에 설정된 동일한 가이드라인과 크기를 따라야 합니다. 이를 달성하는 가장 일반적인 방법은 의도한 정사각형 비트맵을 72x72dp로 확장하고 108x108dp 투명 캔버스 내에 가운데에 배치하는 것입니다. 아이콘에 투명한 영역이 포함되어 있으면 배경 색상을 포함해야 합니다. 그렇지 않으면 투명한 영역이 검은색으로 표시됩니다.
특정 도형으로 마스킹된 이미지를 제공하지 마세요. 예를 들어 Android 10 (API 수준 29) 이전에는 직접 공유 ChooserTarget과 관련하여 원으로 마스킹된 사용자 아바타를 제공하는 것이 일반적이었습니다. 이제 Android Sharesheet 및 Android 10의 다른 시스템 화면은 바로가기 이미지의 도형과 테마를 설정합니다.
`
ShortcutManagerCompat`를 통해 공유 바로가기를 제공하는 데 선호되는 메서드는 이전 버전과 호환되는 직접 공유 `ChooserTarget` 객체의 모양을 원으로 자동 설정합니다.
공유 타겟 선언하기
정적 바로가기 정의와 마찬가지로 앱의 리소스 파일에서 공유 타겟을 선언해야 합니다. 다른 정적 바로가기 정의와 함께 리소스 파일의 <shortcuts> 루트 요소 내에 공유 타겟 정의를 추가합니다. 각 <share-targets> 요소
에는 공유 데이터 유형, 일치하는 카테고리, 공유 인텐트를 처리할 타겟 클래스에 관한 정보가 포함되어 있습니다. XML 코드는 다음과 같습니다.
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <share-target android:targetClass="com.example.android.sharingshortcuts.SendMessageActivity"> <data android:mimeType="text/plain" /> <category android:name="com.example.android.sharingshortcuts.category.TEXT_SHARE_TARGET" /> </share-target> </shortcuts>
공유 타겟의 데이터 요소는 인텐트 필터의 데이터 사양과 비슷합니다. 각 공유 타겟에는 여러 카테고리가 있을 수 있으며, 이는 앱의 게시된 바로가기를 공유 타겟 정의와 일치시키는 데만 사용됩니다. 카테고리에는 임의의 앱 정의 값이 있을 수 있습니다.
사용자가 Android Sharesheet에서 위의 타겟 공유 예와 일치하는 공유 바로가기를 선택하는 경우 앱이 다음과 같은 공유 인텐트를 가져옵니다.
Action: Intent.ACTION_SEND ComponentName: {com.example.android.sharingshortcuts / com.example.android.sharingshortcuts.SendMessageActivity} Data: Uri to the shared content EXTRA_SHORTCUT_ID: <ID of the selected shortcut>
사용자가 런처 바로가기에서 공유 타겟을 연 경우 앱은
공유 바로가기를
ShortcutManagerCompat에 추가할 때 생성된 인텐트를 가져옵니다.
다른 인텐트이므로 Intent.EXTRA_SHORTCUT_ID를 사용할 수 없으며 필요한 경우 ID를 수동으로 전달해야 합니다.
통신 앱의 바로가기 사용량 보고
통신 앱을 개발하는 경우 발신 및 수신 메시지의 사용량을 보고하여 Android Sharesheet에서 순위를 개선할 수 있습니다.
이렇게 하려면
ShortcutManagerCompat.pushDynamicShortcut을 통해 연락처를 나타내는 대화 바로가기를 다시 게시합니다.
바로가기 사용량 및 기능 결합은 Android 5.0(API 21)과 이전 버전과 호환됩니다.
발신 메시지의 바로가기 사용량 보고
사용자가 보낸 메시지의 사용량을 보고하는 것은 메시지를 만든 후 '보내기' 버튼을 클릭하는 것과 기능적으로 유사합니다.
사용량 보고를 트리거하려면 바로가기에 기능 결합을 지정합니다.
ShortcutInfoCompat.Builder#addCapabilityBinding
actions.intent.SEND_MESSAGE 기능을 사용합니다.
Kotlin
val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE").build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
자바
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE") .build(); ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
발신 메시지가 그룹 채팅용인 경우 기능과 연결된 recipient
유형으로 Audience
매개변수 값도 추가해야 합니다.
Kotlin
val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(groupShortTitle) .setLongLabel(groupLongTitle) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE", "message.recipient.@type", listOf("Audience")).build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
자바
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(groupShortTitle) .setLongLabel(groupLongTitle) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE", "message.recipient.@type", Arrays.asList("Audience")) .build(); ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
수신 메시지의 바로가기 사용량 보고
사용자가 SMS,
채팅 메시지, 이메일 또는 알림과 같은 메시지를 수신할 때 사용량 보고를 트리거하려면 기능
결합을 통해 바로가기에 추가로 지정해야 합니다.
ShortcutInfoCompat.Builder#addCapabilityBinding
actions.intent.RECEIVE_MESSAGE 기능을 사용합니다.
Kotlin
val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE").build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
자바
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE") .build(); ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
수신 메시지가 그룹 채팅에서 온 경우 기능과 연결된 sender 유형
으로 Audience
매개변수 값도 추가해야 합니다.
Kotlin
val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(groupShortTitle) .setLongLabel(groupLongTitle) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE", "message.sender.@type", listOf("Audience")).build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
자바
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(groupShortTitle) .setLongLabel(groupLongTitle) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE", "message.sender.@type", Arrays.asList("Audience")) .build(); ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
AndroidX를 사용하여 공유 바로가기와 ChooserTargets 모두 제공하기
AndroidX 호환성 라이브러리로 작업하려면 앱 매니페스트에 메타데이터 선택기 타겟 서비스와 인텐트 필터 집합이 포함되어 있어야 합니다. 현재 ChooserTargetService 직접 공유 API를 참고하세요.
이 서비스는 호환성 라이브러리에 이미 선언되어 있으므로 사용자가 앱의 매니페스트에서 서비스를 선언할 필요가 없습니다. 그러나 공유 활동에서 서비스로 연결되는 링크는 선택기 타겟 제공업체로 고려해야 합니다.
다음 예에서 ChooserTargetService 구현은
androidx.core.content.pm.ChooserTargetServiceCompat이며, 이는 AndroidX에 이미 정의되어 있습니다.
<activity android:name=".SendMessageActivity" android:label="@string/app_name" android:theme="@style/SharingShortcutsDialogTheme"> <!-- This activity can respond to Intents of type SEND --> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <!-- Only needed if you import the sharetarget AndroidX library that provides backwards compatibility with the old DirectShare API. The activity that receives the Sharing Shortcut intent needs to be taken into account with this chooser target provider. --> <meta-data android:name="android.service.chooser.chooser_target_service" android:value="androidx.sharetarget.ChooserTargetServiceCompat" /> </activity>
공유 바로가기 FAQ
바로가기 사용량 데이터는 어떻게 저장되며 기기를 떠나나요?
바로가기는 암호화된 디스크 파티션의 시스템 데이터 디렉터리에 완전히 기기에 저장됩니다. 아이콘, 인텐트, 사용자 및 리소스 이름과 같은 바로가기의 정보는 시스템 서비스와 바로가기를 게시하는 동일한 앱에서만 액세스할 수 있습니다.
직접 공유의 기록은 무엇인가요?
Android 6.0 (API 수준 23)에서 앱이
ChooserTarget 객체를 ChooserTargetService 통해 제공할 수 있도록 직접 공유를 도입했습니다. 결과는 요구에 따라 사후 대응적으로 검색되어 타겟의 로드 시간이 느려졌습니다.
Android 10 (API 수준 29)에서는 ChooserTargetService 직접 공유 API를 새로운 공유 바로가기 API로 대체했습니다. 요구에 따라 사후 대응적으로 결과를 검색하지 않고 공유 바로가기 API를 통해 앱에서 직접 공유 타겟을 미리 게시할 수 있습니다. 이렇게 하면 ShareSheet를 준비할 때 직접 공유 타겟을 검색하는 프로세스가 빠르게 진행되었습니다. ChooserTargetService 직접 공유 메커니즘은 계속 작동하지만 시스템은 이 방식으로 제공되는 타겟의 순위를 공유 바로가기 API를 사용하는 타겟보다 낮게 지정합니다.
Android 11 (API 수준 30)에서는 ChooserTargetService 서비스가 지원 중단되었으며 공유 바로가기 API가 직접 공유 타겟을 제공하는 유일한 방법입니다.
공유 타겟의 게시된 바로가기는 런처 바로가기 (런처에서 앱 아이콘을 길게 누를 때의 일반적인 바로가기 사용)와 어떻게 다른가요?
'공유 타겟' 목적으로 게시된 바로가기는 런처 바로가기이기도 하며 앱 아이콘을 길게 누르면 메뉴에 표시됩니다. 활동당 최대 바로가기 수 제한은 앱이 게시하는 총 바로가기 수 (공유 타겟과 기존 런처 바로가기 결합)에도 적용됩니다.
게시해야 하는 공유 바로가기 수에 관한 가이드라인은 무엇인가요?
공유 바로가기 수는 getMaxShortcutCountPerActivity(android.content.Context)를 통해 사용할 수 있는 동적
바로가기의 동일한 제한으로 제한됩니다. 이 제한까지 원하는 수를 게시할 수 있지만 공유 바로가기는 앱 런처 길게 누르기 및 공유 시트에 표시될 수 있다는 점을 명심해야 합니다. 대부분의 앱 런처는 길게 누르기 시 세로 모드에서 최대 4개 또는 5개의 바로가기를 표시하고 가로 모드에서는 8개를 표시합니다. 공유 바로가기에 관한 자세한 내용과 가이드라인은 이
FAQ
를 참고하세요.