-
Android Direct Share 제대로 이해하기 — Sharing Shortcuts API 정리Android📱 2026. 8. 4. 15:46

안드로이드에서 무언가를 공유할 때 뜨는 Sharesheet(공유 시트). 보통은 "앱을 고르고 → 그 앱에서 다시 대화 상대를 찾는" 두 단계를 거칩니다. Direct Share는 이 두 단계를 없애고, 자주 쓰는 대화 상대를 공유 시트 상단에 바로 띄워 한 번에 공유를 끝내주는 기능입니다. 이 글에서는 Direct Share의 현재 구현 방식인 Sharing Shortcuts API를 정리합니다.
먼저: API 변천사 (이게 핵심)
Direct Share는 구현 방식이 버전에 따라 크게 바뀌었습니다. 지금 어떤 API를 써야 하는지 헷갈린다면 이 표만 기억하면 됩니다.
버전 방식 상태 Android 6 (API 23) ChooserTargetService— 요청 시 on-demand 반환느림, deprecated Android 10 (API 29) Sharing Shortcuts — 사전 게시 고속화, 권장 Android 11 (API 30) ChooserTargetServicedeprecatedSharing Shortcuts만 가능 즉 Android 11부터 Direct Share 타겟은 오직 Sharing Shortcuts API로만 제공할 수 있습니다. 권장 진입점은 AndroidX의
ShortcutManagerCompat이고, 이건 구형ChooserTarget까지 함께 처리하며 API 21까지 하위호환됩니다.게시 4단계
Sharesheet의 Direct Share 행(row)은 Sharing Shortcuts로 게시한 dynamic shortcut만 노출합니다. 게시 흐름은 다음 네 단계입니다.
1. XML에 share-target 선언
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <share-target android:targetClass="com.example.sharingshortcuts.SendMessageActivity"> <data android:mimeType="text/plain" /> <category android:name="com.example.sharingshortcuts.category.TEXT_SHARE_TARGET" /> </share-target> </shortcuts>여기서
category는 앱이 임의로 정의한 값으로, 게시한 숏컷과 share-target 정의를 매칭하는 용도입니다.2. setDynamicShortcuts로 게시
ShortcutManagerCompat.setDynamicShortcuts(myContext, listOf(shortcut1, shortcut2))중요도 순으로 정렬해 게시합니다(낮은 index = 상위 노출). 통신 앱이라면 최근 대화 순으로 두면 됩니다. 단, 최근 30일간 활동이 없는 대화는 stale로 간주 → 게시 금지입니다.
3. 사용량 리포팅 (통신 앱)
메시지를 주고받을 때마다
pushDynamicShortcut으로 사용량을 리포팅하면 랭킹이 올라갑니다.val shortcutInfo = ShortcutInfoCompat.Builder(myContext, conversationId) .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE") .build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)4. 삭제
ShortcutManagerCompat.removeLongLivedShortcuts(myContext, listOf(deleteShortcutId))연락처가 삭제되면 이 메서드로 제거합니다. 시스템 캐시 여부와 무관하게 지우는 권장 방법입니다.
숏컷을 잘 기술하기 (ShortcutInfoCompat.Builder)
setCategories()— share intent 필터링에 쓰입니다. share target용 숏컷에는 필수.setLongLived(true)— 언퍼블리시 후에도 시스템 서비스가 캐시할 수 있어 랭킹이 향상됩니다.setShortLabel()/setLongLabel()— long에는 전체 이름, short에는 별명/이름.setIcon()—IconCompat.createWithAdaptiveBitmap()으로 adaptive bitmap을 제공하세요(72×72 dp를 108×108 dp 투명 캔버스 중앙에 배치). 투명 영역이 있으면 배경색을 넣어야 검게 보이지 않습니다. 특정 모양으로 미리 마스킹하지 마세요 — 시스템이 알아서 shape·테마를 적용하고,ShortcutManagerCompat가 원형화까지 자동 처리합니다.
랭킹을 올리는 규칙
shortcutId는 유일하게, 그리고 대화별로 고정해서 재사용하지 마세요. 그래야 사용량 데이터가 누적됩니다.- 송·수신 메시지 사용량을 리포팅(재게시)하세요.
- stale/무관한 타겟(30일 미접촉), SMS 스팸·short code는 피하세요.
setCategories()로 적절한mimeType을 연결하세요. 예를 들어 RCS/MMS가 안 되는 연락처엔image/*·video/*를 연결하지 마세요.
사용량 리포팅 — capability binding
addCapabilityBinding(...)으로 트리거합니다.- 발신:
actions.intent.SEND_MESSAGE(그룹챗이면message.recipient.@type=Audience추가) - 수신:
actions.intent.RECEIVE_MESSAGE(그룹챗이면message.sender.@type=Audience추가)
사용량·capability binding은 API 21까지 하위호환됩니다.
탭 이후 동작 계약
매칭된 숏컷을 탭하면 앱은 다음 intent를 받습니다.
Action: Intent.ACTION_SEND ComponentName: {대상 targetClass} Data: 공유 콘텐츠 Uri EXTRA_SHORTCUT_ID: 선택된 숏컷 ID단, 런처 숏컷으로 열면
EXTRA_SHORTCUT_ID가 없으니 필요하면 직접 전달해야 합니다. 그리고 타겟을 탭하면 반드시 대상에 즉시 액션할 수 있는 화면으로 데려가야 합니다(예: 메시징 앱이면 키보드가 뜨고 공유 데이터가 prefill된 대화 화면). 중간에 앱을 다시 고르게 하거나 무관한 화면을 띄우면 안 됩니다.알아두면 좋은 점
- 숏컷 데이터는 기기 내 암호화 파티션에만 저장되고, 시스템 서비스와 게시한 앱만 접근합니다. 기기 밖으로 나가지 않습니다.
- share target 숏컷은 런처 롱프레스 숏컷을 겸합니다. activity당 최대 숏컷 수 제한을 함께 쓰며(
getMaxShortcutCountPerActivity), 롱프레스 메뉴는 보통 세로 4~5개·가로 8개까지 노출됩니다.
정리
Direct Share의 요점은 "공유 대상을 미리 게시해 두고, 사용량을 꾸준히 리포팅해 랭킹을 관리한다"입니다. Android 11부터는 선택지가 하나(Sharing Shortcuts +
ShortcutManagerCompat)뿐이니, 통신·공유 기능이 있는 앱이라면setLongLived·capability binding·고정shortcutId이 세 가지만 확실히 챙겨도 절반은 성공입니다.이 글은 Android 공식 문서(Provide Direct Share targets)를 바탕으로 개인 개발 학습 위키에 정리한 노트를 재구성한 것입니다.
'Android📱' 카테고리의 다른 글
Jetpack Compose 1.9 다시 읽기 — 그림자, 가시성 추적, 그리고 프리페치가 남긴 함정 (0) 2026.08.10 a2ui: AI 에이전트가 처음 보는 Android UI를 그리는 법 (1) 2026.08.03 Jetpack Compose Side Effects 파헤치기 — RememberObserver로 이해하는 effect 핸들러 (1) 2026.08.01 ComposeView가 언제 죽는지 아세요? — ViewCompositionStrategy 파헤치기 (0) 2026.07.10 Navigation 3 설명회 (0) 2026.07.06