본문으로 건너뛰기
Version: 5.5

릴리스 노트

Android용 PlanetKit 5.5의 릴리스 노트입니다.

PlanetKit 5.5.2

릴리스 일자: 2025-02-26

특정 상황에서 발생하는 간헐적인 크래시 수정

  • 통화 중 비행기 모드를 활성화한 직후 특정 기기에서 간헐적으로 발생하던 크래시를 수정했습니다.

1대1 통화에서 벨소리 재생을 위한 오디오 모드 조정

  • 통화 수신 시 특정 기기에서 벨소리(ring tone) 볼륨이 너무 낮았던 문제를 수정했습니다.

PlanetKit 5.5.1

릴리스 일자: 2025-01-15

PlanetKitPluginProviderVirtualBackground를 플러그인으로 제공

버전 5.5.1부터 PlanetKitPluginProviderVirtualBackground 클래스를 별도의 플러그인으로 제공합니다. 이 변경은 가상 배경 기능을 사용하지 않는 사용자의 APK 크기를 최소화하기 위해 적용되었습니다.

API

변경
  • PlanetKitPluginProviderVirtualBackground class 1-to-1 callGroup call
    • Removed PlanetKitPluginProviderVirtualBackground in planetkit
    • Added PlanetKitPluginProviderVirtualBackground in plugin-virtualbackground

마이그레이션

PlanetKitPluginProviderVirtualBackground 사용 방법
  • build.gradle에 종속 항목을 추가하세요.

    implementation ('com.linecorp.planetkit:plugin-virtualbackground:1.0.0') {
    exclude group: 'com.linecorp.planetkit', module: 'planetkit'
    }
  • 플러그인을 적용하세요.

    val plugin = PlanetKitPluginProviderVirtualBackground.getPlugin()
    PlanetKit.getCameraManager().setVirtualBackgroundPlugin(plugin)

PlanetKitCameraResolution에서 썸네일 해상도 옵션 제거

PlanetKitCameraResolution enum 클래스에서 썸네일 해상도 옵션이 제거되었습니다. 이 해상도는 더 이상 지원되지 않으며 사용 가능한 해상도의 선택이 더 간단해졌습니다.

API

삭제
  • PlanetKitCameraResolution enum class 1-to-1 callGroup call
    • THUMBNAIL

통화 시작 시 음성 전송 시작 지연 문제 수정

1대1 통화 및 그룹 통화 시작 시 로컬 사용자의 음성 전송을 시작하는 데 500ms 지연이 발생하는 문제를 해결했습니다.

Flutter 지원을 위한 SDK 변경 반영

SDK에 PlanetKit Flutter 지원용 코드를 추가했습니다.

PlanetKit 5.5.0

릴리스 일자: 2024-12-09

CameraVideoSourcePlanetKitCameraManagerPlanetKitPluginVirtualBackground로 교체

  • PlanetKitCameraManager 인터페이스는 PlanetKit 내에서 카메라 작업을 관리하기 위한 메서드와 속성을 제공합니다. PlanetKit에서 제공하는 카메라 기능을 캡슐화하여 카메라 설정 구성과 상태 변경 이벤트 구독을 가능하게 합니다.
  • 카메라 장치 제어 정책 변경
    • 5.5 버전부터는 다음 조건 중 하나 이상이 충족되면 카메라 장치가 켜지고, 모두 충족되지 않으면 꺼집니다.
      • PlanetKitCameraManager.startPreview()를 통해 미리보기를 렌더링하는 PlanetKitVideoView가 하나 이상 존재
      • PlanetKitCall 또는 PlanetKitConference가 연결 상태이고 PlanetKitMyMediaStatus.myVideoStatus.videoStateENABLED인 상태
  • PlanetKitPluginVirtualBackground 인터페이스는 가상 배경 기능을 위한 메서드를 제공합니다.

API

변경
  • PlanetKit object 1-to-1 callGroup call

    이전 버전PlanetKit 5.5.0
    fun getDefaultCameraVideoSource(): CameraVideoSourcefun getCameraManager(): PlanetKitCameraManager
추가
  • PlanetKitCameraManager interface 1-to-1 callGroup call
    • val resolution: PlanetKitCameraResolution
    • var cameraType: PlanetKitCameraType
    • val isStarted: Boolean
    • val fps: Int
    • fun setStateListener(listener: StateListener?)
    • fun setManualResolution(resolution: PlanetKitCameraResolution)
    • fun setDefaultResolution()
    • fun setVirtualBackgroundPlugin(plugin: PlanetKitPluginVirtualBackground) :Boolean
    • fun addCameraTypeChangedListener(listener: CameraTypeChangedListener)
    • fun removeCameraTypeChangedListener(listener: CameraTypeChangedListener)
    • fun setVideoSourceInterceptor(interceptor: PlanetKitVideoInterceptor?)
    • fun startPreview(view: PlanetKitVideoView): Boolean
    • fun stopPreview(view: PlanetKitVideoView): Boolean
    • fun enableDumpFrame(enable: Boolean)
  • PlanetKitCameraManager.StateListener interface 1-to-1 callGroup call
    • fun onStart()
    • fun onStop()
    • fun onError(@ErrorCode code: Int)
  • PlanetKitCameraManager.CameraTypeChangedListener interface 1-to-1 callGroup call
    • fun onChanged(isFrontCamera: Boolean)
  • PlanetKitPluginVirtualBackground interface 1-to-1 callGroup call
    • fun getCurrentVirtualBackgroundType(): VirtualBackgroundType
    • fun setVirtualBackgroundWithBlur(@IntRange(from = 1, to = 25) radius: Int)
    • fun setVirtualBackgroundWithImage(inputImage: Bitmap)
    • fun clearVirtualBackground()
  • PlanetKitCameraResolution enum class 1-to-1 callGroup call
    • THUMBNAIL(1)
    • QVGA(2)
    • VGA(3)
    • HD(4)
  • PlanetKitPluginVirtualBackground.VirtualBackgroundType enum class 1-to-1 callGroup call
    • NONE(0)
    • BLUR(1)
    • IMAGE(2)
  • PlanetKitPluginProviderVirtualBackground class 1-to-1 callGroup call
    • fun getPlugin(): PlanetKitPluginVirtualBackground
삭제
  • CameraVideoSource class 1-to-1 callGroup call

마이그레이션

클래스 획득 방법
  • 이전 버전에서 카메라 속성을 다루는 방법은 다음과 같습니다.

    fun userFunction() {
    PlanetKit.getDefaultCameraVideoSource().cameraType = PlanetKitCameraType.FRONT
    //...
    }
  • 5.5 버전부터 카메라 속성을 다루는 방법은 다음과 같습니다.

    fun userFunction() {
    PlanetKit.getCameraManager().cameraType = PlanetKitCameraType.FRONT
    //...
    }
카메라 미리보기 사용 방법
  • 이전 버전에서 카메라 미리보기를 다루는 방법은 다음과 같습니다.

    val isCameraUsedByAnotherClass: Boolean

    fun startRenderPreviewOnMyVideoView(view: PlanetKitVideoView) {
    PlanetKit.getDefaultCameraVideoSource().addMyVideoView(view)
    if (!PlanetKit.getDefaultCameraVideoSource()) {
    PlanetKit.getDefaultCameraVideoSource().start()
    }
    }

    fun stopRenderPreviewOnMyVideoView(view: PlanetKitVideoView) {
    PlanetKit.getDefaultCameraVideoSource().removeMyVideoView(view)

    /* Check If Camera should be stopped */
    if (isCameraUsedByAnotherClass == false) {
    PlanetKit.getDefaultCameraVideoSource().stop()
    }
    }
  • 5.5 버전부터 카메라 미리보기를 다루는 방법은 다음과 같습니다.

    fun startRenderPreviewOnMyVideoView(view: PlanetKitVideoView) {
    PlanetKit.getCameraManager().startPreview(view)
    }

    fun stopRenderPreviewOnMyVideoView(view: PlanetKitVideoView) {
    PlanetKit.getCameraManager().stopPreview(view)
    }
가상 배경 설정 방법
  • 이전 버전에서 가상 배경을 다루는 방법은 다음과 같습니다.

    fun virtualBackground() {
    /* If you want to set VirtualBackground as Blur */
    PlanetKit.getDefaultCameraVideoSource().setVirtualBackgroundWithBlur(10)

    /* If you want to clear VirtualBackground */
    PlanetKit.getDefaultCameraVideoSource().clearVirtualBackground()
    }
  • 5.5 버전부터 가상 배경을 다루는 방법은 다음과 같습니다.

    fun virtualBackground() {
    val plugin = PlanetKitPluginProviderVirtualBackground.getPlugin()
    PlanetKit.getCameraManager().setVirtualBackgroundPlugin(plugin)

    /* If you want to set VirtualBackground as Blur */
    plugin.setVirtualBackgroundWithBlur(10)

    /* If you want to clear VirtualBackground */
    plugin.clearVirtualBackground()
    }

PlanetKitInitialMyVideoState 추가

  • PlanetKitInitialMyVideoState는 영상 통화가 활성화될 때 로컬 사용자의 비디오 상태를 결정하기 위해 추가된 열거형 클래스입니다.
  • PlanetKitInitialMyVideoState 유형의 속성 또는 파라미터의 기본값은 PlanetKitInitialMyVideoState.RESUME입니다.

API

변경
  • PlanetKitCall interface 1-to-1 call

    이전 버전PlanetKit 5.5.0
    fun acceptCall(listener: AcceptCallListener, useResponderPreparation: Boolean = false, recordOnCloud: Boolean = false)fun acceptCall(listener: AcceptCallListener, initialMyVideoState: PlanetKitInitialMyVideoState = PlanetKitInitialMyVideoState.RESUME, useResponderPreparation: Boolean = false, recordOnCloud: Boolean = false)
    fun acceptCall(listener: AcceptCallListener, callStartMessage: PlanetKitCallStartMessage, useResponderPreparation: Boolean = false, recordOnCloud: Boolean = false)fun acceptCall(listener: AcceptCallListener, callStartMessage: PlanetKitCallStartMessage, initialMyVideoState: PlanetKitInitialMyVideoState = PlanetKitInitialMyVideoState.RESUME, useResponderPreparation: Boolean = false, recordOnCloud: Boolean = false)
    fun enableVideo(userData: Any? = null, callback: PlanetKitRequestCallback? = null): Booleanfun enableVideo(initialMyVideoState: PlanetKitInitialMyVideoState = PlanetKitInitialMyVideoState.RESUME, userData: Any? = null, callback: PlanetKitRequestCallback? = null): Boolean
  • PlanetKitConference interface Group call

    이전 버전PlanetKit 5.5.0
    fun enableVideo(userData: Any? = null, callback: PlanetKitRequestCallback? = null): Booleanfun enableVideo(initialMyVideoState: PlanetKitInitialMyVideoState = PlanetKitInitialMyVideoState.RESUME, userData: Any? = null, callback: PlanetKitRequestCallback? = null): Boolean
추가
  • PlanetKitInitialMyVideoState enum class 1-to-1 callGroup call
    • RESUME(0)
    • PAUSE(1)
  • PlanetKitMakeCallParam.Builder class 1-to-1 call
    • fun setInitialMyVideoState(value: PlanetKitInitialMyVideoState)
  • PlanetKitConferenceParam.Builder class Group call
    • fun setInitialMyVideoState(value: PlanetKitInitialMyVideoState)

예제 코드

  • 1대1 통화 예제 코드

    fun makeCall() {
    /* Make a video call with my video state set to PAUSE */
    val param = PlanetKitMakeCallParam.Builder()
    .mediaType(PlanetKitMediaType.AUDIOVIDEO)
    .setInitialMyVideoState(PlanetKitInitialMyVideoState.PAUSE)
    /* Set other parameters If you needed */
    .build()

    val result = PlanetKit.makeCall(param, makeAcceptCallListener)
    }

    val verifyListener = object: VerifyListener {
    override fun onVerified(call: PlanetKitCall,
    peerStartMessage: PlanetKitCallStartMessage?,
    peerUseResponderPreparation: Boolean) {
    /* For a video call, accept the call with my video state set to PAUSE */
    call.acceptCall(acceptCallListener, PlanetKitInitialMyVideoState.PAUSE)
    }
    }

    fun enableVideo() {
    /* Change a call type as video call with my video state set to PAUSE */
    call.enableVideo(PlanetKitInitialMyVideoState.PAUSE)
    }
  • 그룹 통화 예제 코드

    fun joinConference() {
    /* Join a video group call with my video state set to PAUSE */
    val param = PlanetKitConferenceParam.Builder()
    .mediaType(PlanetKitMediaType.AUDIOVIDEO)
    .setInitialMyVideoState(PlanetKitInitialMyVideoState.PAUSE)
    /* Set other parameters If you needed */
    .build()

    val result = PlanetKit.joinConference(param, conferenceListener)
    }

    fun enableVideo() {
    /* Change to video group call with my video state set to PAUSE */
    conference.enableVideo(PlanetKitInitialMyVideoState.PAUSE)
    }

오디오 후킹 기능 추가

  • 오디오 후킹(audio hooking) 기능을 이용하여 Planet Cloud가 상대방에게 오디오를 전송하기 전에 오디오 데이터를 가져올 수 있습니다. 이 기능은 로컬 사용자의 음성을 변조하거나 오디오 데이터를 음성 인식에 활용하는 용도로 사용할 수 있습니다.
  • 자세한 내용은 오디오 후킹을 참고하세요.

API

추가
  • PlanetKitHookedAudio class 1-to-1 call
    • val sampleRate: Int
    • val channel: Int
    • val sampleType: PlanetKitAudioSampleType
    • val sampleCount: Int
    • val sequenceNumber: Long
    • fun setRawData(data: ByteArray)
    • fun getRawData(): ByteArray
  • PlanetKitCall class 1-to-1 call
    • fun enableHookMyAudio(listener: PlanetKitHookMyAudioListener, userData: Any? = null, callback: PlanetKitRequestCallback? = null): Boolean
    • fun disableHookMyAudio(userData: Any? = null, callback: PlanetKitRequestCallback? = null): Boolean
    • fun putHookedMyAudioBack(audioData: PlanetKitHookedAudio): Boolean

VideoSource를 커스텀 비디오 소스를 위한 PlanetKitCustomVideoSource로 교체

  • 기존 VideoSource는 사용자가 필요에 따라 커스텀 비디오 소스를 1대1 통화 또는 그룹 통화 세션에 커스터마이즈하고 연동하기 어려웠습니다. 이를 개선하기 위해 커스터마이제이션에 사용할 수 있는 PlanetKitCustomVideoSource를 도입했습니다.
  • 자세한 내용은 커스텀 비디오 소스를 참고하세요.

API

변경
  • PlanetKitCall interface 1-to-1 call

    이전 버전PlanetKit 5.5.0
    fun setVideoSource(videoSource: VideoSource?)fun setVideoSource(videoSource: PlanetKitCustomVideoSource), fun clearVideoSource()
  • PlanetKitConference interface Group call

    이전 버전PlanetKit 5.5.0
    fun setVideoSource(videoSource: VideoSource?)fun setVideoSource(videoSource: PlanetKitCustomVideoSource), fun clearVideoSource()
추가
  • PlanetKitCustomVideoSource abstract class 1-to-1 callGroup call
    • var maxFps: Int? = null
    • fun addMyVideoView(view: PlanetKitVideoView)
    • fun removeMyVideoView(view: PlanetKitVideoView)
    • protected fun postFrameData(frameData: FrameData): Boolean
    • protected fun postingFrameDataAvailable(): Boolean
    • abstract fun onMaxFpsLimitUpdated(isLimitEnabled: Boolean, maxFps: Int)
  • PlanetKitCustomVideoSource.FrameData abstract class 1-to-1 callGroup call

ScreenCapturerVideoSource 개선

  • ScreenCapturerVideoSource는 이전에 여러 불필요한 메서드를 노출하여 사용자가 혼란을 느낄 수 있었기에 필수 메서드만 노출하도록 개선했습니다.
  • ScreenCapturerVideoSource가 더 이상 VideoSource를 상속하지 않으므로 이전에 VideoSource에서 제공하던 메서드는 제거되었습니다.

API

삭제
  • ScreenCapturerVideoSource class 1-to-1 callGroup call
    • fun stop(reason: VideoSource.VideoSourceStopReason): Boolean
    • fun useDeviceRotation(): Boolean

CallListener에서 오자 수정

API

변경
  • CallListener class 1-to-1 call

    이전 버전PlanetKit 5.5.0
    fun onPeerOnHold(call: PlanetKitCall, reason: String?)fun onPeerHold(call: PlanetKitCall, reason: String?)

의미 없는 API PlanetKitCall.reject() 제거

  • 수신 전화를 거부할 때에도 reject() 대신 endCall() 함수를 사용해야 하므로 reject()를 제거했습니다.

API

삭제
  • PlanetKitCall interface 1-to-1 call
    • fun reject()

화면 잠금으로 인한 통화 종료 이유 추가

  • 이 통화 종료 이유는 사용자의 요청이나 시스템 비활성화로 인해 화면이 잠겼을 때 데스크톱 시스템에서만 발생합니다(Android는 해당되지 않음). 상대방이 데스크톱을 사용 중이고 상대방의 화면이 잠기는 경우 통화가 종료되며 이벤트를 통해 이 이유를 전달받습니다.

API

추가
  • PlanetKitDisconnectReason enum class 1-to-1 callGroup call
    • DESKTOP_SCREEN_LOCKED(1314)