Skip to content

debugspy/IMTUIkit_android

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 

Repository files navigation

简介

  • 腾讯云TUIKit

TUIKit是基于腾讯云IMSDK的一款UI组件库,里面提供了一些通用的UI组件,开发者可通过该组件库选取自己所需要的组件快速的搭建一个IM应用。

IM软件都具备一些通用的UI界面,如会话列表,聊天界面等。TUIKit提供了这一类的组件,并提供了灵活的UI和交互扩展接口,方便用户做个性化开发。

  • IMSDK与TUIKit的结合

腾讯云IMSDK提供了IM通信所需的各种基础能力,如通信网络,消息收发、存储,好友关系链,用户资料等。 TUIKit中的组件在实现UI功能的同时调用IMSDK相应的接口实现了IM相关逻辑和数据的处理,因而开发者在使用TUKit时只需关注自身业务或做一些个性化的扩展即可。

下面我们将指导您如何快速的接入和使用TUIKit。

账号相关的基本概念

这里我们先来了解账号相关的几个概念。

  • 用户标识(userId): userId(用户标识)用于在一个IM应用中唯一标识一个用户,即我们通常所说的账号。这个一般由开发者自己的服务生成,即用户信息的生成(注册)需由开发者实现。

  • 用户签名(userSig): userSig(用户签名)是用于对一个用户进行鉴权认证,确认用户是否真实的。即用户在开发者的服务里注册一个账号后,开发者的服务需要给该账号配置一个由usersig,后续用户登录IM的时候需要带上usersig让IM服务器进行校验。用户签名生成方法可参考 生成签名 文档。

了解了前面的概念后,说明一下集成了IMSDK应用的注册/登录流程,可以用下面一张图来说明。

首先用户的终端需要向您的服务器注册账号(userid),您的服务器在进行注册业务处理时,按照用户签名文档中的方法生成一个该用户的usersig,并返回给客户端。客户端再通过该userid和usersig到IMSDK进行登录操作。

为方便开发者接入开发测试,我们在腾讯云控制台提供了快速生成usersig的工具(在这之前你需要先在腾讯云创建自己的IM应用,可参考云通信 IM 入门)。登录控制台后选择——云通信——应用列表(选择您当前在使用的应用)——应用配置——开发辅助工具,参考上面说明即可生成usersig。

集成TUIKit

首先开发者需在自身主工程的build.grale文件的依赖配置中添加TUIKit的引用 及 ABI 架构限定。

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a' //目前仅提供armeabi-v7a的so库
        }
    }
}

dependencies {
    ...
    implementation 'com.tencent.imsdk:tuikit:0.0.1.198'
}

TUIKit会自动加载所需的IMSDK。目前加载的IMSDK版本是V3.5.0.198。

初始化TUIKit

通常情况下TUIKit的初始化非常简单,只需调用下面接口初始化默认配置即可。

/**
 * TUIKit的初始化函数
 *
 * @param context  应用的上下文,一般为对应应用的ApplicationContext
 * @param sdkAppID 您在腾讯云注册应用时分配的sdkAppID
 * @param configs  TUIKit的相关配置项,一般使用默认即可,需特殊配置参考API文档
 */
TUIKit.init(context,sdkAppId, BaseUIKitConfigs.getDefaultConfigs());

建议TUIKit的初始化在Application的OnCreate方法中调用(或应用其它初始化相关函数里)。TUIKit初始化已自行完成IMSDK的初始化相关工作。如果您需对IMSDK和TUIKit的初始化做自定义配置,可以参考高级进阶-IMSDK的初始化扩展高级进阶-TUIKit的初始化扩展

登录

用户首先要完成自己的登录逻辑,在登录成功拿到您服务器派发的userSig后。你还需要在客户端代码里调用IMSDK的login,将userSig参数传入。

调用IMSDK的login可参考下面的代码。

    /**
     * 在收到服务器颁发的userSig后 调用IMSDK的login接口
     * userId 用户账号
     * userSig 您服务器给这个用户账号颁发的IMSDk鉴权认证
     */
    private void onRecvUserSig(String userId,String userSig) {
          TUIKit.login(userId, userSig, new IUIKitCallBack() {
            @Override
            public void onSuccess(Object data) {
                /**
                 * IM登录成功后的回调操作,一般为跳转到应用的主页(这里的主页内容为下面章节的会话列表)
                 */
                Intent intent = new Intent(MyLoginActivity.this, MainActivity.class);
                startActivity(intent);
            }
            @Override
              public void onError(String module, int errCode, String errMsg) {
                Log.e("imlogin fail", errMsg);
            }
        });
    }
}

会话列表(SessionPanel)

一个聊天的发起可以理解成一个会话,IMSDK 中会话分为两种:

  1. C2C会话:表示单聊情况下自己与对方建立的对话,读取消息和发送消息都是通过会话完成。

  2. 群会话:表示群聊情况下,群内成员组成的会话,群会话内发送消息群成员都可接收到。

会话列表用来展示用户的所有会话记录。SessionPanel是TUIKit提供的和IMSDK业务关联,且UI交互可扩展的会话列表面板。您调用initDefault()即可实现SessionPanel的通用的交互功能。SessionPanel内部已与IMSDK关联,实现了会话记录的拉取和更新,您可无需关注。

  • 使用方法:

1、在Activity或Fragment(Demo示例为创建一个Fragment,即下面代码的SessionFragment)的布局文件里引用SessionPanel

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >

    <com.tencent.qcloud.uikit.business.session.view.SessionPanel
        android:id="@+id/session_panel"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

2、添加完SessionPanel后,需对SessionPanel进行初始化操作。

public class SessionFragment extends BaseFragment {

    private View baseView;
    private SessionPanel sessionPanel;
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        baseView = inflater.inflate(R.layout.fragment_session, container, false);
        initView();
        return baseView;
    }

    private void initView() {
        // 获取会话列表组件,
        sessionPanel = baseView.findViewById(R.id.session_panel);
        // 会话面板初始化默认功能
        sessionPanel.initDefault();
        // 这里设置会话列表点击的跳转逻辑,告诉添加完SessionPanel后会话被点击后该如何处理
        sessionPanel.setSessionClick(new SessionClickListener() {
            @Override
            public void onSessionClick(SessionInfo session) {
                //此处为demo的实现逻辑,更根据会话类型跳转到相关界面,开发者可根据自己的应用场景灵活实现
                if (session.isGroup()) {
                    //如果是群组,跳转到群聊界面
                    ChatActivity.startGroupChat(getActivity(), session.getPeer());
                } 
                else {
                    //否则跳转到C2C单聊界面
                    ChatActivity.startC2CChat(getActivity(), session.getPeer());
            
                }
            }
        });

    }
}

3、SessionPanel提供了UI及交互的扩展功能,可参考高级进阶-会话面板UI扩展

聊天面板

在会话列表里点击会话条目后应跳转到相应的聊天界面。聊天界面是一个非常复杂的交互,所以TUIKit为您提供了聊天面板供您直接使用。聊天面板分为C2C单聊面板和群聊面板,分别对应单聊和群聊的使用场景。

C2C单聊面板

群聊面板

群聊内嵌的群管理面板

  • 单聊面板(C2CChatPanel)使用:

1、在Activity或Fragment(Demo示例为创建一个Fragment,即下面代码的PersonalChatFragment)的布局文件里引用C2CChatPanel

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.tencent.qcloud.uikit.business.chat.c2c.view.C2CChatPanel
        android:id="@+id/chat_panel"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

2、添加完C2CChatPanel后,需对C2CChatPanel进行初始化操作。

public class PersonalChatFragment extends BaseFragment {
    private View mBaseView;
    private C2CChatPanel chatPanel;
    private String chatId;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        mBaseView = inflater.inflate(R.layout.chat_fragment_personal, container, false);
        Bundle datas = getArguments();
        chatId = datas.getString(Constants.INTENT_DATA);
        initView();
        return mBaseView;
    }

    private void initView() {
        //从布局文件中获取聊天面板组件
        chatPanel = mBaseView.findViewById(R.id.chat_panel);
        //单聊组件的默认UI和交互初始化
        chatPanel.initDefault();
        /*
         * 需要指定会话ID(即聊天对象的identify,具体可参考IMSDK接入文档)来加载聊天消息。在上一章节SessionClickListener中回调函数的参数SessionInfo对象中持有每一会话的会话ID,所以在会话列表点击时都可传入会话ID。
        * 特殊的如果用户应用不具备类似会话列表相关的组件,则需自行实现逻辑获取会话ID传入。
        */
        chatPanel.setBaseChatId(chatId);
    }
}

3、聊天面板组件提供的可扩展的事件和UI处理,具体可参考高级进阶—聊天面板UI扩展

  • 群聊面板(GroupChatPanel)使用:

群聊面板与单聊面板的使用基本一致,在Activity或Fragment(Demo示例为创建一个Fragment,即下面代码的GroupChatFragment)的布局文件里引用GroupChatPanel

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>
    <com.tencent.qcloud.uikit.business.chat.group.view.GroupChatPanel
        android:id="@+id/chat_panel"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

添加完GroupChatPanel后,需对GroupChatPanel进行初始化操作。

public class GroupChatFragment extends BaseFragment {
    private View mBaseView;
    private GroupChatPanel chatPanel;
    private String groupChatId;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        mBaseView = inflater.inflate(R.layout.chat_fragment_group, container, false);
        Bundle datas = getArguments();
        //由会话列表传入的群组ID
        groupChatId = datas.getString(Constants.INTENT_DATA);
        initView();
        return mBaseView;
    }

    private void initView() {
        //从布局文件中获取聊天面板组件
        chatPanel = mBaseView.findViewById(R.id.chat_panel);
        //单聊组件的默认UI和交互初始化
        chatPanel.initDefault();
        /*
         * GroupChatPanel在初始化完成后需要入会话ID(即群组ID,具体可参考IMSDK接入文档)来加载聊天消息。在上一章节SessionClickListener中回调函数的参数SessionInfo对象中持有每一会话的会话ID,如果是群会话则为群组ID,所以在会话列表点击时都可传入会话ID。

        * 特殊的如果用户应用不具备类似会话列表相关的组件,则在使用群聊面板时需自行实现逻辑获取群组ID传入。
        */
        chatPanel.setBaseChatId(groupChatId);
       
    }

3、同样的,群聊面板组件也提供了可扩展的事件和UI处理,具体可参考高级进阶—聊天面板UI扩展

高级进阶

前面介绍了TUIKit一些基本的使用流程,大多数情况下开发者使用默认配置即可完成相关业务的实现。

此外TUIKit也提供了丰富的组件和扩展功能,供开发着实现自己在相关功能及UI交互上的特殊需求。

  • IMSDK的版本指定

目前TUIKit所依赖的IMSDK版本为V3.5.0.133。后续TUIKit将支持更多版本的腾讯云IMSDK,届时将在文档里说明如何指定TUIKit所依赖的IMSDK版本。敬请期待。

  • 和已有的IM SDK相结合

目前TUIKit初始化已经内部实现了IMSDK的初始化(详细的IMSDK初始化可参考 IMSDK初始化),并注册了IM相关的事件监听和回调。

如果您是在已使用IMSDK的应用中新用到TUIKit,亦或是需要在对IMSDK某些回调做定制化处理,则需实现IMEventListener,并通过BaseUIKitConfigs.setIMEventListener()将自定义的回调设置给IMSDK。

注:如果您已有的项目中有IMSDK的初始化或事件注册代码,需废弃掉,使用TUIKit的初始化和IM事件注册。 如下面事件注册相关的老代码

//原有的初始化代码
TIMSdkConfig config = new TIMSdkConfig(Constants.SDKAPPID).setLogLevel(TIMLogLevel.DEBUG);
TIMManager.getInstance().init(getApplicationContext(), config);

//应替换成(BaseUIKitConfigs的配置请看后面章节)
TUIKit.init(this, Constants.SDKAPPID, BaseUIKitConfigs.getDefaultConfigs().setTIMSdkConfig(config));
       
//原有的事件监听相关代码
TIMManager.getInstance().setOfflinePushListener(***);
TIMUserConfig userConfig = new TIMUserConfig(***);
userConfig.setUserStatusListener(***);
userConfig.setConnectionListener(***)

//替换成IMEventListener,在替换成IMEventListener实现相关事件回调处理
TUIKit.getBaseConfigs().setIMEventListener(new IMEventListener(){***})

IMEventListener是一个TUIKit封装的IM事件缺省的类,你只需实现自己需要使用的回调接口即可。

public abstract class IMEventListener {
    private final static String TAG = IMEventListener.class.getSimpleName();

    /**
     * 被踢下线时回调
     */
    public void onForceOffline(){
        QLog.d(TAG, "recv onForceOffline");
    }

    /**
     * 用户票据过期
     */
    public void onUserSigExpired(){
        QLog.d(TAG, "recv onUserSigExpired");
    }

    /**
     * 连接建立
     */
    public void onConnected(){
        QLog.d(TAG, "recv onConnected");
    }

    /**
     * 连接断开
     *
     * @param code 错误码
     * @param desc 错误描述
     */
    public void onDisconnected(int code, String desc){
        QLog.d(TAG, "recv onDisconnected, code " + code + "|desc " + desc);
    }

    /**
     * WIFI需要验证
     *
     * @param name wifi名称
     */
    public void onWifiNeedAuth(String name){
        QLog.d(TAG, "recv onWifiNeedAuth, wifi name " + name);
    }

    /**
     * 部分会话刷新(包括多终端已读上报同步)
     * @param conversations 需要刷新的会话列表
     */
    public void onRefreshConversation(List<TIMConversation> conversations){
        QLog.d(TAG, "recv onRefreshConversation, size " + (conversations != null ? conversations.size() : 0));
    }

    /**
     * 收到新消息回调
     * @param msgs 收到的新消息
     */
    void onNewMessages(List<TIMMessage> msgs){
        QLog.d(TAG, "recv onNewMessages, size " + (msgs != null ? msgs.size() : 0));
    }

    /**
     * 群Tips事件通知回调
     *
     * @param elem 群tips消息
     */
    void onGroupTipsEvent(TIMGroupTipsElem elem){
        QLog.d(TAG, "recv onGroupTipsEvent, groupid: "+ elem.getGroupId() + "|type: " + elem.getTipsType());
    }
}
  • TUIKit的初始化配置

目前TUIKit初始化提供了一个配置类BaseUIKitConfigs,开发者可对下面的配置项进行配置。

配置项 描述 类型
setAppCacheDir 配置 APP 保存图片/语音/文件/log等数据缓存的目录;默认为/sdcard/{packageName} String
setInputTextMaxLength 文本消息最大输入字符数目 int
setAudioRecordMaxTime 语音消息的最大时长 int
setVideoRecordMaxTime 视频消息的摄像时长 int
setFaceConfigs 自定义表情配置 ArrayList
setTIMSdkConfig 自定义TIMSdkConfig(可参考IMSDK初始化) TIMSdkConfig

配置类本身为建造者模式,可以一行代码完成配置

BaseUIKitConfigs.getDefaultConfigs().setAppCacheDir("xxxxx").setAudioRecordMaxTime(60).setMaxInputTextLength(120)...
  • 会话列表面板(SessionPanel)UI扩展

SessionPanel对外暴露了相关的子组件,开发者可自行对其进行相关UI的 修改。

组件名称 描述 类型
mTitleBar 一般用来控制组件的跳转和标题栏的点击,开发者可自行修改和控制,详见通用标题栏

会话面板的标题栏默认实现了右边菜单栏的点击
PageTitleBar
mSessionList 会话列表ListView SessionListView
mSessionPopList 会话Item长按弹框List ListView
mPopMenuList 标题栏右边点击弹框List ListView

除对外开放的UI子组件外,SessionPanel实现了ISessionPanel接口,该接口的将一些常用的定制化处理函数抽离处理。开发者可通过ISessionPanel教直观的操作SessionPanel。

public interface ISessionPanel {

    /**
     * 设置会话面板的Listview的适配器,若用户想完全开发一套自己UI风格的会话列表,实现一个基于ISessionAdapter的适配器即可
     *
     * @param adapter
     */
    void setSessionAdapter(ISessionAdapter adapter);


    /**
     * 设置会话列表点击回调事件,控制会话点击时的界面跳转
     *
     * @param clickListener
     */
    void setSessionClick(SessionClickListener clickListener);


    /**
     * 设置更多弹框的Action,开发者可调用该接口修改默认的更多弹框操作
     *
     * @param actions PopMenuAction集合
     * @param isAdd   是否为添加,ture为在默认的弹框集合上添加新的item,false再替换默认的
     */
    public void setMorePopActions(List<PopMenuAction> actions, boolean isAdd);


    /**
     * 设置会话长按弹框的Action,开发者可调用该接口修改默认的会话长按操作
     *
     * @param actions PopMenuAction集合
     * @param isAdd   是否为添加,ture为在默认的弹框集合上添加新的item,false再替换默认的
     */
    public void setSessionPopActions(List<PopMenuAction> actions, boolean isAdd);

    /**
     * 设置会话列表其它事件(除单击事件外)监听器,不设置则用默认实现
     *
     * @param {SessionListEvent} event
     */
    public void setSessionListEvent(SessionListEvent event);


    /**
     * 依据数据源强行刷新会话面板界面
     */
    void refresh();

    /**
     * 开放会话头像编辑功能,开发者可在头像的布局里添加元素(如添加挂件,头衔等)
     *
     * @param dynamicIconView
     */
    void setSessionIconInvoke(DynamicSessionIconView dynamicIconView);

    /**
     * SessionPanel的默认初始化设置,会初始化弹框,长按事件等
     */
    void initDefault();


}
  • 聊天面板(ChatPanel)UI扩展SessionPanel

单聊C2CChatPanel,群聊GroupChatPanel都继承自ChatPanel。针对业务的差异性,组件内的相关逻辑和交互也所有区别。TUIKit内部已经处理了相关差异性。开发者可无需关注。

C2CChatPanel和GroupChatPanel对外暴露了相关的子组件是一致的,开发者可自行对相关UI进行修改。

组件名称 描述 类型
mTitleBar 一般用来控制组件的跳转和标题栏的点击,开发者可自行修改和控制,详见通用标题栏

聊天面板的标题栏默认实现了左边返回按钮点击(群聊面板实现了边群信息Icon点击的跳转)
PageTitleBar
mChatList 消息面板List ChatListView
mInputGroup 聊天面板底部输入控件 ChatBottomInputGroup
mItemPopMenuList 消息长按弹框List ListView

除对外开放的UI子组件外,ChatPanel实现了IChatPanel接口,该接口的将聊天面板常用的一些UI相关的处理封装成API。开发者可通过IChatPanel较直观高效的操作ChatPanel。

public interface IChatPanel {

    /**
     * 设置当前的会话ID,会话面板会依据该ID加载会话所需的相关信息,如消息记录,用户(群)信息等
     *
     * @param chatId
     */
    void setBaseChatId(String chatId);

    /**
     * 设置聊天面板的消息适配器,若开发者想完全替换TUIKit的消息风格,自行开发一个实现了IChatAdapter的适配器,通过该函数设置即可
     *
     * @param adapter
     */
    void setChatAdapter(IChatAdapter adapter);

    /**
     * 设置聊天列表的事件监听器
     *
     * @param event
     */
    void setChatListEvent(ChatListEvent event);

    /**
     * 设置底部更多消息操作集合,如图片消息操作,摄像消息操作等,开发者可定制化
     *
     * @param units 消息操作集合
     * @param isAdd 是否为添加,true为在默认实现后添加,false为覆盖
     */
    void setMoreOperaUnits(List<MessageOperaUnit> units, boolean isAdd);


    /**
     * 设置长按消息时弹框列表
     *
     * @param actions 弹框事件集合
     * @param isAdd   是否为添加,true为添加事件,false为覆盖组件以定义事件
     */
    void setMessagePopActions(List<PopMenuAction> actions, boolean isAdd);

    /**
     * 依据当前的聊天数据主动刷新聊天界面
     */
    void refreshData();


    /**
     * 退出聊天时的回调
     */
    void exitChat();

    /**
     * 使用初始化配置(即使用UIKIT sdk中聊天面板的默认配置)
     */
    void initDefault();
}
  • 通用标题栏PageTitleBar

一般的界面都有一个标题栏,如上图中的标红区域,包含返回点击按钮,标题,右边跳转按钮等,TUIKit提供了一个内部通用的标题栏(SessionPanel,ChatPanel都有集成该组件),开发者可根据自己的使用场景做定制修改,包括文案、图标修改、跳转控制等。

组件名称 描述 类型
mLeftGroup 左边区域,一般用来设置点击事件(如mLeftGroup.setOnClickListener(...)) LinearLayout
mRightGroup 右边区域,一般用来设置点击事件(如mRightGroup.setOnClickListener(...) LinearLayout
mLeftTitle 左边标题,如果标题栏左边需要文案,可通过此属性来设置 TextView
mRightTitle 右边标题,如果标题栏右边需要文案,可通过此属性来设置 TextView
mCenterTitle 中间边标题,如果标题栏右边需要文案,可通过此属性来设置 TextView
mLeftIcon 左边icon,如果标题栏左边需要设置自己的icon,可通过此属性来设置 ImageView
mRightIcon 右边icon,如果标题栏右边需要设置自己的icon,可通过此属性来设置 ImageView

快速体验

欢迎扫码体验我们的DEMO,后续会继续完善,敬请期待。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published