融云即时通讯

            即时通讯是目前最为流行的通讯方式,大多数app都使用到即时通讯,Android开发中,比较火的即时通讯有:融云、环信、Jpush。融云可以实现IM、推送、直播、客服等功能,下面就来讲解一下融云即时通讯的使用以及聊天功能的集成。

   简单介绍下融云:

   官网:http://www.rongcloud.cn/

   融云是国内首家专业的即时通讯云服务提供商,专注为互联网、移动互联网开发者提供免费的即时通讯基础能力和云端服务。通过融云平台,开发者不必搭建服务端硬件环境,就可以将即时通讯、实时网络能力快速集成至应用中。融云 SDK 包括两部分:IM 界面组件(IMKit)和 IM 通讯能力库( IMLib)。

  使用步骤:

一、前期准备:

   1.可以先看安卓SDK集成说明文档:http://www.rongcloud.cn/docs/android.html

   融云即时通讯_第1张图片

   2.下载融云IMSDK(记得注册帐号):http://www.rongcloud.cn/download

   融云即时通讯_第2张图片

       两个SDK的区别:

   融云即时通讯_第3张图片

    3.集成融云SDK的环境要求:

   融云即时通讯_第4张图片

   查看自己编译工具的构建版本:

   融云即时通讯_第5张图片

   查看自己编译工具使用的构建版本:

   融云即时通讯_第6张图片

 

   4.创建一个集成融云SDK的应用:

   融云即时通讯_第7张图片

   得到自己融云应用的key

    融云即时通讯_第8张图片

              手动的创建Token(相当于创建一个用户,这里创建两个用户),方便我们的测试:                     融云即时通讯_第9张图片

    融云即时通讯_第10张图片


二、集成融云sdk并实现聊天

  1.解压下载好的sdk,并进行使用

  融云即时通讯_第11张图片                 

  2.导入 SDK 压缩包中的 IMKit 作为依赖 Module

   融云即时通讯_第12张图片

   3.做好项目依赖以后,对清单文件的修改,到ModuleIMkit中打开清单文件修改RONG_CLOUD_APP_KEY,修改为你自己的key,并将AndroidManifest中所有host改为你依赖项目的包名(此处指你集成融云SDK app的包名)。

  融云即时通讯_第13张图片


  4.在Application中初始化(记得在清单文件注册) 

public class App extends Application {
   @Override
   public void onCreate() {
      super.onCreate();
      //项目一运行,就初始化融云SDK
      RongIM.init(this);
    }
}

  5.在 activity 中建立与融云服务器的连接,RongIM.connect(token,callback)最核心的一段逻辑(在整个应用程序全局application中,只需要调用一次 connect 方法,SDK 会负责自动重连,即使当前网络链接不存在而失败,融云仍然会自动替您重连)以在MainActivity()中做融云的连接操作为例(注意:此处的Token需要换成你自己的 Token,这个Token还需要与RONG_CLOUD_APP_KEY 匹配)

注意,在上线前请确认在connect方法ConnectCallback中通过onTokenIncorrect回调方法实现重新获取Token的逻辑

下面的代码放到MainActivity的Oncreate方法里即可。

String Token = "pCus5wbhCrVtQySGahLk2zkawGWVjeK0G5MCxDFa2kaAlY31thuyQVjM6vEvUsF2ws02NIyQdNuhqb6GEyYyXA==";//test
        /**
         * IMKit SDK调用第二步
         *
         * 建立与服务器的连接
         *
         */
        RongIM.connect(Token, new RongIMClient.ConnectCallback() {
            @Override
            public void onTokenIncorrect() {
                //Connect Token 失效的状态处理,需要重新获取 Token
            }

            @Override
            //连接成功
            public void onSuccess(String userId) {
                Log.e("MainActivity", "——onSuccess—-" + userId);
            }

            @Override
            //连接失败  errorCode错误码
            public void onError(RongIMClient.ErrorCode errorCode) {
                Log.e("MainActivity", "——onError—-" + errorCode);
            }
        });

   6.完成单聊的UI界面,单聊是一个fragment,需创建一个activity中,在布局文件中添加单聊的fragment,并且在 AndroidManifest中添加intent-filter,进行配置。

      1)先创建ConversationActivity

public class ConversationActivity extends ActionBarActivity {
    private static final String TAG = ConversationActivity.class.getSimpleName();
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        //唯一有用的代码,加载一个 layout
        setContentView(R.layout.conversation);
        //继承的是ActionBarActivity,直接调用 自带的 Actionbar,下面是Actionbar 的配置,如果不用可忽略…
        getSupportActionBar().setTitle("聊天");
        getSupportActionBar().setLogo(R.mipmap.ic_launcher);//把它改成我们有的图片
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);//是否在左上角显示图标
        getSupportActionBar().setHomeAsUpIndicator(R.mipmap.ic_launcher);//把它改成我们有的图片
    }
/*   Override
    菜单我们用不到,注释掉.
    public boolean onOptionsItemSelected(MenuItem item) {
       finish();
       return super.onOptionsItemSelected(item);
    }*/
}

         2)创建ConversationActivity的布局文件conversation.xml

 
    

    3)在AndroidManifest注册,注意需修改 host 为自己的包名,其他不需要修改

 

     7.调用开启单聊的逻辑代码,在activity中调用

RongIM.getInstance().startPrivateChat(context,targetUserId,title);
//通过点击按钮,执行聊天的逻辑代码,按钮自定义.核心是里面的方法.
    public void OpenTalk(View view){
      /**
        * 启动单聊,先判断RongIM对象不为null
        * context - 应用上下文。
        * targetUserId - 要与之聊天的用户 Id,也就是上面注册的token(用户)
        * title - 聊天的标题,如果传入空值,则默认显示与之聊天的用户名称。
        */
        if (RongIM.getInstance() != null) {
           RongIM.getInstance().startPrivateChat(MainActivity.this,"110","易大师好帅!");
      }
   }

        8.可以在后台进行测试,填写上面注册的用户
     融云即时通讯_第14张图片
三、显示头像和昵称

在已经集成了融云IMKitsdk,并完成了单人聊天的前提下,再完成显示用户昵称和头像的功能

1.修改ConversationActivity类让它继承 FragmentActivity显示用户的昵称

  public class ConversationActivity extends FragmentActivity {
    private TextView mTextView;
    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.conversation);
        mTextView = (TextView) findViewById(R.id.title);
        mTextView.setText(getIntent().getData().getQueryParameter("title"));
        Log.e("type", "type is:" + getIntent().getData().getPath());
  }
 }

2.修改ConversationActivity的布局文件,在加上一个TextView(以下提供完成的布局文件代码)



    
      

3.创建一个bean数据,类名自定义,这里就起名为Friend,添加三个属性userId,userName,portraitUri创建对应的get,set和构造方法

public class Friend {
    private String userId;
    private String userName;
    private String portraitUri;
    public Friend(String userId, String userName, String portraitUri) {
        this.userId = userId;
        this.userName = userName;
        this.portraitUri = portraitUri;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPortraitUri() {
        return portraitUri;
    }
    public void setPortraitUri(String portraitUri) {
        this.portraitUri = portraitUri;
    }
}

4.在MainActivity的类(也就是要调用聊天功能的Activity)中实现显示用户昵称和头像的核心代码

     1)Activity实现接口RongIM.UserInfoProvider,覆写其必要的方法

          MainActivity implements RongIM.UserInfoProvider 

  2)定义全局私有变量private List userIdList集合对象,在OnCreate的方法里添加元素

userIdList = new ArrayList();
userIdList.add(new Friend("123", "张三","https://10.url.cn/eth/ajNVdqHZLLAxibwnrOxXSzIxA76ichutwMCcOpA45xjiapneMZsib7eY4wUxF6XDmL2FmZEVYsf86iaw/"));
userIdList.add(new Friend("456", "李四","https://10.url.cn/eth/ajNVdqHZLLAxibwnrOxXSzIxA76ichutwMCcOpA45xjiapneMZsib7eY4wUxF6XDmL2FmZEVYsf86iaw/"));

  3)调用加载用户昵称和头像的核心方法:

          RongIM.setUserInfoProvider(this, true);

     参数:1.userInfoProvider - 用户信息提供者 RongIM.UserInfoProvider。

          参数2.isCacheUserInfo - 设置是否由 IMKit 来缓存用户信息,最好将本参数设置为 true,由 IMKit 来缓存用户信息。

     设置用户信息的提供者,供 RongIM 调用获取用户名称和头像信息。 设置后,当 sdk 界面展示用户信息时,会回调 RongIM.UserInfoProvider.getUserInfo(String) 使用者只需要根据对应的 userId 提供对应的用户信息。 如果需要异步从服务器获取用户信息,使用者可以在此方法中发起异步请求,然后返回 null 信息。 在异步请求结果返回后,根据返回的结果调用 refreshUserInfoCache(UserInfo) 刷新用户信息。

  4)在会自动回调的getUserInfo完成上传用户数据给融云的逻辑代码

  public UserInfo getUserInfo(String s) {
        //使用for循环从集合中取出数据,提供给融云自动加载用户昵称及头像
        for (Friend i : userIdList) {
            if (i.getUserId().equals(s)) {
                Log.e("LoginActivity", i.getPortraitUri());
                return new UserInfo(i.getUserId(),i.getUserName(), Uri.parse(i.getPortraitUri()));
             }
        }
        Log.e("MainActivity","UserId is :" +s );
        return null;
     }

5.刷新用户信息头像(可以在点击事件里执行该逻辑,效果看起来更加明显)

//获取 IMKit RongIM 实例对象,需在执行 init 方法初始化 SDK 后获取,否则会返回值NULL。
     RongIM instance = RongIM.getInstance();
        instance.refreshUserInfoCache(new UserInfo("123", "张三",Uri.parse
        ("http://img5.imgtn.bdimg.com/it/u=1518359788,384768247&fm=21&gp=0.jpg")));
        

              效果图(图示之前截的,昵称可能不对):

                             融云即时通讯_第15张图片

 













 
 


 

你可能感兴趣的:(融云即时通讯)