릴리스 노트
Android용 PlanetKit 6.0의 릴리스 노트입니다.
PlanetKit 6.0.3
릴리스 일자: 2025-07-04
16 KB 페이지 크기 지원
- Google의 요구사항에 따라 16 KB 메모리 페이지 정렬을 준수하기 위해 패치를 적용했습니다.
- PlanetKit에서 생성하거나 참조하는 아래 네이티브 라이브러리가 이제 16 KB 정렬을 준수합니다.
arm64-v8a/libplanet-kit.soarm64-v8a/libplanetkit-renderengine.soarm64-v8a/libimage_processing_util_jni.soarm64-v8a/libsurface_util_jni.so
Kotlin 버전 업데이트
- Kotlin 버전을
1.6.21에서1.8.22로 업그레이드했습니다.- 이 업데이트는 PlanetKit에서 사용되는 16 KB 페이지 정렬과 호환되는 모듈을 지원하기 위해 필요했습니다.
- 참고: 프로젝트에서
1.8.22보다 낮은 Kotlin 버전을 사용하는 경우, 호환성 문제를 피하기 위해1.8.22이상으로 업그레이드하세요.
특정 시나리오에서 발생하는 간헐적인 크래시 수정
- curl 버전
8.11.1의 내부 문제로 인해 특정 조건에서 간헐적인 크래시가 발생할 수 있었습니다. - 이 문제는 curl
8.11.1의 공식 패치를 적용하여 해결되었습니다.
PlanetKitPluginProviderVirtualBackground 모듈 업데이트
- 플러그인 모듈
PlanetKitPluginProviderVirtualBackground가 16 KB 페이지 정렬을 지원하는 버전1.0.1로 업데이트되었습니다.
마이그레이션
-
build.gradle에서 버전을 업데이트하세요.implementation ('com.linecorp.planetkit:plugin-virtualbackground:1.0.1') {
exclude group: 'com.linecorp.planetkit', module: 'planetkit'
}
PlanetKit 6.0
릴리스 일자: 2025-05-16
Android OS 버전을 Android 15(API 레벨 35)로 업그레이드
- PlanetKit은 이제 Android 15(API 레벨 35)를 대상으로 합니다.
- 참고: 애플리케이션은 여전히 API 레벨 35보다 낮은 대상 SDK 버전(
targetSdkVersion)을 사용할 수 있습니다.
API
- 변경 없음
통화 중 마이크 사용 여부에 따라 마이크 장치 제어
- 통화 중 마이크를 사용하지 않을 때(예: 음 소거 또는 통화 일시 중지), PlanetKit이 마이크 장치를 끄도록 변경되었습니다.
- PlanetKit에서는 마이크 제어를 위한 두 가지 방법을 제공합니다.
setMicMuteControlMethod를 통해 원하는 방법을 선택할 수 있습니다. 기본값은AUDIO_MANAGER입니다. - 자세한 정보는 API 문서를 참조하세요.
API
추가
PlanetKitMicMuteControlMethodenum class 1-to-1 callGroup callAUDIO_MANAGERAUDIO_DRIVER
PlanetKitVerifyCallParam.Builderclass 1-to-1 callfun setMicMuteControlMethod(value: PlanetKitMicMuteControlMethod)
PlanetKitMakeCallParam.Builderclass 1-to-1 callfun setMicMuteControlMethod(value: PlanetKitMicMuteControlMethod)
PlanetKitConferenceParam.Builderclass Group callfun setMicMuteControlMethod(value: PlanetKitMicMuteControlMethod)
커스텀 오디오 소스를 위한 AudioSource를 PlanetKitCustomAudioSource로 교체
- 이전 버전에서 커스텀 오디오 소스를 구현하려면
AudioSource를 확장해야 했는데,AudioSource는 PlanetKit 내부에서도 사용되었고 인터페이스가 복잡했습니다. - PlanetKit 6.0 버전부터 새로운
PlanetKitCustomAudioSource를 도입해서 커스텀 오디오 소스 개발을 간소화했습니다. 기존의AudioSource는 deprecated 되었습니다.
API
변경
-
PlanetKitCallinterface 1-to-1 call이전 버전 PlanetKit 6.0.0 fun setAudioSource(audioSource: AudioSource?)fun setCustomAudioSource(audioSource: PlanetKitCustomAudioSource) -
PlanetKitConferenceinterface Group call이전 버전 PlanetKit 6.0.0 fun setAudioSource(audioSource: AudioSource?)fun setCustomAudioSource(audioSource: PlanetKitCustomAudioSource)
추가
PlanetKitCustomAudioSourceclass 1-to-1 callPlanetKitCallinterface 1-to-1 callfun clearCustomAudioSource()
PlanetKitConferenceinterface Group callfun clearCustomAudioSource()
삭제
AudioSourceclass 1-to-1 call
예제 코드
-
1단계: 커스텀 오디오 소스 클래스를 구현합니다.
object CustomAudioSource : PlanetKitCustomAudioSource() {
private const val FRAME_DURATION_MS: Long = 20
private var thread: Thread? = null
fun start() {
thread = Thread {
while(true) {
val frame: AudioFrame = makeYourAudioFrame()
postFrameData(frame)
Thread.sleep(FRAME_DURATION_MS)
}
}
thread?.start()
}
fun stop() {
thread?.interrupt()
thread?.join()
}
} -
2단계: 커스텀 오디오 소스를 설정하고 시작합니다.
fun setCustomAudioSource(call: PlanetKitCall, audioSource: CustomAudioSource) {
call.setCustomAudioSource(audioSource)
audioSource.start()
} -
3단계: 커스텀 오디오 소스를 해제하고 중지합니다.
fun clearCustomAudioSource(call: PlanetKitCall, audioSource: CustomAudioSource) {
call.clearCustomAudioSource()
audioSource.stop()
}
PlanetKitCCParam을 사용하여 통화 수신 중 클라우드 통화 녹음 활성화 여부 확인
- 통화 수신 시 클라우드 통화 녹음이 활성화되었는지를 나타내는 필드를
PlanetKitCCParam에 추가했습니다.
API
추가
PlanetKitCCParamclass 1-to-1 callval isRecordOnCloudEnabled: Boolean
영상 통화 활성화 시 응답 유형 설정 API 제거
- 이제 1대1 음성 통화에서 상대방이 영상 통화를 활성화할 때 로컬 사용자의 비디오는 항상 일시 정지 상태로 설정됩니다.
- 이전 버전에서는 상대방이 음성 통화를 영상 통화로 전환할 때 로컬 사용자의 비디오 전송을 자동으로 시작할지
responseOnEnableVideo()를 사용하여 결정할 수 있었습니다. - 그러나 이 API는 개인정보 보호 문제와 잠재적 오용 가능성 때문에 버전 6.0에서 제거하고,
onVideoEnabledByPeer는onVideoEnabledByPeerAndMyVideoPaused으로 변경했습니다. - 따라서 6.0 버전부터는 상대방이 영상 통화를 활성화할 때 로컬 사용자의 비디오는 일시 정지된 상태로 유지됩니다.
- 이전 버전에서는 상대방이 음성 통화를 영상 통화로 전환할 때 로컬 사용자의 비디오 전송을 자동으로 시작할지
- 이 변경에 따라 이전에
PlanetKitResponseOnEnableVideo.SEND를 이용하던 코드는onVideoEnabledByPeerAndMyVideoPaused이벤트를 수신한 후 수동으로 비디오를 다시 재생하는 방식으로 업데이트해야 합니다.- 자세한 내용은 아래 예제 코드를 참고하세요.
예제 코드
- 6.0 버전에서 이전에
PlanetKitResponseOnEnableVideo.SEND를 사용해 구현한 동작을 재현하려면 다음과 같이 구현하세요.
private val callListener = object: MakeCallListener, AcceptCallListener {
override fun onVideoEnabledByPeerAndMyVideoPaused(call: PlanetKitCall) {
...
call.resumeMyVideo()
}
}
API
변경
-
CallListenerinterface 1-to-1 call이전 버전 PlanetKit 6.0.0 fun onVideoEnabledByPeer(call: PlanetKitCall)fun onVideoEnabledByPeerAndMyVideoPaused(call: PlanetKitCall)
삭제
PlanetKitResponseOnEnableVideoenum class 1-to-1 callPlanetKitMakeCallParam.Builderclass 1-to-1 callfun responseOnEnableVideo(responseOnEnableVideo: PlanetKitResponseOnEnableVideo)
PlanetKitVerifyCallParam.Builderclass 1-to-1 callfun responseOnEnableVideo(responseOnEnableVideo: PlanetKitResponseOnEnableVideo)
피어 볼륨 설정 API 개선
- 이전의 서브그룹 기반 볼륨 제어를 개별 피어에 대한 통합 볼륨 설정 API로 대체했습니다.
- 6.0 이전 버전에서는 서브그룹별로 볼륨이 제어되었습니다. 6.0 버전부터는 서브그룹과 상관없이 볼륨을 설정할 수 있습니다.
- 이 사양 변경에 따라 관련 API를 수정했습니다.
API
변경
-
PlanetKitConferencePeerclass Group call이전 버전 PlanetKit 6.0.0 fun getAudioVolumeLevelSetting(subgroupName: String?): AudioVolumeResultfun getAudioVolumeLevelSetting(): AudioVolumeResult
추가
PlanetKitPeerControlclass Group callfun setVolumeLevelSetting(@IntRange(from = 0, to = 110) volumeLevel: Int, userData: Any? = null, callback: PlanetKitRequestCallback? = null): Boolean
PlanetKitPeerViewclass Group callfun setVolumeLevelSetting(@IntRange(from = 0, to = 110) volumeLevel: Int, userData: Any? = null, callback: PlanetKitRequestCallback? = null): Boolean
삭제
PlanetKitSubgroupinterface Group callfun getPeerVolumeLevelSetting(user: PlanetKitUser): Int
PlanetKitSubgroupManagerinterface Group callfun setPeerVolumeLevelSetting(peer: PlanetKitUser, subgroupName: String?, @IntRange(from = 0, to = 110) talkerVolume: Int, userData: Any?, callback: PlanetKitRequestCallback?): Booleanfun setPeerVolumeLevelSetting(peer: PlanetKitUser, @IntRange(from = 0, to = 110) talkerVolume: Int, userData: Any?, callback: PlanetKitRequestCallback?): Boolean
비디오 성능 설정 API 개선
- 비디오 성능(capability) 설정 API에서 섬네일 해상도는 더 이상 지원하지 않습니다.
- 비디오 하드웨어 코덱 설정은 이제 각 1대1 통화 또는 그룹 통화별로 설정하는 대신
PlanetKit을 통해 설정됩니다.
API
변경
-
PlanetKitVideoCapabilityclass 1-to-1 callGroup call이전 버전 PlanetKit 6.0.0 val maxResolution: PlanetKitVideoResolutionval maxResolution: PlanetKitVideoResolutionCapability
추가
PlanetKitVideoResolutionCapabilityenum class 1-to-1 callGroup callQVGA(1)VGA(2)HD(3)
PlanetKitPreferredHardwareCodecdata class 1-to-1 callGroup callval callVideoSend: Booleanval callVideoReceive: Booleanval conferenceVideoSend: Booleanval conferenceVideoReceive: Boolean
PlanetKitobject 1-to-1 callGroup callfun getCallDeviceDefaultVideoSendCapability(): PlanetKitVideoCapability?fun getCallDeviceDefaultVideoReceiveCapability(): PlanetKitVideoCapability?fun getConferenceDeviceDefaultVideoSendCapability(): PlanetKitVideoCapability?fun getConferenceDeviceDefaultVideoReceiveCapability(): PlanetKitVideoCapability?fun setPreferredHardwareCodec(preferredHardwareCodec: PlanetKitPreferredHardwareCodec)fun getPreferredHardwareCodec(): PlanetKitPreferredHardwareCodec
삭제
PlanetKitVideoCapabilityclass 1-to-1 callGroup callpreferredHwCodec: Boolean
setVideoSource와 clearVideoSource를 setCustomVideoSource와 clearCustomVideoSource로 이름 변경
- API 이름을 더 명확하게 변경했습니다.
API
변경
-
PlanetKitCallinterface 1-to-1 call이전 버전 PlanetKit 6.0.0 fun setVideoSource(videoSource: PlanetKitCustomVideoSource)fun setCustomVideoSource(videoSource: PlanetKitCustomVideoSource)fun clearVideoSource()fun clearCustomVideoSource() -
PlanetKitConferenceinterface Group call이전 버전 PlanetKit 6.0.0 fun setVideoSource(videoSource: PlanetKitCustomVideoSource)fun setCustomVideoSource(videoSource: PlanetKitCustomVideoSource)fun clearVideoSource()fun clearCustomVideoSource()
ConferenceListener의 사용되지 않는 콜백 제거
- 더 이상 사용되지 않는 API를 제거했습니다.
- 이제
ConferenceListener.onPeerListUpdated를 사용하여 참여한 피어 수에 대한 정보를 얻을 수 있습니다.
API Change
삭제
ConferenceListenerinterface Group callfun onRoomUpdated(joinedPeerCount: Int)
setSpeakerOn 및 isSpeakerOn 메서드를 PlanetKitAudioSwitch로 이동
setSpeakerOn메서드를PlanetKitCall및PlanetKitConference에서PlanetKitAudioSwitch로 이동했습니다. 이 메서드는 이제 성공 또는 실패를 나타내는Boolean을 반환합니다.isSpeakerOn메서드를PlanetKitCall및PlanetKitConference에서PlanetKitAudioSwitch로 이동했습니다.
API
변경
-
PlanetKitCallinterface 1-to-1 call이전 버전 PlanetKit 6.0.0 fun setSpeakerOn(isSpeakerOn: Boolean)PlanetKitAudioSwitch::fun setSpeakerOn(isSpeakerOn: Boolean): Booleanval isSpeakerOn: BooleanPlanetKitAudioSwitch::val isSpeakerOn: Boolean -
PlanetKitConferenceinterface Group call이전 버전 PlanetKit 6.0.0 fun setSpeakerOn(isSpeakerOn: Boolean)PlanetKitAudioSwitch::fun setSpeakerOn(isSpeakerOn: Boolean): Booleanval isSpeakerOn: BooleanPlanetKitAudioSwitch::val isSpeakerOn: Boolean
외장 카메라 지원
- 이번 릴리스에서는 외장(USB) 카메라 지원이 추가되었습니다.
- 외장 카메라 지원 가능 여부는 Android 기기에 따라 다릅니다.
- 외장 카메라를 사용하려면 Android 기기가
android.hardware.camera.external기능을 지원해야 합니다. - 이는
packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_EXTERNAL)또는adb shell pm list features | grep "android.hardware.camera.external"을 사용하여 확인할 수 있습니다.
- 외장 카메라를 사용하려면 Android 기기가
예제 코드
- 외장 카메라로 전환하기
PlanetKit.getCameraManager().startPreview(yourVideoView)
...
if (PlanetKitCameraType.EXTERNAL.isAvailable) {
PlanetKit.getCameraManager().cameraType = PlanetKitCameraType.EXTERNAL
}
- 외장 카메라 사용 가능 여부 관찰하기
private val usbCameraAvailabilityListener = UsbCameraAvailabilityListener { isAvailable ->
// For example, update your UI components based on camera availability.
}
fun onViewCreated() {
PlanetKit.getCameraManager().addUsbCameraAvailabilityListener(usbCameraAvailabilityListener)
}
fun onDestroyView() {
PlanetKit.getCameraManager().removeUsbCameraAvailabilityListener(usbCameraAvailabilityListener)
}
API
추가
PlanetKitCameraTypeenum class 1-to-1 callGroup callEXTERNAL
PlanetKitCameraManagerinterface 1-to-1 callGroup callval supportDeviceFeatureExternalCamera: Booleanfun interface UsbCameraAvailabilityListenerfun addUsbCameraAvailabilityListener(listener: UsbCameraAvailabilityListener)fun removeUsbCameraAvailabilityListener(listener: UsbCameraAvailabilityListener)