本文介绍如何实现 Android 开播 SDK 的基础功能。
您已集成 Android 开播 SDK。详见 集成 Android 开播 SDK。
在定义如何进入直播间的文件中,添加以下代码。
说明
通过调用 CreateActivityAPIV2 或 ListActivityAPI 获取直播间的活动 ID,调用 GetTemporaryLoginTokenAPI 获取开播密钥。
/**
* 进入直播间。
*
* @param activity 用于调用直播间所在页面的 Activity。
* @param PushJoinRoomConfig 进入直播间所需的配置。
*/
TVUPushLiveRoom.startPushLiveRoom(activity, new PushJoinRoomConfig(activityId, secretKey, new JoinResultListener() {
// 进入直播间成功回调。
@Override
public void onJoinSuccess() {
Log.d(TAG, "TVUPushLiveRoom.startPushLiveRoom onJoinSuccess");
}
/**
* 进入直播间失败回调。
* @param errCode 错误码。
* -1:网络错误。
* -2:权限错误。
* -3:JSON 解析错误。
* -4:超时错误。
* -5:用户手动退出错误。
* 2000001: activityId(直播间活动 ID)或 secretKey(开播密钥)错误。
*
* @param errMsg 错误信息。
*/
@Override
public void onJoinFailed(int errCode, String errMsg) {
Log.d(TAG, "TVUPushLiveRoom.startPushLiveRoom onJoinFailed:" + " errCode:" + errCode +
" errMsg:" + errMsg);
}
}));
PushJoinRoomConfig
详情如下所示。
public class PushJoinRoomConfig {
// 直播间的活动 ID。必选。
public long activityId;
// 开播密钥。必选。
public String secretKey;
// 进入直播间结果的回调类。可选。
public JoinResultListener joinResultListener;
}
在定义如何退出直播间的文件中,添加以下代码:
/**
* 退出直播间
*
* @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);
}
});