一、首先,进入融云官网www.rongcloud.cn,注册一个账号,这个不用说,你们就懂的。
二、进入控制台,新建一个项目,这个不详细讲,可以看一下他们的api,重点是代码部分。
进入新建的应用“简聊”
这样就可以查看APPKey 何APP Secret 其它暂时可以不用看,我们本次的目标只是实现项目的搭建,及获取token,连聊天的界面都不会有的。
下载融云的IMKit 包含聊天UI和聊天核心控件
导入到eclipse 并使工程依赖他
接下来,主要配置好AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.chat.simplechat" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="13" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取机型信息权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 录音 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <application android:name=".SCApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Light" > <activity android:name="com.chat.simplechat.activity.MainActivity" android:label="@string/app_name" > </activity> <activity android:name=".activity.SplashActivity" android:label="@string/app_name" android:theme="@style/Theme.Start" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 必选: SDK 核心功能 --> <!-- 第三方相关,向第三方推送服务请求 token 的服务 --> <service android:name="io.rong.push.core.PushRegistrationService" android:exported="false" > </service> <!-- 处理 push 消息相关的服务 --> <service android:name="io.rong.push.core.MessageHandleService" android:exported="true" > </service> <!-- push服务 --> <service android:name="io.rong.push.PushService" android:exported="false" android:process="io.rong.push" > <!-- push进程,可以改名 --> </service> <!-- push 相关事件接收器 --> <receiver android:name="io.rong.push.PushReceiver" android:process="io.rong.push" > <!-- 此处进程可以改名,名称需要和PushService所在进程统一 --> <!-- 心跳事件 --> <intent-filter> <action android:name="io.rong.push.intent.action.HEART_BEAT" /> </intent-filter> <!-- 网络变动事件 --> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> <!-- 部分用户事件 --> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.USER_PRESENT" /> <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> </intent-filter> </receiver> <!-- 必选: SDK 核心功能 --> <!-- imlib config begin --> <meta-data android:name="RONG_CLOUD_APP_KEY" android:value="pkfcgjstfp8j8" /> <service android:name="io.rong.imlib.ipc.RongService" android:exported="true" android:process=":ipc" /> <service android:name="io.rong.imlib.ReConnectService" /> <receiver android:name="io.rong.imlib.ConnectChangeReceiver" /> <receiver android:name="io.rong.imlib.HeartbeatReceiver" android:process=":ipc" /> <!-- imlib config end --> </application> </manifest>
然后自己继承一个Application ,在里面实现初始化
package com.chat.simplechat;
import org.xutils.x;
import io.rong.imkit.RongIM;
import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.widget.Toast;
public class SCApplication extends Application {
private static Context content;
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
content = getApplicationContext();
/**
* OnCreate 会被多个进程重入,这段保护代码,确保只有您需要使用 RongIM 的进程和 Push 进程执行了 init。
* io.rong.push 为融云 push 进程名称,不可修改。
*/
if (getApplicationInfo().packageName
.equals(getCurProcessName(getApplicationContext()))
|| "io.rong.push"
.equals(getCurProcessName(getApplicationContext()))) {
/**
* IMKit SDK调用第一步 初始化
*/
RongIM.init(this);
}
}
public static Context getObjectContext() {
return content;
}
/**
* 获得当前进程的名字
*
* @param context
* @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;
}
}
然后记得把继承的APPlication的名字配置到AndroidManifest.xml。
到目前,我们已经把项目搭建好了,那么还有很重要的就是获取Token和连接服务器,只把核心代码贴出来,会把源码放在最后,可以下载查看详细代码。
public static RequestParams addHeader(RequestParams params) {
Random r = new Random();
String Nonce = (r.nextInt(10000) + 10000) + "";
String Timestamp = (System.currentTimeMillis() / 1000) + "";
params.addHeader("App-Key", RY_APP_KEY);
params.addHeader("Nonce", Nonce);
params.addHeader("Timestamp", Timestamp);
params.addHeader("Signature",
MD5.encryptToSHA(RY_APP_SECRET + Nonce + Timestamp));
return params;
}
public static void getToken(final String id, final String username) {
RequestParams params = new RequestParams(
"https://api.cn.ronghub.com/user/getToken.json");
addHeader(params);
params.addBodyParameter("userId", id);
params.addBodyParameter("name", username);
x.http().post(params, new CommonCallback<String>() {
@Override
public void onCancelled(CancelledException arg0) {
}
@Override
public void onError(Throwable arg0, boolean arg1) {
EBmessage eb = new EBmessage();
eb.setStatus(false);
eb.setMessage(arg0.toString());
eb.setFrom("getToken");
EventBus.getDefault().post(eb);
}
@Override
public void onFinished() {
}
@Override
public void onSuccess(String s) {
TokenMod mod = new Gson().fromJson(s, TokenMod.class);
Editor editor = getEditor();
editor.putString("username", username);
editor.putString("userpass", mod.getUserId());
editor.putString("token", mod.getToken());
editor.commit();
EBmessage eb = new EBmessage();
eb.setStatus(true);
eb.setMessage(mod.getToken());
eb.setFrom("getToken");
EventBus.getDefault().post(eb);
}
});
}
/**
* 建立与融云服务器的连接
*
* @param token
*/
public static void connect(String token, Context context) {
if (context.getApplicationInfo().packageName.equals(SCApplication
.getCurProcessName(context.getApplicationContext()))) {
/**
* IMKit SDK调用第二步,建立与服务器的连接
*/
RongIM.connect(token, new RongIMClient.ConnectCallback() {
/**
* Token 错误,在线上环境下主要是因为 Token 已经过期,您需要向 App Server 重新请求一个新的
* Token
*/
@Override
public void onTokenIncorrect() {
Log.d("LoginActivity", "--onTokenIncorrect");
}
/**
* 连接融云成功
*
* @param userid
* 当前 token
*/
@Override
public void onSuccess(String userid) {
EBmessage eb = new EBmessage();
eb.setStatus(true);
eb.setMessage("success");
eb.setFrom("connect");
EventBus.getDefault().post(eb);
Log.d("LoginActivity", "--onSuccess" + userid);
}
/**
* 连接融云失败
*
* @param errorCode
* 错误码,可到官网 查看错误码对应的注释
*/
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
Log.d("LoginActivity", "--onError" + errorCode);
}
});
}
}
demo下载地址http://download.youkuaiyun.com/detail/wangyang00700/9623568