SIP Call

sipcall์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ผ๋ฐ˜ ์ „ํ™” ๊ฐ„ ์ „ํ™”๋ฅผ ์—ฐ๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ†ตํ™” ๋ฐœ์‹ ์ž๋Š” caller, ์ฐฉ์‹ ์ž๋ฅผ callee๋ผ๋Š” ํ†ต์‹  ์šฉ์–ด๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. Omnitalk SDK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ offerCall(), answerCall()์„ ํ˜ธ์ถœํ•˜๊ณ  ํ•ด๋‹น ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€์— ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ผ๋ฐ˜ ์ „ํ™” ๊ฐ„ ์ „ํ™” ์—ฐ๊ฒฐ์„ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Step 1. ์„ธ์…˜ ์ƒ์„ฑ

Omnitalk SDK์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„ ์ ์œผ๋กœ createSession()์„ ํ˜ธ์ถœํ•˜์—ฌ ์„ธ์…˜์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. createSession()์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ userId๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ ํ•œ id์ด๋ฉฐ audiocall ๋ฐœ์‹ ์„ ์œ„ํ•œ offerCall() ํ˜ธ์ถœ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. userId๋Š” Optional ์ด๋ฉฐ, null๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ Omnitalk ์„œ๋ฒ„์—์„œ ์ž„์˜์˜ id๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

sdk.createSession(userId = "USER_ID")

Step 2. ๋ฐœ์‹ 

offerCall() API๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๋ฐ˜ ์ „ํ™”๋กœ ์ „ํ™” ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ callType, callee์˜ ์ „ํ™”๋ฒˆํ˜ธ, ๋…น์Œ ์—ฌ๋ถ€๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • callType: ์ „ํ™” ํƒ€์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. CALL_TYPE์€ Omnitalk SDK์—์„œ enum type์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์ „ํ™”์™€ ์Œ์„ฑ ํ†ตํ™”๋ฅผ ์œ„ํ•ด์„œ๋Š” sipcall ์„ ์ „๋‹ฌํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • callee: ์ „ํ™”๋ฅผ ๊ฑธ๊ณ ์ž ํ•˜๋Š” ์ˆ˜์‹ ์ž์˜ ์ „ํ™” ๋ฒˆํ˜ธ๋ฅผ ์ „๋‹ฌํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • record: Optional ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ, ๋…น์Œ ์—ฌ๋ถ€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. defalut = false

  • localView, remoteView: ์˜์ƒ ํ†ตํ™”์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค. SIP ์ „ํ™” ๊ธฐ๋Šฅ์—์„œ๋Š” null๋กœ ์ ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

import io.omnitalk.sdk.types.PublicTypes

val callee = "[email protected]"

sdk.offerCall(
    callType = PublicTypes.CALL_TYPE.sipcall,
    callee = "01012345678",
    record = true,
    localView = null,
    remoteView = null
)

offerCall ํ˜ธ์ถœ ์„ฑ๊ณต์‹œ caller๋Š” RINGBACK_EVEVT, callee๋Š” ์ „ํ™” ์š”์ฒญ์ด ์šธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, callee์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ฐœ์‹ ์ž ์ •๋ณด๋Š” ์˜ด๋‹ˆํ†ก์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ๋ฒˆํ˜ธ ์ž…๋‹ˆ๋‹ค.

Step 3. ์ˆ˜์‹ 

์ผ๋ฐ˜ ์ „ํ™”์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ „ํ™” ์š”์ฒญ์„ ํ•  ๊ฒฝ์šฐ์—๋Š” makeSipNumber() API๋ฅผ ํ†ตํ•ด์„œ 6์ž๋ฆฌ์˜ callNumber๋ฅผ ๋ฐœ๊ธ‰ ๋ฐ›์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์ „ํ™” -> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐœ์‹  Call Flow๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ makeSipNumber() API ํ†ตํ•ด์„œ callNumber ๋ฐœ๊ธ‰ ( 4๋ฒˆ ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ )

  2. ์ผ๋ฐ˜ ์ „ํ™”๋กœ ์˜ด๋‹ˆํ†ก์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ๋ฒˆํ˜ธ๋กœ ์ „ํ™”

  3. ์ „ํ™”๋ฅผ ์š”์ฒญํ•˜๊ณ ์ž ํ•˜๋Š” 6์ž๋ฆฌ callNumber(PIN Number) ์ž…๋ ฅ

  4. ํ•ด๋‹น callNumber๋กœ ๋ฐœ์‹  ์š”์ฒญ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ „ํ™” ์š”์ฒญ์ด ์™”์„๋•Œ, ์ˆ˜์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Android SDK ์—์„œ๋Š” ์•„๋ž˜ ๋‘ ์ƒํ™ฉ์— ๋Œ€ํ•ด์„œ answerCall() API๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜์—ฌ ๊ฐ๊ฐ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

callee๊ฐ€ callNumber๋ฅผ ์ƒ์„ฑํ•œ ์ƒํƒœ์—์„œ ์ „ํ™” ์š”์ฒญ์ด ์™”์„๋•Œ

callee(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)๊ฐ€ callNumber๋ฅผ ์ƒ์„ฑํ•œ ์ƒํƒœ์—์„œ caller(์ผ๋ฐ˜ ์ „ํ™”)๊ฐ€ ์ „ํ™”๋ฅผ ๊ฑธ์–ดRINGING_EVENT๋ฅผ ๋ฐ›์€ ๊ฒฝ์šฐ, callee๋Š” ๋ณ„๋„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  answerCall()์„ ํ˜ธ์ถœํ•˜์—ฌ ์ „ํ™”๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹  ๊ฑฐ์ ˆ์„ ํ•˜๊ณ ์‹ถ์€ ๊ฒฝ์šฐ leave()๋ฅผ ํ˜ธ์ถœํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • localView, remoteView: ์˜์ƒ ํ†ตํ™”์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค. 1:1 ์ „ํ™” ๊ธฐ๋Šฅ์—์„œ๋Š” null๋กœ ์ ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

sdk.answerCall(localView = null, remoteView = null)

callee๊ฐ€ callNumber๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „ ์ „ํ™” ์š”์ฒญ์ด ์™”์„๋•Œ

callee(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)๊ฐ€ callNumber๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— caller(์ผ๋ฐ˜ ์ „ํ™”)๊ฐ€ ์ „ํ™”๋ฅผ ๊ฑธ์–ดRINGING_EVENT๋ฅผ ๋ฐ›์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ, callee๋Š” answerCall()์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— callType๊ณผ caller์˜ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ „ํ™”๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ์˜ด๋‹ˆํ†ก ์„œ๋ฒ„์—์„œ ๋ณ„๋„์˜ ์ด๋ฒคํŠธ๋กœ callType๊ณผ caller์˜ ์ •๋ณด๋ฅผ ์ œ๊ณต๋“œ๋ฆด ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

  • callType: ์ „ํ™” ํƒ€์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. caller๊ฐ€ offerCall()์„ ํ˜ธ์ถœํ•  ๋•Œ์™€ ๋™์ผํ•˜๊ฒŒ sipcall ์„ ์ „๋‹ฌํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • caller: caller(์ „ํ™” ๋ฐœ์‹ ์ž)์˜ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ „๋‹ฌํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • localView, remoteView: ์˜์ƒ ํ†ตํ™”์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค. 1:1 ์ „ํ™” ๊ธฐ๋Šฅ์—์„œ๋Š” null๋กœ ์ ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

import io.omnitalk.sdk.types.PublicTypes

sdk.offerCall(
    callType = PublicTypes.CALL_TYPE.sipcall,
    callee = "01012345678",
    record = true,
    localView = null,
    remoteView = null
)

Step 4. ์—ฐ๊ฒฐ ์„ฑ๊ณต

์Œ์„ฑ ํ†ตํ™” ์—ฐ๊ฒฐ์ด ์„ฑ๊ณตํ•˜๋ฉด callee(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)๋Š” CONNECTED_EVENT ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

Step 5. ์ „ํ™” ๋Š๊ธฐ

leave() API๋ฅผ ํ†ตํ•ด์„œ ์ „ํ™” ์—ฐ๊ฒฐ์„ ๋Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sdk.leave(session = null) // default: ๋ณธ์ธ ์—ฐ๊ฒฐ ๋Š๊ธฐ

์˜ค๋””์˜ค ์žฅ์น˜ ์ œ์–ด

mute/unmute

์ „ํ™” ํ†ตํ™”์ค‘์— ์Œ์†Œ๊ฑฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•๊ณผ ์ž์„ธํ•œ ๋‚ด์šฉ์€ API Reference์˜ mute/unmute ๋ถ€๋ถ„์„ ์ฐธ์กฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. mute/unmute API์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ TRACK_TYPE ์€ Omnitalk SDK์—์„œ enum type์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import io.omnitalk.sdk.types.PublicTypes

sdk.setMute(track = PublicTypes.TRACK_TYPE.audio)

์ž…๋ ฅ ์žฅ์น˜ ๋ณ€๊ฒฝ

์ „ํ™” ํ†ตํ™”์ค‘์— ์ž…๋ ฅ(๋งˆ์ดํฌ) ์žฅ์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก setAudioDevice() API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์ธ MIC_TYPE์€ Omnitalk SDK์—์„œ enum type์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ท€์— ๋Œ€์–ด ์ „ํ™”๋ฐ›๋Š” defaultInEar ํƒ€์ž…๊ณผ ์Šคํ”ผ์ปคํฐ ๋ชจ๋“œ์ธ speaker ๋‘ ๊ฐ€์ง€๋กœ ์ œ๊ณต ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import io.omnitalk.sdk.types.PublicTypes

sdk.setAudioDevice(type=PublicTypes.MIC_TYPE.speakr)

Last updated