http://blog.csdn.net/qq_28759359/article/details/52689948
项目中集成融云IM,能够单聊,离线能够收到消息,有聊天列表。
一我使用的是融云。 IMKit。 到融云官网http://www.rongcloud.cn/申请 APP键,下载IMKit我的下载地址:https://download.csdn.net/download/qq_28759359/9642162
然后在 IMKit的AndroidManifest里配置好了APP键。记得是 IMKit的AndroidManifest,而不是项目的AndroidManifest。
<meta-data android:name="RONG_CLOUD_APP_KEY" android:value="c9kqb3rdkcasj" />
<! -您自己的应用程序Key-->!
后面获取令牌值出错大部分是这里没修改。
二。
把IMKit当模块添加进项目记得配置。
compile project( ':IMKit“ )
三。
进行初始化。
在应用程序中添加
/ ** * OnCreate中会被多个进程重入,这段保护代码,确保只有您需要使用RongIM的进程和推进进程执行了初始化。 * io.rong.push为融云推送进程名称,不可修改。 * /
if(getApplicationInfo().packageName .equals(getCurProcessName(getApplicationContext())) || "io.rong.push" .equals(getCurProcessName(getApplicationContext()))) { /** * IMKit SDK调用第一步 初始化 */ RongIM.init(this); RongIM.setUserInfoProvider(new CustomerUserInfoProvider(), true); }
........
/ ** *获得当前进程的名字 * * @param背景 * @return进程号 * /
public static String getCurProcessName(Context context) { int pid = android.os.Process.myPid(); ActivityManager activityManager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo appProcess : activityManager .getRunningAppProcesses()) { if (appProcess.pid == pid) { return appProcess.processName; } } return null; }
新建CustomerUserInfoProvider类
主要是根据用户ID获取你项目中用户信息。下面是我公司的获取方式,你根据自己项目获取用户信息
public class CustomerUserInfoProvider implements RongIM.UserInfoProvider { private UserInfo uInfo; @Override public UserInfo getUserInfo(String userId) { LinkedHashMap<String, String> params = new LinkedHashMap<>(); params.put("uId", userId); String token = TokenUtils.getInstance().configParams(GlobalValues.USER_INFO + "?", params); params.put("taoken", token); MyOkHttp.postMap(GlobalValues.USER_INFO, "USER_INFO", params, new CommonCallback() { @Override public void onError(Call call, Exception e, int id) { } @Override public void onResponse(String response, int id) { if (!TextUtils.isEmpty(response)) { CommonBean<UserModel> user = JsonUtils.getBean(response, CommonBean.class, UserModel.class); if (user != null && user.isSuccess()) { UserModel model = user.getRows(); String uId = model.getuId() + ""; String uName = model.getuName(); String uPic = model.getuHeadPic(); if (!TextUtils.isEmpty(uPic)) { uInfo = new UserInfo(uId, uName, Uri.parse(GlobalValues.IMG_IP + uPic)); } else { uInfo = new UserInfo(uId, uName, null); } //刷新用户信息 可以刷新会话列表 RongIM.getInstance().refreshUserInfoCache(uInfo); } } } }); return uInfo; } }
在登陆成功时,获取后台传过来的令牌。
connect(user.getuRongYunTonken());
//开启会话
//设置会话界面的功能 InputProvider.ExtendProvider[] ep = { new CameraInputProvider(RongContext.getInstance()), new ImageInputProvider(RongContext.getInstance()), // new LocationInputProvider(RongContext.getInstance()),//地理位置 // new FileInputProvider(RongContext.getInstance())//传输文件 }; //我需要让他在什么会话类型中的 bar 展示 RongIM.resetInputExtensionProvider(Conversation.ConversationType.PRIVATE, ep);
/ ** *建立与融云服务器的连接 * * @param令牌 * /
private void connect(String token) { /** * IMKit SDK调用第二步,建立与服务器的连接 */ RongIM.connect(token, new RongIMClient.ConnectCallback() { /** * Token 错误,在线上环境下主要是因为 Token 已经过期,您需要向 App Server 重新请求一个新的 Token */ @Override public void onTokenIncorrect() { LogUtils.i("--onTokenIncorrect"); } /** * 连接融云成功 * @param userid 当前 token */ @Override public void onSuccess(String userid) { LogUtils.i("--onSuccess" + userid); } /** * 连接融云失败 * @param errorCode 错误码,可到官网 查看错误码对应的注释 */ @Override public void onError(RongIMClient.ErrorCode errorCode) { LogUtils.i("--onError" + errorCode); } }); }
配置完成,接下来使用聊天部分
在活动或者片段中使用
public class ConversationListFragment extends BaseFragment { private LinearLayout conversation_sys_mess; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.conversitionlist_fragment, container, false); io.rong.imkit.fragment.ConversationListFragment fragment = (io.rong.imkit.fragment.ConversationListFragment) getChildFragmentManager().findFragmentById(R.id.conversationlist); Uri uri = Uri.parse("rong://" + getActivity().getApplicationInfo().packageName).buildUpon() .appendPath("conversationlist") .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "false") //设置私聊会话非聚合显示 .appendQueryParameter(Conversation.ConversationType.GROUP.getName(), "true")//设置群组会话聚合显示 .appendQueryParameter(Conversation.ConversationType.DISCUSSION.getName(), "false")//设置讨论组会话非聚合显示 .appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "false")//设置系统会话非聚合显示 .build(); fragment.setUri(uri); return view; }
布局中添加
<fragment android:id="@+id/conversationlist" android:name="io.rong.imkit.fragment.ConversationListFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="@dimen/height_20px" />
OK,可以接收到发送过来的消息了
接下来加上发送消息界面
package com.bhxx.xs_family.activity; /** * 聊天界面 */ import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.bhxx.xs_family.R; import com.bhxx.xs_family.application.App; import com.bhxx.xs_family.utils.ActivityCollector; import com.bhxx.xs_family.utils.LogUtils; import io.rong.imkit.RongIM; import io.rong.imkit.fragment.ConversationFragment; import io.rong.imlib.model.Conversation; import io.rong.imlib.model.UserInfo; public class ConversationActivity extends BasicActivity implements View.OnClickListener { private String mTargetId;//对话对象id private ImageView conversation_back; private TextView conversation_name; // private final static String POWER = Manifest.permission.CAMERA; /** * 会话类型 */ private Conversation.ConversationType mConversationType; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_conversation); conversation_back = (ImageView) findViewById(R.id.conversation_back); conversation_name = (TextView) findViewById(R.id.conversation_name); conversation_back.setOnClickListener(this); ActivityCollector.addActivity(ConversationActivity.this); if (getIntent() != null) { initIntent(getIntent()); } } private void initIntent(Intent intent) { mTargetId = intent.getData().getQueryParameter("targetId"); conversation_name.setText(intent.getData().getQueryParameter("title")); mConversationType = Conversation.ConversationType.valueOf("PRIVATE"); enterFragment(mConversationType,mTargetId); } /** * 加载会话页面 ConversationFragment * * @param mConversationType * 会话类型 * @param mTargetId * 目标 Id */ private void enterFragment(Conversation.ConversationType mConversationType, String mTargetId) { ConversationFragment fragment = (ConversationFragment) getSupportFragmentManager() .findFragmentById(R.id.conversation); Uri uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon().appendPath("conversation") .appendPath(mConversationType.getName().toLowerCase()).appendQueryParameter("targetId", mTargetId) .build(); fragment.setUri(uri); } @Override protected void init() { } @Override protected void click(View view) { } @Override public void onClick(View v) { switch (v.getId()) { case R.id.conversation_back: finish(); break; } } }
配置文件中加上
<activity android:name=".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="com.bhxx.xs_family"//你的包名 android:pathPrefix="/conversation/" android:scheme="rong" /> </intent-filter> </activity>
布局中加上
<fragment android:id="@+id/conversation" android:name="io.rong.imkit.fragment.ConversationFragment" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" />
好,搞定