릴리스 노트
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
inplanetkit
- Added
PlanetKitPluginProviderVirtualBackground
inplugin-virtualbackground
- Removed
마이그레이션
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 callTHUMBNAIL
통화 시작 시 음성 전송 시작 지연 문제 수정
1대1 통화 및 그룹 통화 시작 시 로컬 사용자의 음성 전송을 시작하는 데 500ms 지연이 발생하는 문제를 해결했습니다.
Flutter 지원을 위한 SDK 변경 반영
SDK에 PlanetKit Flutter 지원용 코드를 추가했습니다.
PlanetKit 5.5.0
릴리스 일자: 2024-12-09
CameraVideoSource
를 PlanetKitCameraManager
와 PlanetKitPluginVirtualBackground
로 교체
PlanetKitCameraManager
인터페이스는 PlanetKit 내에서 카메라 작업을 관리하기 위한 메서드와 속성을 제공합니다. PlanetKit에서 제공하는 카메라 기능을 캡슐화하여 카메라 설정 구성과 상태 변경 이벤트 구독을 가능하게 합니다.- 카메라 장치 제어 정책 변경
- 5.5 버전부터는 다음 조건 중 하나 이상이 충족되면 카메라 장치가 켜지고, 모두 충족되지 않으면 꺼집니다.
PlanetKitCameraManager.startPreview()
를 통해 미리보기를 렌더링하는PlanetKitVideoView
가 하나 이상 존재PlanetKitCall
또는PlanetKitConference
가 연결 상태이고PlanetKitMyMediaStatus.myVideoStatus.videoState
가ENABLED
인 상태
- 5.5 버전부터는 다음 조건 중 하나 이상이 충족되면 카메라 장치가 켜지고, 모두 충족되지 않으면 꺼집니다.
PlanetKitPluginVirtualBackground
인터페이스는 가상 배경 기능을 위한 메서드를 제공합니다.
API
변경
-
PlanetKit
object 1-to-1 callGroup call이전 버전 PlanetKit 5.5.0 fun getDefaultCameraVideoSource(): CameraVideoSource
fun getCameraManager(): PlanetKitCameraManager
추가
PlanetKitCameraManager
interface 1-to-1 callGroup callval 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 callfun onStart()
fun onStop()
fun onError(@ErrorCode code: Int)
PlanetKitCameraManager.CameraTypeChangedListener
interface 1-to-1 callGroup callfun onChanged(isFrontCamera: Boolean)
PlanetKitPluginVirtualBackground
interface 1-to-1 callGroup callfun getCurrentVirtualBackgroundType(): VirtualBackgroundType
fun setVirtualBackgroundWithBlur(@IntRange(from = 1, to = 25) radius: Int)
fun setVirtualBackgroundWithImage(inputImage: Bitmap)
fun clearVirtualBackground()
PlanetKitCameraResolution
enum class 1-to-1 callGroup callTHUMBNAIL(1)
QVGA(2)
VGA(3)
HD(4)
PlanetKitPluginVirtualBackground.VirtualBackgroundType
enum class 1-to-1 callGroup callNONE(0)
BLUR(1)
IMAGE(2)
PlanetKitPluginProviderVirtualBackground
class 1-to-1 callGroup callfun 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): Boolean
fun 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): Boolean
fun enableVideo(initialMyVideoState: PlanetKitInitialMyVideoState = PlanetKitInitialMyVideoState.RESUME, userData: Any? = null, callback: PlanetKitRequestCallback? = null): Boolean
추가
PlanetKitInitialMyVideoState
enum class 1-to-1 callGroup callRESUME(0)
PAUSE(1)
PlanetKitMakeCallParam.Builder
class 1-to-1 callfun setInitialMyVideoState(value: PlanetKitInitialMyVideoState)
PlanetKitConferenceParam.Builder
class Group callfun 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 callval 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 callfun 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 callvar 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 callfun 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 callfun reject()
화면 잠금으로 인한 통화 종료 이유 추가
- 이 통화 종료 이유는 사용자의 요청이나 시스템 비활성화로 인해 화면이 잠겼을 때 데스크톱 시스템에서만 발생합니다(Android는 해당되지 않음). 상대방이 데스크톱을 사용 중이고 상대방의 화면이 잠기는 경우 통화가 종료되며 이벤트를 통해 이 이유를 전달받습니다.
API
추가
PlanetKitDisconnectReason
enum class 1-to-1 callGroup callDESKTOP_SCREEN_LOCKED(1314)