全民K歌IOT开放平台
  1. KtvSDK3.0接入说明
全民K歌IOT开放平台
  • 厂商合作流程
  • 快速接入K歌开放平台流程
  • SDK bug提单规范
  • 如何在线调试接口
  • 常见问题FAQ
  • 开放平台API错误码说明
  • 开放平台接入指南
    • 登录鉴权方式介绍V2(推荐)
    • 如何申请接入
    • CDK权限申请流程
    • 暗账号绑定明账号对接文档
    • 全民K歌暗账号登录方案
    • 获取应用级token
    • 获取登录二维码
    • 查询二维码的状态
    • 获取用户级token
    • 刷新用户级token
    • 暗账号解绑K歌uid
    • 获取暗账号绑定信息
  • KtvSDK3.0接入说明
    • KtvSDK-接入指南
    • KtvSDK-打分
    • KtvSDK-登录
    • KtvSDK-歌词
    • KtvSDK-播放
    • KtvSDK-作品录音、合成与播放2.0版
    • KtvSDK-播放页实现示例
    • KtvSDK-常见问题FAQ
    • KtvSDK-低性能设备处理
    • KtvSDK-反馈
    • KtvSDK-缓存管理
    • KtvSDK-切换音频视频清晰度
    • KtvSDK-跳过前奏
    • Ktv支付-米大师支付
    • KtvSDK-播放失败错误码说明
    • KtvSDK-3.0版本新功能
    • KtvSDK-2.0升级到3.0版本迁移指南
    • KtvSDK-多屏渲染
    • KtvSDK-多屏一起唱---歌词与打分适配
    • KtvSDK-Android4.4设备G2证书兼容处理
    • KtvSDK-APP上报
    • KtvSdk-离线缓存与离线播放
    • KtvSDK-3.0升级到4.0版本迁移指南
  • 基础类
    • tagId对照表
    • 歌曲详情
    • 查询mv的播放地址
    • 搜索
    • 搜索联想
    • 查询歌手歌曲
    • 获取歌曲歌词文件
    • Q音歌曲mid映射K歌
    • 短剧播放链接
    • 查询应用限免配置
    • 转换Q音或酷狗歌曲ID
    • 搜索(海外)
    • 查询歌手类型列表(海外)
    • 查询歌手列表(海外)
    • 查询热门歌手列表(海外)
  • 运营类
    • 排行榜id说明
    • 获取城市id列表
    • 获取专题分类列表
    • 获取云端配置
    • 热门ugc
    • 热搜词
    • 排行榜
    • 获取专题下歌曲信息
    • 获取车联渠道映射
    • 热门推荐
    • (新)排行榜
    • 综合歌单列表查询
    • 设置缓存设备
    • TV版分类歌单列表
    • 获取用户协议
    • 综合歌单列表查询(海外)
    • 榜单列表查询(海外)
    • 自建歌单列表查询(海外)
    • 获取广告配置
    • 拉取短剧合集的列表
    • 获取渠道运营位配置
    • 查询合唱榜单
    • 上报合唱榜单
    • OTA升级版本检查
  • 用户类
    • 用户信息查询
    • 删除用户UGC作品
    • 获取推荐/翻唱作品
    • 获取同城作品
    • 用户作品列表
    • 获取好友作品
    • UGC作品详情
    • 更改作品访问权限
    • 用户个推歌单
  • 支付类
    • 支付接入流程
    • 订单发货使用简述
    • 开通设备会员限免简述
    • 订单发货中通用sign计算规则
    • 通用返回结构
    • 【CDK】CDK兑换
    • 【CDK】生成CDK
    • 【CDK】CDK召回
    • 【CDK】CDK状态查询
    • 【三方支付】订单发货
    • 【三方支付】手机号发货
    • 【三方支付】订单状态查询
    • 【米大师支付】获取会员商品列表
    • 【米大师支付】未登录-查询会员商品列表
    • 【米大师支付】支付下单
    • 【米大师支付】支付成功通知
    • 【米大师支付】查询用户支付成功订单记录
    • 查询设备以及用户是否有赠送资格
    • 查询设备限免剩余时长
    • 设备会员迁移
    • 查询会员赠送时长
    • 同步支付订单接口
    • 【三方支付】存量会员迁移领取查询
    • 【三方支付】存量会员迁移接口
    • 授权设备体验会员
    • 查询用户会员信息
    • 【三方支付】超会发货
    • 取消授权设备体验会员
  • 用户作品-文件类
    • callback_url说明
    • 上传音频源文件
    • (服务端)上传音频作品的链接
  • 通用类
    • 【厂商定制】匹配搜索
    • 获取kg的短链接
    • 三方厂商通用上报
  • KtvSdk4.0接入说明
    • KtvSdk4.0接入文档
    • PK与合唱接入
    • 动效歌词接入文档
    • 手麦接入文档
    • 支持调整录制时长限制
  • 数据模型
    • Schemas
      • protocal.DelUserWorkReq
      • protocal.BarDisplay
      • protocal.GetLyricUrlReq
      • protocal.ConfigItem
      • multipart.FileHeader
      • protocal.ExchangeCdkeyReq
      • protocal.GetLyricUrlRsp
      • protocal.DelUserWorkRsp
      • protocal.GetVipProductRsp
      • protocal.GetChannelReq
      • protocal.ExchangeCdkeyRsp
      • protocal.GetMvUrlReq
      • protocal.GetHitedSongListReq
      • protocal.GoodsInfo
      • protocal.GetChannelRsp
      • protocal.ClientUgcUploadRsp
      • protocal.GetLimitFreeRestTimeReq
      • protocal.GetMvUrlRsp
      • protocal.GetHitedSongListRsp
      • protocal.VipAdItem
      • protocal.GetClassReq
      • protocal.DeleteFileReq
      • protocal.GetLimitFreeRestTimeRsp
      • protocal.GetSongInfoByQmIDReq
      • protocal.GetRecommWorkReq
      • protocal.WebOrderNotifyReq
      • protocal.GetClassRsp
      • protocal.DeleteFileRsp
      • protocal.GetPresentVipConfReq
      • protocal.GetSongInfoByQmIDRsp
      • protocal.GetRecommWorkRsp
      • protocal.WebOrderNotifyRsp
      • protocal.GetConfigReq
      • protocal.UgcUploadReq
      • protocal.GetPresentVipConfRsp
      • protocal.GetSongInfoReq
      • protocal.GetUserInfoReq
      • protocal.GetConfigRsp
      • protocal.UgcUploadRsp
      • protocal.OpenDeviceLimitReq
      • protocal.WebOrderStatusReq
      • protocal.GetSongInfoRsp
      • protocal.GetUserInfoRsp
      • protocal.GetHomePageReq
      • textproto.MIMEHeader
      • protocal.PresentNormalVipReq
      • protocal.WebOrderStatusRsp
      • protocal.GetSongUrlReq
      • protocal.GetUserWorkReq
      • protocal.GetHomePageRsp
      • protocal.PresentNormalVipRsp
      • protocal.GetSongUrlRsp
      • protocal.GetUserWorkRsp
      • protocal.GetHotRecomUgcReq
      • protocal.MvInfo
      • protocal.GetVipInfoRsp
      • protocal.GetHotRecomUgcRsp
      • protocal.SearchReqV2
      • protocal.GetWorkInfoReq
      • protocal.GetHotWordsReq
      • protocal.SearchRsp
      • protocal.GetWorkInfoRsp
      • protocal.GetHotWordsRsp
      • protocal.SingerInfo
      • protocal.SetUgcAccessRightReq
      • protocal.HomePageItem
      • protocal.SingerSongsFilterReq
      • protocal.SetUgcAccessRightRsp
      • protocal.PlayList
      • protocal.SingerSongsFilterRsp
      • protocal.RankSongReq
      • protocal.SingerSongsReq
      • protocal.UgcItem
      • protocal.RankSongRsp
      • protocal.SingerSongsRsp
      • protocal.UserFeatureSongReq
      • protocal.RecommendReq
      • protocal.SongContentStr
      • protocal.UserFeatureSongRsp
      • protocal.RecommendRsp
      • protocal.SongInfo
      • protocal.SongInfoPlus
      • protocal.Theme
      • protocal.TCLGetOpenIdReq
      • protocal.ThemeClass
      • protocal.TCLGetOpenIdRsp
      • protocal.ThemeSongsByIdReq
      • protocal.ThemeSongsByIdRsp
      • protocal.UgcItemInfo
      • protocal.Word
      • protocol.PresentNormalVipReq
      • protocol.UgcUploadRsp
      • protocol.SingerSongsRsp
      • protocol.TCLGetOpenIdRsp
      • protocol.RecommendRsp
      • protocol.Word
      • protocol.UserFeatureSongRsp
      • protocol.CheckDeviceEligibleReq
      • protocol.GetCollectListReq
      • protocol.AddCollectListReq
      • protocol.SongInfo
      • protocol.DelCollectListReq
      • protocol.VipAdItem
      • protocol.WebOrderStatusRsp
      • protocol.ClientUgcUploadReq
      • protocol.GetTopListRsp
      • protocol.OpenDeviceVipRsp
      • protocol.RefundDeviceVipReq
      • protocol.GetLyricUrlRsp
      • protocol.GetSongInfoByQmIDReq
      • protocol.GetSongInfoRsp
      • protocol.GetSongUrlRsp
      • protocol.SearchRsp
      • protocol.SingerSongsFilterReq
      • protocol.SongInfoPlus
      • protocol.GetLyricUrlReq
      • protocol.GetMvUrlReq
      • protocol.GetMvUrlRsp
      • protocol.GetSongInfoByQmIDRsp
      • protocol.GetSongInfoReq
      • protocol.GetSongUrlReq
      • protocol.MvInfo
      • protocol.SearchReqV2
      • protocol.SingerInfo
      • protocol.SingerSongsFilterRsp
      • protocol.SingerSongsReq
      • protocol.SongContentStr
      • protocol.DelCollectListRsp
      • protocol.GetHitedSongListRsp
      • protocol.GetUserWorkReq
      • protocol.GetUserWorkRsp
      • protocol.GetWorkInfoRsp
      • protocol.SetUgcAccessRightRsp
      • protocol.DelUserWorkReq
      • protocol.AddCollectListRsp
      • protocol.DelUserWorkRsp
      • protocol.GetHitedSongListReq
      • protocol.GetCollectListRsp
      • protocol.GetRecommWorkReq
      • protocol.GetUserInfoReq
      • protocol.GetUserInfoRsp
      • protocol.GetRecommWorkRsp
      • protocol.GetVipInfoRsp
      • protocol.GetWorkInfoReq
      • protocol.SetUgcAccessRightReq
      • protocol.UgcItem
      • protocol.UserFeatureSongReq
      • protocol.GoodsInfo
      • protocol.WebOrderNotifyRsp
      • protocol.GetVipProductRsp
      • protocol.BarDisplay
      • protocol.OpenDeviceVipReq
      • protocol.RefundDeviceVipRsp
      • protocol.WebOrderNotifyReq
      • protocol.WebOrderStatusReq
      • protocol.ExchangeCdkeyRsp
      • protocol.GetPresentVipConfRsp
      • protocol.PresentNormalVipRsp
      • protocol.GetLimitFreeRestTimeReq
      • protocol.GetLimitFreeRestTimeRsp
      • protocol.ExchangeCdkeyReq
      • protocol.GetPresentVipConfReq
      • protocol.OpenDeviceLimitReq
      • protocol.GetClassRsp
      • protocol.GetHomePageReq
      • protocol.GetHotRecomUgcReq
      • protocol.GetHotRecomUgcRsp
      • protocol.GetTopListReq
      • protocol.RankSongRsp
      • protocol.RecommendReq
      • protocol.ThemeClass
      • protocol.ThemeSongsByIdRsp
      • protocol.ConfigItem
      • protocol.GetChannelReq
      • protocol.GetChannelRsp
      • protocol.GetClassReq
      • protocol.GetConfigReq
      • protocol.GetConfigRsp
      • protocol.GetHomePageRsp
      • protocol.GetHotWordsReq
      • protocol.GetHotWordsRsp
      • protocol.HomePageItem
      • protocol.PlayList
      • protocol.RankSongReq
      • protocol.Theme
      • protocol.ThemeSongsByIdReq
      • protocol.UgcItemInfo
      • protocol.GetShortUrlReq
      • protocol.GetShortUrlRsp
      • protocol.SearchHintRsp
      • protocol.SearchHintReq
      • protocol.MultiPlaylistRsp
      • protocol.PlaylistInfo
      • protocol.MultiPlaylistReq
      • protocol.GetPayOrderListReq
      • protocol.GetPayOrderListRs p
      • protocol.GetUserVipInfoReq
      • protocol.GetUserVipInfoRsp
      • protocal.GetTvPlaylistSetReq
      • protocol.Playlist
      • protocol.GetTvPlaylistSetRsp
      • protocol.TvChorusUser
      • protocol.ClientUgcUploadRsp
      • protocol.Episode
      • protocol.UgcUploadReq
      • protocol.GenerateNewOrderCdkReq
      • protocol.GetMiniShowUrlReq
      • protocol.GenerateNewOrderCdkRsp
      • protocol.DeleteFileReq
      • protocol.GetVipProductReq
      • protocol.GetMiniShowUrlRsp
      • protocol.DeleteFileRsp
      • protocol.MergerQrCode
      • protocol.GetSdkTokenReq
      • protocol.GetSdkTokenRsp
      • protocol.PlacePayOrderReq
      • protocol.PlacePayOrderRsp
      • protocol.QueryReceiveTransferVipReq
      • protocol.QueryReceiveTransferVipRsp
      • protocol.ReceiveTransferVipReq
      • protocol.ReceiveTransferVipRsp
      • protocol.RecallNewCDKReq
      • protocol.QueryNewCDKReq
      • protocol.QueryNewCDKRsp
      • protocol.OpenDeviceLimitRsp
      • protocol.RecallNewCDKRsp
      • protocol.WebThirdpartyOrderReq
      • protocol.GetMiniShowCollectionReq
      • protocol.WebThirdpartyOrderRsp
      • protocol.GetMiniShowCollectionRsp
      • protocol.MiniShowItem
      • protocol.TCLGetOpenIdReq
  1. KtvSDK3.0接入说明

KtvSDK-常见问题FAQ

demo使用问题#

编译不通过
1.
请确认项目是否使用的jdk8.
2.
排查编译环境问题后,可在gradle.properties增加编译配置:
android.enableDexingArtifactTransform=false
demo未启动成功,报错“appid isNullOrEmpty”。
查看文档1.1节的配置是否已处理。

登录#

登录报3003错误,扫码后提示"Sign check failed"
出现这个错误码就是下面两种原因之一:
1.
设备本地时间不对
2.
配置的appkey与sdk的当前环境不一致。如appkey是正式环境的,但sdk是测试环境。如果logcat中过滤到的url含**/test**,则说明请求的是测试环境的接口。切换环境方法见KtvSDK-接入指南的1.2节。
登录报错 "response fail: javax.net.ssl.SSLHandshakeException: Chain validation failed"
证书校验错误,看下设备本地时间对不对。

打分&歌词#

打分偏低/偏高
由于不同设备/麦克风收声能力不同,可能会导致打分的分数偏高/偏低;
先确认麦克风的人声数据是否是清晰的声音,如果人声不清晰那打出的分数自然就低。
如果不是上述原因,是设备硬件问题,则合作方可以设置打分加权系数,sdk会将实际分数乘上这个系数;注意这个方法只针对普通打分生效,对于五维打分无法加权
KtvPlayerConfig.getInstance().setScoreFactor(float factor)
歌词不够流畅
1.
歌词不需要背景。像demo中给歌词加上了蓝色背景,一般情况下 歌词不需要背景,不设置即可(xml中去掉app:lyricBackgroundColor="#0000ff"),否则每次绘制都需要单独绘制背景,造成额外开销
2.
如果不需要评分功能,可以将songType设置为SongInfoModel.SONG_TYPE_KSONG_LISTEN,这样将关闭打分和录音,降低性能消耗
3.
设置歌词刷新率,目前歌词默认刷新间隔是64ms,支持设置(例app:flushTime = "16")可以尝试将刷新间隔降低,例如32ms 16ms,更频繁的刷新歌词,但可能会引起cpu的占用增加;
五维打分的单句结果回调为什么技巧和情感分始终为 0
五维打分的单句结果回调只会回调节奏、气息、音准三个维度的分数,技巧和情感单句打分始终为 0,等演唱结束时总分会打出包括技巧和情感的五个维度的分数。
五维打分为什么最后回调的技巧分数很低,明明整体分数挺高的
五维打分技巧这个维度就是不好打,建议做加权处理:
计算其他维度平均分:计算除技巧外其他四个维度的总分平均值。
判断是否需要加权:如果技巧分数低于其他四个维度的平均分,则进行加权处理。
加权处理:生成一个 0 到 9 之间的随机数,加上其他四个维度的平均分得到加权后的技巧分数,同时确保分数不超过 100。

播放#

如何查询播放错误原因
可以过滤sdk的日志来查询常见错误,过滤关键字 onPlayerError或onExecuteFail
如果错误日志看不出问题,可咨询K歌开发确定原因。
播放开始后视频为什么会黑屏,有没有优化方式?
常见原因是视频因设备不支持等原因播放失败时,厂商没有实现onShowPicture接口显示大图。
视频播放失败后,此回调会返回一个歌曲封面图url,厂商接收到此回调后,可在KtvVideoLayout上覆盖一个图片控件显示大图兜底。
从支付页面返回播放页后出现视频黑屏,如何解决?
将支付页设置为透明主题,可解决此问题。
<style name="Theme.Transparent" parent="android:Theme.Translucent.NoTitleBar">
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:backgroundDimAmount">0.8</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">false</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    </style>
或者使用opengl画布,这样在当前页面stop()后,Surface不会被销毁,坏处是CPU占用会稍有升高。切换opengl画布方式:
播放前设置:
KtvPlayerConfig.getInstance().useOpenGL(true)
播放时报错误“.AbstractMethodError: abstract method "void com.google.android.exoplayer2.analytics.AnalyticsListener.onEvents(com.google.android.exoplayer2.Player, com.google.android.exoplayer2.analytics.AnalyticsListener$Events)"
gradle版本过高,建议gradle插件的版本为3.6,gradle-wrapper的版本为gradle-6.9-all.
classpath "com.android.tools.build:gradle:3.6.0"
No virtual method build() Lcom/google/android/exoplayer2/DefaultLoadcontrol
确认exoplayer版本是否为“接入指南”中指定的版本
java.lang.NoSuchMethodError: No virtual method buildOrThrow()Lcom/google/common/collect/ImmutableMap; in class Lcom/google/common/collect/ImmutableMapBuilder;oritssuperclasses(declarationof′com.google.common.collect.ImmutableMapBuilder' appears in base.apk!classes3.dex)
项目中集成的guava版本与exoplayer版本不匹配。
    //复制自ExoPlayer仓库,与ExoPlayer-2.18.5配套使用。
    implementation ("com.google.guava:guava:31.0.1-android") {
        // Exclude dependencies that are only used by Guava at compile time
        // (but declared as runtime deps) [internal b/168188131].
        exclude group: 'com.google.code.findbugs', module: 'jsr305'
        exclude group: 'org.checkerframework', module: 'checker-compat-qual'
        exclude group: 'org.checkerframework', module: 'checker-qual'
        exclude group: 'com.google.errorprone', module: 'error_prone_annotations'
        exclude group: 'com.google.j2objc', module: 'j2objc-annotations'
        exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations'
    }

录音#

sdk播放完成后无录音文件?
因为此录音文件sdk在唱下下首歌时会删除旧录音文件,所以在播放结束onPlayEnd()回调时,需要将文件复制到其它路径自行保存。如果onPlayEnd()回调的文件不存在,确认如下条件是否满足:
1.
播放时sdk在K歌模式(SongType.SONG_TYPE_K_SONG)模式下,并授予了录音权限。
2.
以下设置在播放前已打开:
//打开音频保存
KtvPlayerConfig.getInstance().enableSavePcm = true
3.
歌曲已播放到末尾,即KaraokePlayerCallback#onPlayEnd回调中,playFinish参数的值为true.
4.
在播放结束前系统有给sdk传输人声。
如果是使用系统收声,让系统检查AudioRecord.read()是否正确在40ms内返回过人声。
如果是麦克风收声并定制过sdk的声音通道,检查是否调用过AudioReceiver.notifyReceiveAudioFrame()给传过人声。

声音通道#

sdk如何选择使用哪个声音通道(installer)?
app启动时安装所有可支持的AudioRecevierInstaller,在每次播放时会遍历列表,哪个receiver.onCheckInstallerEnable()返回true,就用哪个。
查看用的哪个audioReceiver的方法:过滤finalInputInstaller,看类名。

音频焦点#

KtvSDK没有对音频焦点进行处理,集成方需要自行处理。

其它#

如何查看sdk的版本号?
logcat中过滤hostChannelId关键字,可查看到sdk当前版本号,示例如下:
qua: V1_ATV_KG_2.1.02_23_100074_A, appId: 100074, hostId: common, isProductEnv: false, isDevMode: true, buildInfo: null_2024_02_20 15:17:37, deviceInfo{SDK_INT: 31BRAND: HUAWEIMODEL: NOH-AN00MANUFACTURER: HUAWEIDEVICE: HWNOH}, hostVersionName: 2.1.02.23, uid: , hostChannelId: DE_SAI
其中2.0.02为sdk版本号,buildInfo中的时间为此sdk版本的构建时间。
如何获取sdk设备ID?
com.tme.ktv.api.KtvSdk#getSdkImei()
如何切换sdk到测试环境?
KtvSDK默认是正式环境,如果需要切换到sdk的测试环境,可以在APP启动时使用KtvSdk.setProductEnv(false)方法来切换,重启应用后生效。
打分条为什么卡住不动
需要确认设备是否能够正常收声,声音通道是否设置正确。
为什么歌词显示了两个,重叠了
需要注意,MV中可能会显示歌词,这种情况下,不需要再显示歌词组件。SongInfoObject.isMvHasLyric()不为true (即MV没有自带歌词)
MV播放失败后歌词不显示怎么办
如果MV自带歌词,但是MV播放黑屏了 会导致不显示歌词,这时会收到onShowPic的回调,判断如果当前MV自带歌词,那需要再初始化并显示歌词组件。
如何实现歌词倒计时
sdk不提供歌词倒计时组件,但是接入方可以根据回调自行实现相关功能。OnLyricCountDown会回调当前距离歌词首句显示的时间
LyricController.getInstance().addLyricListener(object : LyricListener {
            override fun OnLyricTextUpdate(text: String?) {
                //歌词单句回调
                Logger.d(TAG, "OnLyricTextUpdate $text")
            }

            override fun OnLyricCountDown(countDown: Int) {
                //跳过前奏倒计时 比如5000代表 还有5s开始显示歌词
                Logger.d(TAG, "OnLyricCountDown $countDown")
            }
        })
弱网环境下,起播很慢加载超时,有什么优化建议吗
1.
加入已点时,如果当前没有播放的歌曲,先预加载当前已点(调用preload)
2.
当前播放歌曲所有资源下载完毕了,预加载下一首
3.
app侧监测到网络不好时,请求低清晰度的资源
4.
app看下加载超时时间是否可以调整大一些
修改于 2025-09-01 07:13:36
上一页
KtvSDK-播放页实现示例
下一页
KtvSDK-低性能设备处理
Built with