android端接入腾讯云直播全过程详解(包含腾讯云点播、腾讯云IM)直播+弹幕+录制直播视频

前言

为什么想到对接腾讯云直播SDK呢?答案很简单--公司需要。从开始着手对接SDK,到现在直播全程流畅跑通,花了两周零几天的时间。为了帮后续也需要接入腾讯云直播SDK的朋友节省不必要的时间、少走点弯路,决定写下这篇文章,把我对接的全过程记录下来。

日期:2019/12/24

开发过程

1.接入SDK:

只需要导入以下两个SDK,直播和IM的,点播不需要导入SDK。

    //腾讯云直播
    implementation 'com.tencent.liteavsdk:LiteAVSDK_Smart:latest.release'
    //腾讯云IM
    implementation 'com.tencent.imsdk:imsdk:4.6.1'

注意:导入IM到项目中后,注意是否是最新版本,如果不是最新版本会显黄色,请根据提示修改成最新版本。

博主根据文档接入IMSDK的时候,就是因为没有导入最新版本的SDK,因此出了bug,浪费了一些时间!同样的坑请不要踩了。

2.初始化SDK:

按照我自己一直以来的习惯,但凡是接入第三方SDK,都会专门写一个工具类来操作,这里我创建的工具类是TXLiveUtils。

同样按照习惯,将初始化代码写在Application类的onCreate方法中(当然你也可以写在你的某个Activity里):

        //腾讯云直播组件初始化
        //初始化腾讯云直播工具类
        TXLiveUtils.createInstance(this);
        //初始化腾讯云直播SDK
        TXLiveUtils.getInstance().initCloudSDK();
        //初始化腾讯IMSDK
        TXLiveUtils.getInstance().initIMSDK();

工具类代码:(核心干货)

/**
 * @Description: 腾讯云直播工具
 * @author: zhangshihao
 * @date: 2019/12/6
 */
public class TXLiveUtils {

    private static final String TAG = TXLiveUtils.class.getSimpleName();

    private static TXLiveUtils instance;
    private Context mContext;
    private TXLivePusher txLivePusher;
    private TXLivePushConfig txLivePushConfig;
    private ITXLivePushListener itxLivePushListener;
    private TIMManager timManager;
    private String groupId;
    private String liveId;
    public static final int INVOKE_START_LIVE_FAILED = 100;//开始直播接口调用失败
    public static final int SCREEN_RECORD_OPEN_FAILED = 101;//录屏开启失败
    private long startTimestramp;//开播时间

    public TXLiveUtils(Context context) {
        this.mContext = context.getApplicationContext();
        txLivePusher = new TXLivePusher(mContext);
        txLivePushConfig = new TXLivePushConfig();
    }

    /**
     * Application中调用 !* 不调用后续使用该工具类会报错 *!
     *
     * @param context
     */
    public static void createInstance(Context context) {
        if (instance == null) {
            instance = new TXLiveUtils(context);
        }
    }

    public static TXLiveUtils getInstance() {
        return instance;
    }

    //初始化腾讯视频云sdk
    public void initCloudSDK() {
        TXLiveBase.getInstance().setLicence(mContext, Constant.LICENCE_URL, Constant.LICENCE_KEY);
    }

    /**
     * 初始化IM SDK
     * 初始化监听
     * 初始化用户基础配置
     */
    public void initIMSDK() {
        timManager = TIMManager.getInstance();
        //初始化 IM SDK 基本配置
        //判断是否是在主线程
        if (SessionWrapper.isMainProcess(mContext.getApplicationContext())) {
            TIMSdkConfig config = new TIMSdkConfig(Integer.parseInt(Constant.TENCENT_CLOUD_LIVE_SDK_APPID))
                .enableLogPrint(true)
                .setLogLevel(TIMLogLevel.DEBUG)
                .setLogPath(Environment.getExternalStorageDirectory().getPath() + "/crash-live/");

            //初始化 SDK
            TIMManager.getInstance().init(mContext.getApplicationContext(), config);
        }
        //初始化用户配置
        //基本用户配置
        TIMUserConfig userConfig = new TIMUserConfig();
        //设置用户状态变更事件监听器
        userConfig.setUserStatusListener(new TIMUserStatusListener() {
                @Override
                public void onForceOffline() {
                    //被其他终端踢下线
                    LogUtil.i(TAG+ "onForceOffline");
                }

                @Override
                public void onUserSigExpired() {
                    //用户签名过期了,需要刷新 userSig 重新登录 IM SDK
                    LogUtil.i(TAG+ "onUserSigExpired");
                }
            })
            //设置连接状态事件监听器
            .setConnectionListener(new TIMConnListener() {
                @Override
                public void onConnected() {
                    LogUtil.i(TAG+ "onConnected");
                }

                @Override
                public void onDisconnected(int code, String desc) {
                    LogUtil.i(TAG+ "onDisconnected");
                }

                @Override
                public void onWifiNeedAuth(String name) {
                    LogUtil.i(TAG+ "onWifiNeedAuth");
                }
            })
            //设置群组事件监听器
            .setGroupEventListener(new TIMGroupEventListener() {
                @Override
                public void onGroupTipsEvent(TIMGroupTipsElem elem) {
                    LogUtil.i(TAG+ "onGroupTipsEvent, type: " + elem.getTipsType());
                }
            })
            //设置会话刷新监听器
            .setRefreshListener(new TIMRefreshListener() {
                @Override
                public void onRefresh() {
                    LogUtil.i(TAG+ "onRefresh");
                }

                @Override
                public void onRefreshConversation(List<TIMConversation> conversations) {
                    LogUtil.i(TAG+ "onRefreshConversation, conversation size: " + conversations.size());
                }
            });

        //禁用本地所有存储
        userConfig.disableStorage();
        //开启消息已读回执
        userConfig.enableReadReceipt(true);
        //将用户配置与通讯管理器进行绑定
        TIMManager.getInstance().setUserConfig(userConfig);
    }

    /**
     * 获取IM个人的conversation
     */
    public TIMConversation getPeerConversation(String peer) {
        return TIMManager.getInstance().getConversation(
            TIMConversationType.C2C,    //会话类型:单聊
            peer);                      //会话对方用户帐号//对方ID
    }

    /**
     * 获取IM群聊的Conversation
     */
    public TIMConversation getGroupConversation(String groupId) {
        //获取群聊会话
        return TIMManager.getInstance().getConversation(
            TIMConversationType.Group,      //会话类型:群组
            groupId);                       //群组 ID;
    }

    /**
     * 发送文本消息
     */
    public void sendTextMsg(TIMConversation conversation,String textContent) {
        //构造一条消息
        TIMMessage msg = new TIMMessage();

        //添加文本内容
        TIMTextElem elem = new TIMTextElem();
        elem.setText(textContent);

        //将elem添加到消息
        if (msg.addElement(elem) != 0) {
            LogUtil.d(TAG + "addElement failed");
            return;
        }

        //发送消息
        conversation.sendMessage(msg, new TIMValueCallBack<TIMMessage>() {//发送消息回调
            @Override
            public void onError(int code, String desc) {//发送消息失败
                //错误码 code 和错误描述 desc,可用于定位请求失败原因
                //错误码 code 含义请参见错误码表
                LogUtil.e(TAG + "send message failed. code: " + code + " errmsg: " + desc);
            }

            @Override
            public void onSuccess(TIMMessage msg) {//发送消息成功
                LogUtil.d(TAG + "SendMsg ok : content = "+textContent);
            }
        });
    }

    /**
     * 创建IM聊天群
     */
    public String createChatGroup(){
        if(TextUtils.isEmpty(groupId)){
            LogUtil.e(TAG+" groupId is empty");
            return "";
        }
        LogUtil.i(TAG+" createChatGroup : groupid = "+groupId);
        //创建公开群,且不自定义群 ID
        TIMGroupManager.CreateGroupParam param = new TIMGroupManager.CreateGroupParam("Public", groupId);
        //自定义群id
        param.setGroupId(groupId);
        //指定群简介
        param.setIntroduction("直播互动群"+SharedPreferencesUtil.getIntDate(Constant.SPKEY_USERID));
        //指定群公告
        param.setNotification("欢迎加入直播互动群"+SharedPreferencesUtil.getIntDate(Consta
  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JesseAndroid

每一份支持都是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值