Quick Start

Omnitalk SDK๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌ์šฉ๋ฒ•์€ Android API Reference๋ฅผ ์ฐธ์กฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  API๋Š” suspend fun ์œผ๋กœ ์ž‘์„ฑ ๋˜์—ˆ์œผ๋ฉฐ, ์š”์ฒญ์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ throw ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ์™€ ๋ฐ๋ชจ์—์„œ๋Š” CoroutineScope๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ๋ชจ ์•ฑ ์†Œ์Šค์ฝ”๋“œ: https://github.com/omnistory-labs/omnitalk.android.sdk/tree/demo

1:1 ์˜์ƒ ํ†ตํ™”

1. ์˜ด๋‹ˆํ†ก ๊ฐ์ฒด ์ƒ์„ฑ

์ฝ˜์†”์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ Service ID์™€ Service KEY๋กœ Omnitalk ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

import io.omnitalk.sdk.Omnitalk

Omnitalk.sdkInit(
    serviceId = "YOUR_SERVICE_ID",
    serviceKey = "YOUR_SERVICE_KEY",
    applicationContext = applicationContext
)

val sdk = Omnitalk.getInstance()

2. ์„ธ์…˜ ์ƒ์„ฑ

์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ userId๋กœ ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. userId๋Š” Optional์ด๋ฉฐ, null์ผ ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ ์ž„์˜์˜ userId๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

val createSessionResult = sdk.createSession(userId = "alice")

3. ๋ฐœ์‹ 

1:1 ์˜์ƒ ํ†ตํ™”๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐœ์‹  ๊ธฐ๋Šฅ์€ offerCall() API๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ๊ณผ ์ƒ๋Œ€๋ฐฉ์˜ ์˜์ƒ์„ ํ™”๋ฉด์— ์žฌ์ƒํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜์ƒ์„ ์ถœ๋ ฅํ•  SurfaceViewRenderer ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ WebRTC ๋ชจ๋“ˆ์„ import ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ( Omnitalk SDK ์„ค์น˜์— ํฌํ•จ๋œ ํŒจํ‚ค์ง€ )

offerCall ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ•˜๋ฉด caller์—๊ฒŒ๋Š” RINGBACK_EVENT๊ฐ€, callee์—๊ฒŒ๋Š” RINGING_EVENT๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

import org.webrtc.SurfaceViewRenderer
import io.omnitalk.sdk.types.PublicTypes

val callee = "[email protected]"
val localView = findViewById<SurfaceViewRenderer>(R.id.localView)
val remoteView = findViewById<SurfaceViewRenderer>(R.id.remoteView)

sdk.offerCall(
    callType = PublicTypes.CALL_TYPE.videocall,
    callee = callee,
    record = true,
    localView = localView,
    remoteView = remoteView
)

4. ์ˆ˜์‹ 

callee์ธก์—์„œ๋Š” RINGING_EVENT๋ฅผ ๋ฐ›๊ณ  ํ†ตํ™”๋ฅผ ์ˆ˜๋ฝํ•˜๊ฑฐ๋‚˜ ๊ฑฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ตํ™” ์ˆ˜๋ฝ์€ answerCall() API๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ๊ณผ ์ƒ๋Œ€๋ฐฉ์˜ ์˜์ƒ์„ ์žฌ์ƒํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜์ƒ์„ ์ถœ๋ ฅํ•  SurfaceViewRenderer ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ WebRTC ๋ชจ๋“ˆ์„ import ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ( Omnitalk SDK ์„ค์น˜์— ํฌํ•จ๋œ ํŒจํ‚ค์ง€ )

answerCall์ด ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉด caller, callee ์–‘์ธก์€ CONNECTED_EVENT๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹  ๊ฑฐ์ ˆ์€ leave() API๋ฅผ ์ด์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

override fun onEvent(eventName: OmniEvent, message: Any) {
    when(eventName) {
        OmniEvent.RINGING_EVENT -> {
            sdk.answerCall(localView = localView, remoteView = remoteView)
        }
        OmniEvent.CONNECTED_EVENT -> {
            ...
        }            
    }
}

์˜์ƒ ํšŒ์˜

1. ์˜ด๋‹ˆํ†ก ๊ฐ์ฒด ์ƒ์„ฑ

์ฝ˜์†”์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ Service ID์™€ Service KEY๋กœ Omnitalk ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

import io.omnitalk.sdk.Omnitalk

Omnitalk.sdkInit(
    serviceId = "YOUR_SERVICE_ID",
    serviceKey = "YOUR_SERVICE_KEY",
    applicationContext = applicationContext
)

val sdk = Omnitalk.getInstance()

2. ์„ธ์…˜ ์ƒ์„ฑ

์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ userId๋กœ ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. userId๋Š” Optional์ด๋ฉฐ, null์ผ ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ ์ž„์˜์˜ userId๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

val createSessionResult = sdk.createSession(userId = "alice")

3. ๋ฃธ ์ƒ์„ฑ

์˜์ƒ ํšŒ์˜๋ฅผ ์œ„ํ•œ ๋ฃธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. roomType์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Optional ์ž…๋‹ˆ๋‹ค.

import io.omnitalk.sdk.types.PublicTypes

val createRoomResult = sdk.createRoom(
    roomType = PublicTypes.VIDEOROOM_TYPE.videoroom,
    subject = "subject",
    secret = "secret",
    startDate = null,
    endDate = null
)

4. ๋ฃธ ์ฐธ์—ฌ

๋ฃธ์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜๋ฉด ์Œ์„ฑ๊ณผ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. roomId์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Optional ์ž…๋‹ˆ๋‹ค.

val roomId = createRoomResult.roomId
sdk.joinRoom(roomId = roomId, secret = "secret", userName = "userName")

5. ๋ฐฉ์†ก ์‹œ์ž‘

๋กœ์ปฌ์˜ ์˜์ƒ์„ ์†ก์ถœํ•ฉ๋‹ˆ๋‹ค. publish API๋Š” roomType VIDEO_ROOM ๋˜๋Š” WEBINAR ์—์„œ๋งŒ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์˜์ƒ์„ ์žฌ์ƒํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜์ƒ์„ ์ถœ๋ ฅํ•  SurfaceViewRenderer ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ WebRTC ๋ชจ๋“ˆ์„ import ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ( Omnitalk SDK ์„ค์น˜์— ํฌํ•จ๋œ ํŒจํ‚ค์ง€ )

import org.webrtc.SurfaceViewRenderer

val localView = findViewById<SurfaceViewRenderer>(R.id.localView)
sdk.publish(localView = localView)

6. ๋ฐฉ์†ก ๊ตฌ๋…

๊ตฌ๋…ํ•˜๊ณ ์ž๋Š” ๋ฐฉ์†ก์˜ session์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ๋ฐฉ์†ก์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋Œ€๋ฐฉ ์˜์ƒ์„ ์žฌ์ƒํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜์ƒ์„ ์ถœ๋ ฅํ•  SurfaceViewRenderer ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ WebRTC ๋ชจ๋“ˆ์„ import ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ( Omnitalk SDK ์„ค์น˜์— ํฌํ•จ๋œ ํŒจํ‚ค์ง€ )

import org.webrtc.SurfaceViewRenderer

val remoteView = findViewById<SurfaceViewRenderer>(R.id.remoteView)
sdk.subscribe(publisherSession = publisherSession, remoteView = remoteView)

Last updated