Android快速集成融云

自己闲暇没事就想搞搞即使通讯,选了融云去集成一下,操作不是很难,一起来看一下。
首先了解一下融云的组成库都有那些:
1、IMKit 集成了会话界面,并且提供了丰富的自定义功能,我们推荐首次接触融云的客户直接使用 IMKit 来快速集成和开发。
2、IMLib 提供了基础的通信能力,较轻量,适用于对 UI 有较高订制需求的开发者,但您需要自己去实现大量的界面和功能。
3、CallKit 融云音视频通话的界面组件,包含了单人、多人音视频通话的界面的各种场景和功能。您可以通过集成该组件来实现丰富的音视频通话界面,并进行自己的 UI 定制开发。同时我们开源了 CallKit,您可以根据您的需要去使用。
4、CallLib 融云音视频通话核心能力组件。
5、LocationLib 位置相关库文件
6、PushLib 融云支持第三方推送(小米),您可以从这里下载对应的第三方推送 jar 包。
7、RedPacket 融云红包相关组件,通过集成该组件,即可快速实现红包功能。
自己测试demo只集成了IMLib 和IMKit 两个库,完成基本的单聊与群聊。需要其他功能的请按官方文档集成。

  • 第一步 注册开发者账号,创建应用。(拿到App Key)


    1.png
  • 第二步 下载 SDK
    下载地址 http://www.rongcloud.cn/downloads

  • 第三步 将model导入工程

  1. IMLib 是基础包必须导入,同样的方式导入IMKit 包(两个包缺一不可,别忘记让app依赖这两个model)
  2. 将 PushLib 中的 jar 包 和 pushDaemon -> libs 目录下应用所支持平台的 so 拷贝到您应用的 libs 目录下,另外还需要将 pushDaemon -> executable 目录下各平台的可执行文件 push_daemon 拷贝到您应用 Module 的 assets 目录下。如图:


    2.png
  3. 注意 : 放置 so 的文件夹位置需要和您 build.gradle 文件中配置的 jni 目录一致。


    3.png
  4. 打开 IMLib Module 的 AndroidManifest.xml 文件,把 meta-data RONG_CLOUD_APP_KEY 的值修改为您自己的 AppKey. 如图:


    4.png
  5. 在应用的 App Module 的 AndroidManifest.xml 文件中,添加 FileProvider 相关配置,修改 android:authorities 为 “您的应用的包名称.FileProvider”。


    5.png
  6. 到此集成完毕,IMKit 集成方式跟IMLib一样(必须集成)
  • 第四步 初始化
  1. 在 application 中调用 RongIM.init(this);
public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //初始化融云
        RongIM.init(this);
    }
}

运行程序可能会出现错误 ”初始化 RongIM.init(this) 时报错 Failed resolution of: Lio/rong/push/PushService”
解决办法: http://support.rongcloud.cn/kb/NjY5](http://support.rongcloud.cn/kb/NjY5)

  1. 获取Token
    可以在融云官网获取 Touken 如图:


    6.png

    7.png
  2. 在 activity 中连接融云,RongIM.connect(token,callback)操作。
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // token 就是你刚刚获取的token
        RongIM.connect(token, new RongIMClient.ConnectCallback() {
            //token1参数报错
            @Override
            public void onTokenIncorrect() {
                Log.e("TAG","参数错误");
                Toast.makeText(MainActivity.this, "token1参数报错", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onSuccess(String s) {
                Log.e("TAG","成功");
                // 连接成功,说明你已成功连接到融云Server
                Toast.makeText(MainActivity.this, "连接成功 ", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(RongIMClient.ErrorCode errorCode) {
                Log.e("TAG","失败");
                Toast.makeText(MainActivity.this, errorCode.getValue()+"", Toast.LENGTH_SHORT).show();
            }
        });

  • 第五步 集成单聊
    1、配置会话列表
    配置布局文件
    这是您的会话列表 Activity 对应的布局文件:conversationlist.xml。注意 android:name 固定为融云的 ConversationListFragment。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/conversationlist"
        android:name="io.rong.imkit.fragment.ConversationListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

新建Activity

public class ConversationListActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.conversationlist);
    }
  }

配置 intent-filter:
融云 SDK 是通过隐式调用的方式来实现界面跳转的。因此您需要在 AndroidManifest.xml 中,您的会话列表 Activity 下面配置 intent-filter,其中,android:host 是您应用的包名,需要手动修改,其他请保持不变。

<!--会话列表-->
<activity
    android:name="io.rong.fast.activity.ConversationListActivity"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateHidden|adjustResize">

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />

        <data
            android:host="io.rong.fast"
            android:pathPrefix="/conversationlist"
            android:scheme="rong" />
    </intent-filter>
</activity>

2、配置会话界面
会话 Fragment 跟会话列表是完全一致的,您可以用同样的方式快速的配置好。

配置布局文件
这是您的会话列表 Activity 对应的布局文件:conversationlist.xml。注意 android:name 固定为融云的 ConversationListFragment。

<?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"
    android:orientation="vertical">

    <fragment
        android:id="@+id/conversation"
        android:name="io.rong.imkit.fragment.ConversationFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

新建Activity

public class ConversationActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.conversation);
    }

}

配置 intent-filter:
在 AndroidManifest.xml 中,会话 Activity 下面配置 intent-filter。 注意请修改 android:host 为您应用的包名,其他保持不变。

<!--会话界面-->
 <activity
     android:name="io.rong.fast.activity.ConversationActivity"
     android:screenOrientation="portrait"
     android:windowSoftInputMode="stateHidden|adjustResize">

     <intent-filter>
         <action android:name="android.intent.action.VIEW" />

         <category android:name="android.intent.category.DEFAULT" />

         <data
             android:host="io.rong.fast"
             android:pathPrefix="/conversation/"
             android:scheme="rong" />
     </intent-filter>
 </activity>

配置两个界面后就可以进行聊天了。

  1. 填写代码
//启动会话界面
 findViewById(R.id.btn_chat_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                connectRongServer(token1);
                //启动会话界面
                if (RongIM.getInstance() != null)
                    RongIM.getInstance().startPrivateChat(MainActivity.this, "18673668975", "贝吉塔");
            }
        });
  //启动会话列表
  findViewById(R.id.btn_chatlist_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                connectRongServer(token1);
                //启动会话列表
                startActivity(new Intent(MainActivity.this, HomeActivity.class));
            }
        });
   //创建群聊
  findViewById(R.id.btn_createGroup_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                connectRongServer(token1);
                //创建群聊
                final List<String> testList = new ArrayList<String>();
                testList.add("18673668975");
                testList.add("18673668976");
                testList.add("18673668977");
                RongIM.getInstance().createDiscussion("123", testList, new RongIMClient.CreateDiscussionCallback() {
                        @Override
                        public void onSuccess(String s) {
                            // s 表示的是群组ID
                            Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
                            ed = (EditText) findViewById(R.id.ed_id_main);
                            ed.setText(s);
                            roomId=s;


                        }
                        @Override
                        public void onError(RongIMClient.ErrorCode errorCode) {
                            //  Toast.makeText(MainActivity.this,errorCode.getValue()+"",Toast.LENGTH_SHORT).show();
                        }
                    });
                
            }
        });
  //进入群聊
        findViewById(R.id.btn_joingroup_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
          
                RongIM.getInstance().startDiscussionChat(MainActivity.this,群组ID,"123");
            }
        });
  //添加讨论组成员
        findViewById(R.id.btn_addgroup_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                connectRongServer(token1);
                final ArrayList<String> userIds = new ArrayList<String>();
                userIds.add("10");//增加 userId。
                RongIM.getInstance().addMemberToDiscussion(roomId, userIds, new RongIMClient.OperationCallback() {
                    @Override
                    public void onSuccess() {
                        Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(RongIMClient.ErrorCode errorCode) {
                        Toast.makeText(MainActivity.this,errorCode.getValue()+"",Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
 //移除讨论组成员
        findViewById(R.id.btn_delgroup_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               
                            RongIM.getInstance().getRongIMClient().removeMemberFromDiscussion("bac45e36-3ef3-45b5-9047-dd25054c27ae", "10", new RongIMClient.OperationCallback() {
                                @Override
                                public void onSuccess() {
                                    Toast.makeText(MainActivity.this, "移除成功", Toast.LENGTH_SHORT).show();
                                }

                                @Override
                                public void onError(RongIMClient.ErrorCode errorCode) {
                                    Toast.makeText(MainActivity.this, errorCode.getValue()+"", Toast.LENGTH_SHORT).show();
                                }
                            });
            }
        });
        //发送消息
        findViewById(R.id.btn_sendmessage_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                
                // 构造 TextMessage 实例
                TextMessage myTextMessage = TextMessage.obtain("发送消息");
                /* 生成 Message 对象。
                * "7127" 为目标 Id。根据不同的 conversationType,可能是用户 Id、讨论组 Id、群组 Id 或聊天室 Id。
                * Conversation.ConversationType.PRIVATE 为私聊会话类型,根据需要,也可以传入其它会话类型,如群组,讨论组等。
                */
                Message myMessage = Message.obtain("18673668975", Conversation.ConversationType.PRIVATE, myTextMessage);

                RongIM.getInstance().sendMessage(myMessage, null, null, new IRongCallback.ISendMessageCallback() {
                    @Override
                    public void onAttached(Message message) {
                        //消息本地数据库存储成功的回调
                        Toast.makeText(MainActivity.this, "本地数据库存储成功", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onSuccess(Message message) {
                        //消息通过网络发送成功的回调
                        Toast.makeText(MainActivity.this, "网络发送成功", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(Message message, RongIMClient.ErrorCode errorCode) {
                        //消息发送失败的回调
                        Toast.makeText(MainActivity.this, "发送失败", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

    }

以上几个方法,自己琢磨一下就能用了,如何集成到项目中你还需要好好考虑一下

我自己就搞了这么多,需要什么自己下个嗨豹研究一下它的代码,我看了一下不算难。

下载地址:
https://github.com/CatEatFishs/RongYunNew

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容