이 문서는 Kakao SDK for Android(이하 Android SDK)를 사용한 카카오톡 공유 API 구현 방법을 안내합니다.
Android SDK 2.4.0 미만 버전 사용 시에만 필요한 설정입니다. Android 11에서는 카카오톡 앱을 통해 메시지를 보내기 위해 패키지 쿼리 및 상호작용 설정이 필요합니다. 앱이 Android 11을 타겟팅하는 경우, AndroidManifest.xml에 아래와 같이 queries
요소를 추가해야 합니다. 자세한 내용은 Android 11의 패키지 공개 상태를 참고합니다.
<manifest package="com.example.sample">
<!--queries에 카카오톡 패키지 추가-->
<queries>
<package android:name="com.kakao.talk" />
</queries>
...
</manifest>
메시지 API는 카카오톡 공유와 카카오톡 메시지 두 가지입니다. 이해하기를 참고해 어떤 API로 메시지 보내기를 구현할 것인지 결정합니다.
메시지 템플릿 참고하여 어떤 메시지 템플릿을 사용할지 결정합니다.
보낼 메시지는 기본 템플릿을 바탕으로 객체 형태로 구성하거나, 서비스에 맞게 직접 구성한 사용자 정의 템플릿을 사용하여 구성할 수 있습니다. 자세한 정보는 사용 방법에서 확인할 수 있습니다.
메시지를 구성한 후, 원하는 메시지 및 템플릿에 따라 API를 호출합니다. 요청이 성공하면 Android SDK는 카카오톡을 실행하거나, 웹 페이지를 통해 카카오계정으로 로그인하여 메시지를 보낼 친구 및 대화방 목록을 보여줍니다. 사용자가 메시지를 보낼 친구 또는 대화방을 선택하면 메시지가 전송됩니다.
카카오톡 공유 완료 시 반환되는 값은 없으며, 전송 성공 여부는 카카오톡 공유 전송 성공 알림 설정하기를 통해서만 알 수 있습니다.
사용자가 카카오톡 메시지의 버튼을 통해 앱을 실행할 수 있도록 하려면 AndroidManifest.xml 파일에 커스텀 URL 스킴(Custom URL Scheme) 설정을 해야 합니다. Android 12(API 31) 이상을 타깃으로 하는 앱인 경우, exported
요소를 반드시 true
로 선언해야 합니다. 다음 예제를 참고합니다.
<activity
android:name=".${YOUR_ACTIVITY_NAME}"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- "kakao${YOUR_NATIVE_APP_KEY}://kakaolink" 형식의 앱 실행 스킴을 설정하는데 사용 -->
<data android:host="kakaolink"
android:scheme="kakao${YOUR_NATIVE_APP_KEY}" />
</intent-filter>
</activity>
네이티브 앱의 경우, 커스텀 URL 스킴을 통한 앱 실행 시 서비스의 필요에 따라 추가 정보를 전달할 수 있습니다. androidExecutionParams
, iosExecutionParams
파라미터로 앱 실행 시 전달할 키와 값을 설정할 수 있습니다. 해당 파라미터 사용 시, 카카오톡 공유 메시지에서 앱을 실행하는 버튼을 클릭하면 아래와 같은 스킴이 호출됩니다.
kakao${YOUR_NATIVE_APP_KEY}://kakaolink?${androidExecutionParams}
kakao${YOUR_NATIVE_APP_KEY}://kakaolink?${iosExecutionParams}
// 예시
kakao${YOUR_NATIVE_APP_KEY}://kakaolink?key1=value1&key2=value2&key3=value3
카카오톡 공유와 카카오톡 메시지 API는 카카오톡 메시지를 구성할 때 com.kakao.sdk.template
에 정의된 클래스들을 공통적으로 사용합니다. 메시지 템플릿 구성 요소를 참고하여 원하는 메시지 템플릿에서 지원하는 객체들을 포함하여 메시지를 구성합니다.
다음은 종류별 메시지 구성 예제입니다.
val defaultFeed = FeedTemplate(
content = Content(
title = "오늘의 디저트",
description = "#케익 #딸기 #삼평동 #카페 #분위기 #소개팅",
imageUrl = "https://mud-kage.kakao.com/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png",
link = Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com"
)
),
itemContent = ItemContent(
profileText = "Kakao",
profileImageUrl = "https://mud-kage.kakao.com/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png",
titleImageUrl = "https://mud-kage.kakao.com/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png",
titleImageText = "Cheese cake",
titleImageCategory = "Cake",
items = listOf(
ItemInfo(item = "cake1", itemOp = "1000원"),
ItemInfo(item = "cake2", itemOp = "2000원"),
ItemInfo(item = "cake3", itemOp = "3000원"),
ItemInfo(item = "cake4", itemOp = "4000원"),
ItemInfo(item = "cake5", itemOp = "5000원")
),
sum = "Total",
sumOp = "15000원"
),
social = Social(
likeCount = 286,
commentCount = 45,
sharedCount = 845
),
buttons = listOf(
Button(
"웹으로 보기",
Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com"
)
),
Button(
"앱으로 보기",
Link(
androidExecutionParams = mapOf("key1" to "value1", "key2" to "value2"),
iosExecutionParams = mapOf("key1" to "value1", "key2" to "value2")
)
)
)
)
val defaultList = ListTemplate(
headerTitle = "WEEKLY MAGAZINE",
headerLink = Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com"
),
contents = listOf(
Content(
title = "취미의 특징, 탁구",
description = "스포츠",
imageUrl = "https://mud-kage.kakao.com/dn/bDPMIb/btqgeoTRQvd/49BuF1gNo6UXkdbKecx600/kakaolink40_original.png",
link = Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com"
)
),
Content(
title = "크림으로 이해하는 커피이야기",
description = "음식",
imageUrl = "https://mud-kage.kakao.com/dn/QPeNt/btqgeSfSsCR/0QJIRuWTtkg4cYc57n8H80/kakaolink40_original.png",
link = Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com"
)
),
Content(
title = "감성이 가득한 분위기",
description = "사진",
imageUrl = "https://mud-kage.kakao.com/dn/c7MBX4/btqgeRgWhBy/ZMLnndJFAqyUAnqu4sQHS0/kakaolink40_original.png",
link = Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com"
)
)
),
buttons = listOf(
Button(
"웹으로 보기",
Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com"
)
),
Button(
"앱으로 보기",
Link(
androidExecutionParams = mapOf("key1" to "value1", "key2" to "value2"),
iosExecutionParams = mapOf("key1" to "value1", "key2" to "value2")
)
)
)
)
val defaultLocation = LocationTemplate(
address = "경기 성남시 분당구 판교역로 235 에이치스퀘어 N동 8층",
addressTitle = "카카오 판교오피스 카페톡",
content = Content(
title = "신메뉴 출시❤️ 체리블라썸라떼",
description = "이번 주는 체리블라썸라떼 1+1",
imageUrl = "https://mud-kage.kakao.com/dn/bSbH9w/btqgegaEDfW/vD9KKV0hEintg6bZT4v4WK/kakaolink40_original.png",
link = Link(
webUrl = "https://developers.com",
mobileWebUrl = "https://developers.kakao.com"
)
),
social = Social(
likeCount = 286,
commentCount = 45,
sharedCount = 845
)
)
val defaultCommerce = CommerceTemplate(
content = Content(
title = "Ivory long dress (4 Color)",
imageUrl = "https://mud-kage.kakao.com/dn/RY8ZN/btqgOGzITp3/uCM1x2xu7GNfr7NS9QvEs0/kakaolink40_original.png",
link = Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com"
)
),
commerce = Commerce(
regularPrice = 208800,
discountPrice = 146160,
discountRate = 30,
productName = "Ivory long dress"
),
buttons = listOf(
Button(
"구매하기",
Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com"
)
),
Button(
"공유하기",
Link(
androidExecutionParams = mapOf("key1" to "value1", "key2" to "value2"),
iosExecutionParams = mapOf("key1" to "value1", "key2" to "value2")
)
)
)
)
val defaultText = TextTemplate(
text = """
카카오톡 공유는 카카오톡을 실행하여
사용자가 선택한 채팅방으로 메시지를 전송합니다.
""".trimIndent(),
link = Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com"
)
)
val defaultCalendar = CalendarTemplate(
idType = IdType.EVENT,
id = "${YOUR_EVENT_ID}",
content = Content(
title = "1월 신작 평론 모임",
description = "따끈한 신작 감상평을 나누는 월간 모임에 초대합니다.",
imageUrl = "http://k.kakaocdn.net/dn/dFUqwp/bl3SUTqb2VV/VFSqyPpKUzZVVMcmotN9A0/kakaolink40_original.png",
link = Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com",
)
),
buttons = listOf(
Button(
title = "모임 주제 보기",
link = Link(
webUrl = "https://developers.kakao.com",
mobileWebUrl = "https://developers.kakao.com",
),
)
)
)
예를 들어 피드 메시지(Feed Message)를 구성하여 메시지를 보내려면 다음과 같이 진행합니다.
1. 템플릿 구성 요소 확인피드 메시지 구성 요소에서 어떤 객체를 포함해야 하는지 확인합니다. 레퍼런스를 통해서도 확인 가능합니다. Android 카카오 SDK에 피드 메시지는 FeedTemplate
클래스로 정의되어 있습니다.
피드 메시지에 포함할 수 있는 구성 요소는 content
, itemContent
, social
, buttonTitle
, buttons
입니다. 이 중 필수적으로 포함하여야 하는 구성 요소는 content
입니다. 각 구성 요소 또한 가이드 및 레퍼런스를 참고해 필수 및 선택 구성 요소의 내용을 채워 넣어 FeedTemplate
객체를 생성합니다.
생성한 FeedTemplate
객체를 카카오톡 공유 또는 카카오톡 메시지 API 호출 시 전달합니다.
레퍼런스 | 앱 설정 |
---|---|
[SDK, RxSDK] shareDefault() [SDK] isKakaoTalkSharingAvailable() [SDK] makeDefaultUrl() [SDK] SharingResult |
설치 초기화 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | 플랫폼 등록 | - | - |
사용하려는 기본 템플릿에 따라 메시지를 JSON
형식으로 구성하여 카카오톡 메시지를 보내는 기능입니다.
카카오톡을 통한 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoTalkSharingAvailable()
을 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다.
shareDefault()
을 호출하여 SharingResult
객체를 반환받습니다. 해당 객체의 intent
를 사용해 액티비티를 실행하여 카카오톡으로 메시지를 공유하도록 구현합니다.WebSharerClient
의 makeDefaultUrl()
을 통해 웹 공유 URL을 생성한 후, 기본 브라우저나 웹뷰로 해당 URL을 열도록 구현합니다.// 피드 메시지 보내기
// 카카오톡 설치여부 확인
if (ShareClient.instance.isKakaoTalkSharingAvailable(context)) {
// 카카오톡으로 카카오톡 공유 가능
ShareClient.instance.shareDefault(context, defaultFeed) { sharingResult, error ->
if (error != null) {
Log.e(TAG, "카카오톡 공유 실패", error)
}
else if (sharingResult != null) {
Log.d(TAG, "카카오톡 공유 성공 ${sharingResult.intent}")
startActivity(sharingResult.intent)
// 카카오톡 공유에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
Log.w(TAG, "Warning Msg: ${sharingResult.warningMsg}")
Log.w(TAG, "Argument Msg: ${sharingResult.argumentMsg}")
}
}
} else {
// 카카오톡 미설치: 웹 공유 사용 권장
// 웹 공유 예시 코드
val sharerUrl = WebSharerClient.instance.makeDefaultUrl(defaultFeed)
// CustomTabs으로 웹 브라우저 열기
// 1. CustomTabsServiceConnection 지원 브라우저 열기
// ex) Chrome, 삼성 인터넷, FireFox, 웨일 등
try {
KakaoCustomTabsClient.openWithDefault(context, sharerUrl)
} catch(e: UnsupportedOperationException) {
// CustomTabsServiceConnection 지원 브라우저가 없을 때 예외처리
}
// 2. CustomTabsServiceConnection 미지원 브라우저 열기
// ex) 다음, 네이버 등
try {
KakaoCustomTabsClient.open(context, sharerUrl)
} catch (e: ActivityNotFoundException) {
// 디바이스에 설치된 인터넷 브라우저가 없을 때 예외처리
}
}
var disposables = CompositeDisposable()
// 피드 메시지 보내기
ShareClient.rx.shareDefault(context, defaultFeed)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ sharingResult ->
Log.d(TAG, "카카오톡 공유 성공 ${sharingResult.intent}")
startActivity(sharingResult.intent)
// 카카오톡 공유에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
Log.w(TAG, "Warning Msg: ${sharingResult.warningMsg}")
Log.w(TAG, "Argument Msg: ${sharingResult.argumentMsg}")
}, { error ->
Log.e(TAG, "카카오톡 공유 실패 ", error)
})
.addTo(disposables)
레퍼런스 | 앱 설정 |
---|---|
[SDK, RxSDK] shareCustom() [SDK] isKakaoTalkSharingAvailable() [SDK] SharingResult [SDK] makeCustomUrl() |
설치 초기화 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | 플랫폼 등록 메시지 템플릿 |
- | - |
[도구] > [메시지 템플릿]에서 직접 구성한 사용자 정의 템플릿을 사용하여 카카오톡으로 메시지를 공유하는 기능입니다.
카카오톡을 통한 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoTalkSharingAvailable()
을 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다.
shareCustom()
을 호출하여 SharingResult
객체를 반환받습니다. 해당 객체의 intent
를 사용해 액티비티를 실행하여 카카오톡으로 메시지를 공유하도록 구현합니다.WebSharerClient
의 makeCustomUrl()
를 통해 웹 공유 URL을 생성한 후, 기본 브라우저나 웹뷰로 해당 URL을 열도록 구현합니다.// 사용자 정의 메시지 ID
// * 만들기 가이드: https://developers.kakao.com/docs/latest/ko/message/message-template
val templateId = templateIds["customMemo"] as Long
// 카카오톡 설치여부 확인
if (ShareClient.instance.isKakaoTalkSharingAvailable(context)) {
// 카카오톡으로 카카오톡 공유 가능
ShareClient.instance.shareCustom(context, templateId) { sharingResult, error ->
if (error != null) {
Log.e(TAG, "카카오톡 공유 실패", error)
}
else if (sharingResult != null) {
Log.d(TAG, "카카오톡 공유 성공 ${sharingResult.intent}")
startActivity(sharingResult.intent)
// 카카오톡 공유에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
Log.w(TAG, "Warning Msg: ${sharingResult.warningMsg}")
Log.w(TAG, "Argument Msg: ${sharingResult.argumentMsg}")
}
}
} else {
// 카카오톡 미설치: 웹 공유 사용 권장
// 웹 공유 예시 코드
val sharerUrl = WebSharerClient.instance.makeCustomUrl(templateId)
// CustomTabs으로 웹 브라우저 열기
// 1. CustomTabsServiceConnection 지원 브라우저 열기
// ex) Chrome, 삼성 인터넷, FireFox, 웨일 등
try {
KakaoCustomTabsClient.openWithDefault(context, sharerUrl)
} catch(e: UnsupportedOperationException) {
// CustomTabsServiceConnection 지원 브라우저가 없을 때 예외처리
}
// 2. CustomTabsServiceConnection 미지원 브라우저 열기
// ex) 다음, 네이버 등
try {
KakaoCustomTabsClient.open(context, sharerUrl)
} catch (e: ActivityNotFoundException) {
// 디바이스에 설치된 인터넷 브라우저가 없을 때 예외처리
}
}
var disposables = CompositeDisposable()
// 사용자 정의 메시지 ID
// * 만들기 가이드: https://developers.kakao.com/docs/latest/ko/message/message-template
val templateId = templateIds["customMemo"] as Long
ShareClient.rx.shareCustom(context, templateId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ sharingResult ->
Log.d(TAG, "카카오톡 공유 성공 ${sharingResult.intent}")
startActivity(sharingResult.intent)
// 카카오톡 공유에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
Log.w(TAG, "Warning Msg: ${sharingResult.warningMsg}")
Log.w(TAG, "Argument Msg: ${sharingResult.argumentMsg}")
}, { error ->
Log.e(TAG, "카카오톡 공유 실패 ", error)
})
.addTo(disposables)
레퍼런스 | 앱 설정 |
---|---|
[SDK, RxSDK] shareScrap() [SDK] isKakaoTalkSharingAvailable() [SDK] makeScrapUrl() [SDK] SharingResult |
설치 초기화 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | 플랫폼 등록 | - | - |
스크랩한 웹 페이지 정보를 바탕으로 메시지를 구성하여 카카오톡으로 메시지를 공유하는 기능입니다.
카카오톡을 통한 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoTalkSharingAvailable()
을 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다.
shareScrap()
을 호출하여 SharingResult
객체를 반환받습니다. 해당 객체의 intent
를 사용해 액티비티를 실행하여 카카오톡으로 메시지를 공유하도록 구현합니다.WebSharerClient
의 makeScrapUrl()
를 통해 웹 공유 URL을 생성한 후, 기본 브라우저나 웹뷰로 해당 URL을 열도록 구현합니다.// 공유할 웹페이지 URL
// * 주의: 개발자사이트 Web 플랫폼 설정에 공유할 URL의 도메인이 등록되어 있어야 합니다.
val url = "https://developers.kakao.com"
// 카카오톡 설치여부 확인
if (ShareClient.instance.isKakaoTalkSharingAvailable(context)) {
// 카카오톡으로 카카오톡 공유 가능
ShareClient.instance.shareScrap(context, url) { sharingResult, error ->
if (error != null) {
Log.e(TAG, "카카오톡 공유 실패", error)
}
else if (sharingResult != null) {
Log.d(TAG, "카카오톡 공유 성공 ${sharingResult.intent}")
startActivity(sharingResult.intent)
// 카카오톡 공유에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
Log.w(TAG, "Warning Msg: ${sharingResult.warningMsg}")
Log.w(TAG, "Argument Msg: ${sharingResult.argumentMsg}")
}
}
} else {
// 카카오톡 미설치: 웹 공유 사용 권장
// 웹 공유 예시 코드
val sharerUrl = WebSharerClient.instance.makeScrapUrl(url)
// CustomTabs으로 웹 브라우저 열기
// 1. CustomTabsServiceConnection 지원 브라우저 열기
// ex) Chrome, 삼성 인터넷, FireFox, 웨일 등
try {
KakaoCustomTabsClient.openWithDefault(context, sharerUrl)
} catch(e: UnsupportedOperationException) {
// CustomTabsServiceConnection 지원 브라우저가 없을 때 예외처리
}
// 2. CustomTabsServiceConnection 미지원 브라우저 열기
// ex) 다음, 네이버 등
try {
KakaoCustomTabsClient.open(context, sharerUrl)
} catch (e: ActivityNotFoundException) {
// 디바이스에 설치된 인터넷 브라우저가 없을 때 예외처리
}
}
var disposables = CompositeDisposable()
// 공유할 웹페이지 URL
// * 주의: 개발자사이트 Web 플랫폼 설정에 공유할 URL의 도메인이 등록되어 있어야 합니다.
val url = "https://developers.kakao.com"
ShareClient.rx.shareScrap(context, url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ sharingResult ->
Log.d(TAG, "카카오톡 공유 성공 ${sharingResult.intent}")
startActivity(sharingResult.intent)
// 카카오톡 공유에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
Log.w(TAG, "Warning Msg: ${sharingResult.warningMsg}")
Log.w(TAG, "Argument Msg: ${sharingResult.argumentMsg}")
}, { error ->
Log.e(TAG, "카카오톡 공유 실패 ", error)
})
.addTo(disposables)
레퍼런스 | 앱 설정 |
---|---|
[SDK, RxSDK] shareScrap() [SDK] isKakaoTalkSharingAvailable() [SDK] makeScrapUrl() [SDK] SharingResult |
설치 초기화 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | 플랫폼 등록 메시지 템플릿 |
- | - |
스크랩한 웹 페이지 정보를 바탕으로 메시지를 구성하여 카카오톡으로 메시지를 공유하는 기능입니다. [도구] > [메시지 템플릿]에서 구성한 사용자 정의 템플릿을 사용하여 메시지를 구성합니다.
카카오톡을 통한 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoTalkSharingAvailable()
을 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다.
shareScrap()
을 호출하여 SharingResult
객체를 반환받습니다. 해당 객체의 intent
를 사용해 액티비티를 실행하여 카카오톡으로 메시지를 공유하도록 구현합니다.WebSharerClient
의 makeScrapUrl()
를 통해 웹 공유 URL을 생성한 후, 기본 브라우저나 웹뷰로 해당 URL을 열도록 구현합니다.// 공유할 웹페이지 URL
// * 주의: 개발자사이트 Web 플랫폼 설정에 공유할 URL의 도메인이 등록되어 있어야 합니다.
val url = "https://developers.kakao.com"
val templateId = templateIds["customMemo"] as Long
// 카카오톡 설치여부 확인
if (ShareClient.instance.isKakaoTalkSharingAvailable(context)) {
// 카카오톡으로 카카오톡 공유 가능
ShareClient.instance.shareScrap(context, url, templateId) { sharingResult, error ->
if (error != null) {
Log.e(TAG, "카카오톡 공유 실패", error)
}
else if (sharingResult != null) {
Log.d(TAG, "카카오톡 공유 성공 ${sharingResult.intent}")
startActivity(sharingResult.intent)
// 카카오톡 공유에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
Log.w(TAG, "Warning Msg: ${sharingResult.warningMsg}")
Log.w(TAG, "Argument Msg: ${sharingResult.argumentMsg}")
}
}
} else {
// 카카오톡 미설치: 웹 공유 사용 권장
// 웹 공유 예시 코드
val sharerUrl = WebSharerClient.instance.makeScrapUrl(url, templateId)
// CustomTabs으로 웹 브라우저 열기
// 1. CustomTabsServiceConnection 지원 브라우저 열기
// ex) Chrome, 삼성 인터넷, FireFox, 웨일 등
try {
KakaoCustomTabsClient.openWithDefault(context, sharerUrl)
} catch(e: UnsupportedOperationException) {
// CustomTabsServiceConnection 지원 브라우저가 없을 때 예외처리
}
// 2. CustomTabsServiceConnection 미지원 브라우저 열기
// ex) 다음, 네이버 등
try {
KakaoCustomTabsClient.open(context, sharerUrl)
} catch (e: ActivityNotFoundException) {
// 디바이스에 설치된 인터넷 브라우저가 없을 때 예외처리
}
}
var disposables = CompositeDisposable()
// 공유할 웹페이지 URL
// * 주의: 개발자사이트 Web 플랫폼 설정에 공유할 URL의 도메인이 등록되어 있어야 합니다.
val url = "https://developers.kakao.com"
val templateId = templateIds["customMemo"] as Long
ShareClient.rx.shareScrap(context, url, templateId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ sharingResult ->
Log.d(TAG, "카카오톡 공유 성공 ${sharingResult.intent}")
startActivity(sharingResult.intent)
// 카카오톡 공유에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
Log.w(TAG, "Warning Msg: ${sharingResult.warningMsg}")
Log.w(TAG, "Argument Msg: ${sharingResult.argumentMsg}")
}, { error ->
Log.e(TAG, "카카오톡 공유 실패 ", error)
})
.addTo(disposables)
전송 성공 알림은 사용자가 선택한 친구나 채팅방으로 카카오톡 공유 메시지가 성공적으로 전달된 경우, 카카오디벨로퍼스에 설정된 콜백 URL로 메시지가 성공적으로 전달되었음을 알려주는 기능입니다. 카카오톡 공유 메시지 전송 시에만 사용할 수 있고, 카카오톡 메시지 전송에는 지원되지 않습니다. 카카오톡 공유는 사용자가 카카오톡에서 메시지를 전송하므로 서비스에서 전송 성공 여부를 직접 확인할 수 없기 때문에 메시지 전송 성공 시 알림을 받는 서버 콜백(Callback) 기능을 제공합니다.
이 기능을 사용하려면 다음을 수행해야 합니다.
서비스 서버를 통해 카카오톡 공유 메시지 전송 성공 알림을 받을 때, 미리 설정해둔 사용자 정의(Custom) 파라미터를 통해 사용자가 공유한 콘텐츠가 무엇인지 등 추가 정보를 알 수 있습니다. 서비스 서버로 보내지는 알림은 자세한 메시지 전송 관련 정보를 포함하고 있지 않으므로 어떤 메시지의 전송 결과인지, 사용자가 무슨 정보를 공유했는지 등 서비스에서 필요한 추가 정보로 파라미터를 구성합니다. [내 애플리케이션]에서 카카오톡 공유 콜백을 설정하였더라도 사용자 정의 파라미터가 없을 경우에는 카카오톡 공유 전송 성공 알림이 전달되지 않습니다.
serverCallbackArgs
파라미터에 Map 자료형으로 키와 값의 쌍으로 구성한 정보를 담아 카카오톡 공유 API 요청 시 전달해야 하며, 키에는 시스템 예약어인 CHAT_TYPE
, HASH_CHAT_ID
, TEMPLATE_ID
를 사용할 수 없습니다. 해당 키는 카카오톡 공유 전송 성공 알림의 명세에 정의된 값으로 알림에 포함됩니다.
다음은 카카오톡 공유 전송 성공 알림 파라미터 설정 예제입니다.
// 사용자 정의 메시지 ID
// * 만들기 가이드: https://developers.kakao.com/docs/latest/ko/message/message-template
val templateId = templateIds["customMemo"] as Long
// 콜백 파라미터 설정
val serverCallbackArgs = mapOf(templateId to "templateId")
// 카카오톡 설치여부 확인
if (ShareClient.instance.isKakaoTalkSharingAvailable(context)) {
// 카카오톡으로 카카오톡 공유 가능
ShareClient.instance.shareCustom(context, templateId, serverCallbackArgs) { sharingResult, error ->
if (error != null) {
Log.e(TAG, "카카오톡 공유 실패", error)
}
else if (sharingResult != null) {
Log.d(TAG, "카카오톡 공유 성공 ${sharingResult.intent}")
startActivity(sharingResult.intent)
// 카카오톡 공유에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
Log.w(TAG, "Warning Msg: ${sharingResult.warningMsg}")
Log.w(TAG, "Argument Msg: ${sharingResult.argumentMsg}")
}
}
} else {
// 카카오톡 미설치: 웹 공유 사용 권장
// 웹 공유 예시 코드
val sharerUrl = WebSharerClient.instance.makeCustomUrl(templateId, serverCallbackArgs)
// CustomTabs으로 웹 브라우저 열기
// 1. CustomTabsServiceConnection 지원 브라우저 열기
// ex) Chrome, 삼성 인터넷, FireFox, 웨일 등
try {
KakaoCustomTabsClient.openWithDefault(context, sharerUrl)
} catch(e: UnsupportedOperationException) {
// CustomTabsServiceConnection 지원 브라우저가 없을 때 예외처리
}
// 2. CustomTabsServiceConnection 미지원 브라우저 열기
// ex) 다음, 네이버 등
try {
KakaoCustomTabsClient.open(context, sharerUrl)
} catch (e: ActivityNotFoundException) {
// 디바이스에 설치된 인터넷 브라우저가 없을 때 예외처리
}
}
var disposables = CompositeDisposable()
// 사용자 정의 메시지 ID
// * 만들기 가이드: https://developers.kakao.com/docs/latest/ko/message/message-template
val templateId = templateIds["customMemo"] as Long
// 콜백 파라미터 설정
val serverCallbackArgs = mapOf(templateId to "templateId")
ShareClient.rx.shareCustom(context, templateId, serverCallbackArgs)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ sharingResult ->
Log.d(TAG, "카카오톡 공유 성공 ${sharingResult.intent}")
startActivity(sharingResult.intent)
// 카카오톡 공유에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
Log.w(TAG, "Warning Msg: ${sharingResult.warningMsg}")
Log.w(TAG, "Argument Msg: ${sharingResult.argumentMsg}")
}, { error ->
Log.e(TAG, "카카오톡 공유 실패 ", error)
})
.addTo(disposables)
위와 같이 설정된 파라미터는 서비스 서버의 콜백 URL에 보내지는 알림에 요청 파라미터 형태로 전달됩니다. 카카오가 보내는 카카오톡 공유 성공 알림 요청 전문은 카카오톡 공유 전송 성공 알림에서 확인할 수 있습니다.
레퍼런스 | 앱 설정 |
---|---|
[SDK, RxSDK] uploadImage() [SDK, RxSDK] scrapImage() [SDK] ImageUploadResult |
설치 초기화 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | 플랫폼 등록 | - | - |
메시지에 넣을 이미지는 URL 형태로 메시지 템플릿 구성 시에 첨부하거나, 메시지 템플릿 도구에서 미리 업로드할 수 있습니다. 기기에 저장된 이미지 파일은 서버에 업로드하고 이미지 파일 URL 값을 구해야 메시지 전송에 사용할 수 있습니다.
이미지 파일 URL을 구하기 어려운 경우, 웹 페이지 속 이미지 파일을 카카오 서버로 업로드하거나 스크랩해두는 기능을 이용할 수 있습니다. 파일 용량 5MB 이하 이미지만 업로드할 수 있습니다. 카카오 서버에 업로드된 이미지는 최대 100일간 보관되고, 기간이 지나면 자동으로 삭제됩니다.
// 이미지 업로드
// 로컬 이미지 파일
// 이 예제에서는 프로젝트 리소스로 추가한 이미지 파일을 사용했습니다.
// 갤러리 등 서비스에 필요한 사진 파일을 준비합니다.
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.sample1)
val file = File(context.cacheDir, "sample1.png")
val stream = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
stream.close()
// 카카오 이미지 서버로 업로드
ShareClient.instance.uploadImage(file) { imageUploadResult, error ->
if (error != null) {
Log.e(TAG, "이미지 업로드 실패", error)
}
else if (imageUploadResult != null) {
Log.i(TAG, "이미지 업로드 성공 \n${imageUploadResult.infos.original}")
}
}
var disposables = CompositeDisposable()
// 이미지 업로드
// 로컬 이미지 파일
// 이 예제에서는 프로젝트 리소스로 추가한 이미지 파일을 사용했습니다.
// 갤러리 등 서비스에 필요한 사진 파일을 준비합니다.
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.sample1)
val file = File(context.cacheDir, "sample1.png")
val stream = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
stream.close()
// 카카오 이미지 서버로 업로드
ShareClient.rx.uploadImage(file)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ imageUploadResult ->
Log.i(TAG, "이미지 업로드 성공 \n${imageUploadResult.infos.original}")
}, { error ->
Log.e(TAG, "이미지 업로드 실패", error)
}).addTo(disposables)
// 이미지 스크랩
// 원본 원격 이미지 URL
val url = "https://t1.kakaocdn.net/kakaocorp/Service/KakaoTalk/pc/slide/talkpc_theme_01.jpg"
// 카카오 이미지 서버로 업로드
ShareClient.instance.scrapImage(url) { imageUploadResult, error ->
if (error != null) {
Log.e(TAG, "이미지 스크랩 실패", error)
}
else if (imageUploadResult != null) {
Log.i(TAG, "이미지 스크랩 성공 \n${imageUploadResult.infos.original}")
}
}
var disposables = CompositeDisposable()
// 이미지 스크랩
// 원본 원격 이미지 URL
val url = "https://t1.kakaocdn.net/kakaocorp/Service/KakaoTalk/pc/slide/talkpc_theme_01.jpg"
// 카카오 이미지 서버로 업로드
ShareClient.rx.scrapImage(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ imageUploadResult ->
Log.i(TAG, "이미지 스크랩 성공 \n${imageUploadResult.infos.original}")
}, { error ->
Log.e(TAG, "이미지 스크랩 실패", error)
}).addTo(disposables)