本文介绍如何实现 Android 开播 SDK 的基础功能。
您已集成 Android 开播 SDK。详见 集成 Android 开播 SDK。
在定义如何进入直播间的文件中,添加以下代码:
说明
通过调用 CreateActivityAPIV2 或 ListActivityAPI 获取直播间的活动 ID,调用 GetTemporaryLoginTokenAPI 获取开播密钥。
/** * 进入直播间 * * @param activity 用于调用直播间所在页面的 Activity * @param activityId 直播间的活动 ID * @param secretKey 开播密钥 */ TVUPushLiveRoom.startPushLiveRoom(activity, activityId, secretKey);
在定义如何退出直播间的文件中,添加以下代码:
/** * 退出直播间 * * @param context 上下文 */ TVUPushLiveRoom.leavePushLiveRoom(context);
App 在后台运行时,SDK 会通过显示前台通知来保证后台不断流。您可以定制通知的图标和文案。
NotificationInfo info = new NotificationInfo( R.mipmap.ic_launcher_round, // 图标 "企业直播", // 标题 "App 后台运行中"); // 详情 PushSettings.Holder.mSettings.setKeepLiveServiceNotifyInfo(info);
设置开播后是否显示评论区的消息和输入框。
默认值:true
。
true
:显示评论区false
:不显示评论区PushSettings.Holder.mSettings.getUiSettings().setEnableCommentArea(true);
在直播间提供一个撑满屏幕且层级在当前界面元素之上的 UI 区域,供您添加自定义组件。
注意
该配置自 1.30.0 版本开始不再支持使用。请使用 onCustomUIAreaEnabled
回调替代之。
CustomUIAreaListener uiAreaListener = container -> { View view = new View(container.getContext()); view.setBackgroundColor(Color.RED); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(SizeUtils.dp2px(40), SizeUtils.dp2px(40)); lp.gravity = Gravity.CENTER; container.addView(view, lp); }; PushSettings.Holder.mSettings.getUiSettings().setCustomUIAreaListener(uiAreaListener);
定制横屏或竖屏开播页的背景图。
横屏
PushSettings.Holder.mSettings.getUiSettings().setLandscapeBackgroundDrawableListener(new ITVUSingleDrawableListener() { // 在需要显示开播页背景图时调用该方法,可返回 Drawable 对象(定制背景图) @Override public Drawable onGetSingleDrawable() { return AppCompatResources.getDrawable(getApplicationContext(), R.drawable.background_landscape); } });
竖屏
PushSettings.Holder.mSettings.getUiSettings().setPortraitBackgroundDrawableListener(new ITVUSingleDrawableListener() { // 在需要显示开播页背景图时调用该方法,可返回 Drawable 对象(定制背景图) @Override public Drawable onGetSingleDrawable() { return AppCompatResources.getDrawable(getApplicationContext(), R.drawable.background_portrait); } });
public void enableShowCloudTemplateEntrance(boolean enable)
参数
名称 | 类型 | 说明 |
---|---|---|
enable | Boolean | 是否显示模板入口按钮。
|
public void enableEditCloudTemplateEnable(boolean enable)
参数
名称 | 类型 | 说明 |
---|---|---|
enable | Boolean | 是否支持新增和编辑模板。
|
public void enableEditLiveInfo(boolean enable)
参数
名称 | 类型 | 说明 |
---|---|---|
enable | Boolean | 是否支持编辑直播间的横屏封面和标题。
|
public void setShowBeautyEntrance(boolean showBeautyEntrance)
参数
名称 | 类型 | 说明 |
---|---|---|
showBeautyEntrance | Boolean | 是否显示美颜入口按钮。
|
public void setShowPropsEntrance(boolean showPropsEntrance)
参数
名称 | 类型 | 说明 |
---|---|---|
showPropsEntrance | Boolean | 是否显示道具入口按钮。
|
public void setShowPendentEntrance(boolean showPendentEntrance)
参数
名称 | 类型 | 说明 |
---|---|---|
showPendentEntrance | Boolean | 是否显示挂件和图层入口按钮。
|
public void setShowSwitchCamera(boolean showSwitchCamera)
参数
名称 | 类型 | 说明 |
---|---|---|
showSwitchCamera | Boolean | 是否显示前后摄像头翻转入口按钮。
|
public void setShowRotateScreen(boolean showRotateScreen)
参数
名称 | 类型 | 说明 |
---|---|---|
showRotateScreen | Boolean | 是否显示横竖屏切换入口按钮。
|
public void setShowChangeResolution(boolean showChangeResolution)
参数
名称 | 类型 | 说明 |
---|---|---|
showChangeResolution | Boolean | 是否显示清晰度切换入口按钮。
|
public void setShowRecordScreenEntrance(boolean showRecordScreenEntrance)
参数
名称 | 类型 | 说明 |
---|---|---|
showRecordScreenEntrance | Boolean | 是否显示录屏直播入口。
|
public void setShowMediaMergeEntrance(boolean showMediaMergeEntrance)
参数
名称 | 类型 | 说明 |
---|---|---|
showMediaMergeEntrance | Boolean | 是否显示媒体合流入口按钮。
|
public void setShowTextMergeEntrance(boolean showTextMergeEntrance)
参数
名称 | 类型 | 说明 |
---|---|---|
showTextMergeEntrance | Boolean | 是否显示文字合流入口按钮。
|
录屏直播的主持人在开播前可选择 2 种帧率模式:高帧率模式和默认帧率模式。
在主持人共享高帧率画面时,高帧率模式可为观众提供更流畅的观看体验。该模式适用于游戏直播等场景。
高帧率模式可能导致设备耗电快、过热以及带宽使用量增加。因此,建议主持人在共享屏幕画面帧率为 30 fps 及以上且上行带宽为 100 Mbps 及以上时使用该模式。
public void setPreferHighFramePublishScreen (boolean preferHighFramePublishScreen)
参数
名称 | 类型 | 说明 |
---|---|---|
preferHighFramePublishScreen | Boolean | 是否将高帧率模式设为默认。
|
设置回调监听直播间变化。
PushSettings.Holder.mSettings.setPushRoomListener(new PushRoomListener() { TextView textView; @Override // 在主持人进入直播间成功后触发该回调 public void onPushRoomJoined(Activity activity, TVUPushServer tvuPushServer) { // 添加自定义的 IM(长链接消息)信令监听器。IM 信令消息目前适用于发送自定义消息的场景,您可以通过监听自定义消息实现自己的业务逻辑。 tvuPushServer.getWsConnector().addListener(new WSCustomIMListener() { /** * 通过 SendCustomSystemMessageAPI 接口发送的自定义的 IM 信令收到回调 * @param str 通过 SendCustomSystemMessageAPI 接口发送的自定义的 IM 信令 */ @Override public void onReceiveIMString(String str) { if (textView != null) { textView.setText(str); } } @Override // IM 建立连接失败回调 public void onConnectFailed() { } @Override // IM 建立连接成功回调 public void onConnected() { } }); ToastUtil.displayToast("主持人进入直播间"); } @Override // 在主持人进入直播间成功且直播间页面渲染完成后触发该回调 public void onCustomUIAreaEnabled(FrameLayout container) { // 在直播间中添加自定义的 View textView = new TextView(container.getContext()); textView.setBackgroundColor(Color.RED); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(SizeUtils.dp2px(40), SizeUtils.dp2px(40)); lp.gravity = Gravity.CENTER_VERTICAL; lp.leftMargin = SizeUtils.dp2px(20); container.addView(textView, lp); } @Override // 在主持人退出直播间时触发该回调。注意清理相关资源,避免内存泄露 public void onPushRoomDestroyed(Activity activity) { ToastUtil.displayToast("主持人退出直播间"); } @Override // 在屏幕朝向改变时触发该回调 public void onPushRoomOrientationChanged(Activity activity, boolean isPortrait) { ToastUtil.displayToast("屏幕朝向改变:" + (isPortrait ? "竖屏" : "横屏")); } @Override // 在直播推流开始时触发该回调 public void onPushStreamStarted() { ToastUtil.displayToast("直播开始"); } @Override // 在直播推流结束时触发该回调 public void onPushStreamStopped() { ToastUtil.displayToast("直播结束"); } });
在 SDK 渲染完单条评论内容后触发该回调,用于自定义评论的文字内容、样式或替换表情图片。
示例代码
以下示例代码将文字评论中的 123
变为黄色,将微笑表情替换为其他图片。
PushSettings.Holder.mSettings.setCommentCustomizeListener(new CommentCustomizeListener() { /** * * @param commentModel 单条评论的数据信息 Model * @param languageManager 直播间的多语言管理器 * @param spannableStringBuilder TextView 当前设置的 spannableString * @param textView 单条评论对应的 TextView */ @Override public void onCustomizeCommentContent(SingleCommentModel commentModel, LanguageManager languageManager, SpannableStringBuilder spannableStringBuilder, TextView textView) { // 判断评论是否为主持人发送 boolean presenter = commentModel.isPresenter(); // 获取直播间当前选中的语言 LanguageManager.LANGUAGE curLanguage = languageManager.getCurLanguage(); String s = spannableStringBuilder.toString(); // 将文字评论中的 123 变为黄色 if (s.contains("123")) { spannableStringBuilder.setSpan(new ForegroundColorSpan(Color.YELLOW), s.indexOf("123"), s.indexOf("123") + 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); } // 将微笑表情替换为其他图片 if (s.contains("[微笑]")) { spannableStringBuilder.setSpan(new GlideImageSpan(textView, "https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/055f8e4f26c04fd39aa3a3935a43866e~tplv-goo7wpa0wc-image.image"), s.indexOf("[微笑]"), s.indexOf("[微笑]") + "[微笑]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); } textView.setText(spannableStringBuilder); } });