云Talk(Android)接入指南

注册&下载SDK


前往mta.qq.com,使用QQ号码登陆,进入“应用列表”,点击“新建应用”。填写“应用名称”,选择“所属分类”,勾选“云Talk双向通讯”,

需填写“Android Package Name”和“Android安全码SHA1”。iOS平台,需填写“iOS Bundle identifier”,证书可在此处上传或稍后上传,最后点击完成创建。

注册完成后,请下载最新版本的Android SDK到本地,并解压。

工程配置


以eclipse为开发的IDE为例,将SDK导入到工程的步骤为:

1、创建或打开Android工程(关于如何创建Android工程,请参照开发环境的章节)。

2、将 SDK目录下的libs目录所有文件拷贝到工程的libs(或lib)目录下。

3、选中libs(或lib)目录下的jar包,右键菜单中选择Build Path, 选择Add to Build Path将SDK添加到工程的引用目录中。

4、打开Androidmanifest.xml,添加以下配置(建议参考下载包的Demo修改


<application    <!-- APP项目的其它配置... -->     <!-- 【必须】 receiver广播接收 -->     <!-- 【必须】 信鸽receiver广播接收 -->
        <receiver
            android:name="com.tencent.android.talk.IMCloudReceiver"
            android:process=":tencent_talk" >
            <intent-filter android:priority="0x7fffffff" >

                <!-- 【必须】 信鸽SDK的内部广播 -->
                <action android:name="com.tencent.android.talk.action.SDK" />
                <action android:name="com.tencent.android.talk.action.INTERNAL_PUSH_MESSAGE" />
                <!-- 【必须】 系统广播:开屏和网络切换 -->
                <action android:name="android.intent.action.USER_PRESENT" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>
        <!-- 【必须】 信鸽service -->
        <service
            android:name="com.tencent.android.talk.service.IMCloudService"
            android:exported="true"
            android:persistent="true"
            android:process=":tencent_talk" />

        <!-- 【必须】 通知service,此选项有助于提高抵达率 -->
        <service
            android:name="com.tencent.android.talk.rpc.IMCloudRemoteProcessService"
            android:exported="true" >
            <intent-filter>
                <action android:name="应用包名..PUSH_ACTION" />
                <action android:name="应用包名..IM_PUSH_MESSAGE" />
            </intent-filter>
        </service>

        <!-- 【可选】APP实现的Receiver,用于接收消息透传和操作结果的回调,请根据需要添加 -->
        <!-- YOUR_PACKAGE_PATH.CustomPushReceiver需要改为自己的Receiver: -->
        <receiver android:name="com.qq.imdemo.receiver.MessageReceiver" >
            <intent-filter>

                <!-- 接收消息透传 -->
                <action android:name="com.tencent.android.talk.action.PUSH_MESSAGE" />

                <!-- 接收消息透传 -->
                <action android:name="com.tencent.android.talk.action.IM_PUSH_MESSAGE" />
                <!-- 监听注册、反注册、设置/删除标签、通知被点击等处理结果 -->
                <action android:name="com.tencent.android.talk.action.FEEDBACK" />
            </intent-filter>
        </receiver>

   <!-- 【必须】 请将YOUR_APP_ID修改为APP的AppId,“15”开头的10位数字,中间没空格 -->
   <meta-data
            android:name="IM_APP_ID"
            android:value="YOUR_APP_ID" />
      <!-- 【必须】 请将YOUR_APP_KEY修改为APP的AppKey,“A”开头的12位字符串,中间没空格 -->
                    <meta-data
            android:name="IM_APP_KEY"
            android:value="YOUR_APP_KEY" /> </application>  <!-- 【必须】 信鸽SDK所需权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RESTART_PACKAGES" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.VIBRATE" /> <!-- 【可选】 信鸽SDK所需权限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BATTERY_STATS" />


启动并注册App


完成工程配置后,打开工程的主Activity,在其onCreate(Bundle

savedInstanceState)重载方法内,添加以下代码,完成信鸽服务的启动与APP注册过程。


IMCloudManager.start(getApplicationContext());


API


启动IM

在程序启动时候调用,用于初始化信鸽 IM 的 Service。

原型


public static void start(Context context)


参数

context:

当前应用上下文对象,不能为null


IMCloudManager.start(getApplicationContext());


设置用户名

调用此 API 后,就绑定了对应的 UserId, 应用程序便可以向这个UserId 发送消息

原型


public static void login(Context context, String userId, String ticket, XGIOperateCallback callBack) 


参数

context:

当前应用上下文对象,不能为null

userId:

用户需要绑定的 UserId, 一般对应于聊天程序的用户ID

ticket:

通过API获取的鉴权票据

callback:

callback调用,主要包括操作成功和失败的回调

示例


IMCloudManager.login(getApplicationContext(), userId, ticket, new XGIOperateCallback() {
@Override
public void onSuccess(Object data, int flag) {
DemoUtil.showToast("login success with userid = "
+ userId, getApplicationContext())
@Override
public void onFail(Object data, int errCode, String msg) {
DemoUtil.showToast("login failed with userid = "+ userId + " error msg = " + msg, getApplicationContext());


注销用户名

调用此 API 后,注销了对应的 UserId

原型


public static void unLogin(Context context, String userId,  String ticket, XGIOperateCallback callBack)


参数

context:

当前应用上下文对象,不能为null

userId:

一般对应于聊天程序的用户ID

ticket:

通过API获取的鉴权票据

callback:

callback调用,主要包括操作成功和失败的回调

示例


IMCloudManager.unLogin(getApplicationContext(), userId, new XGIOperateCallback() {
@Override
public void onSuccess(Object data, int flag) {
DemoUtil.showToast("unlogin success with userid = "
+ userId, getApplicationContext())
@Override
public void onFail(Object data, int errCode, String msg) {
DemoUtil.showToast("unlogin failed with userid = "+ userId + " error msg = " + msg, getApplicationContext());
}});


发送消息给用户 

对相应的 UserId 发送消息

原型


public static void sendMsgToUseId(Context context, String userId, String message, XGIOperateCallback callBack) 


参数

context:

当前应用上下文对象,不能为null

userId:

一般对应于聊天程序的用户ID

Message:

发生给用户的消息内容

callback:

callback调用,主要包括操作成功和失败的回调

示例


IMCloudManager.sendMsgToUseId(getApplicationContext(), userId, msg, new XGIOperateCallback() {
			@Override
	public void onSuccess(Object data, int flag) {

	     DemoUtil.showToast("sendMsgToUseId success with userid = " + userId, getApplicationContext());
}

	@Override
      public void onFail(Object data, int errCode, String msg) {
	DemoUtil.showToast("sendMsgToUseId failed with userid = " + userId + "error = " + msg, getApplicationContext());
	}});


发送消息给群组

对相应的 UserId 发送消息

原型


public static void sendMsgToGroupId(Context context, String groupId, String message, XGIOperateCallback callBack)


参数

context:

当前应用上下文对象,不能为null

groupId:

一般对应于聊天程序群ID

Message:

发生给用户的消息内容

callback:

callback调用,主要包括操作成功和失败的回调

示例


IMCloudManager.sendMsgToGroupId(getApplicationContext(), groupId, msg, new XGIOperateCallback() {
			@Override
	public void onSuccess(Object data, int flag) {

	     DemoUtil.showToast("sendMsgToGroupId success with groupid = " + groupid , getApplicationContext());
}

	@Override
      public void onFail(Object data, int errCode, String msg) {
	DemoUtil.showToast("sendMsgToGroupId failed with groupid = " + groupid + "error = " + msg, getApplicationContext());
	}});


发送图片给用户

发送图片给对应的用户

原型


public static void sendImageToUserId(Context context, String userId, String imageUrl, XGIOperateCallback callBack) 


参数

context:

当前应用上下文对象,不能为null

userId:

一般对应于聊天程序用户ID

imageUrl:

图片的本地路径

callback:

callback调用,主要包括操作成功和失败的回调

示例


IMCloudManager.sendMsgToUserId(getApplicationContext(), userId, url, new XGIOperateCallback() {
			@Override
	public void onSuccess(Object data, int flag) {
	     DemoUtil.showToast("sendImageToUseId success with userId= " + userId, getApplicationContext());
	@Override
      public void onFail(Object data, int errCode, String msg) {
	DemoUtil.showToast("sendImageToUseId failed with userId= " + userId+ "error = " + msg, getApplicationContext());
	}});


发送图片给群

发送图片给对应的群

原型


public static void sendImageToGroupId(Context context, String groupId, String imageUrl, XGIOperateCallback callBack)


参数

context:

当前应用上下文对象,不能为null

groupId:

一般对应于聊天程群ID

imageUrl:

图片的本地路径

callback:

callback调用,主要包括操作成功和失败的回调

示例


IMCloudManager.sendMsgToGroupId(getApplicationContext(), groupId, url, new XGIOperateCallback() {
			@Override
	public void onSuccess(Object data, int flag) {

	     DemoUtil.showToast("sendImageToGroup success with groupId= " + groupId, getApplicationContext());
}

	@Override
      public void onFail(Object data, int errCode, String msg) {
	DemoUtil.showToast("sendImageToGroupId failed with groupId= " + groupId+ "error = " + msg, getApplicationContext());
	}});


获取用户的聊天记录

获取对应用户的聊天记录

原型


public static List<IMMessage> getHistoryMessagesOfUserId(Context context, String userId, int position, int number)


参数

context:

当前应用上下文对象,不能为null

userId:

一般对应于用户ID

position:

最新一条消息的为 position 为 0

number:

获取消息的条数

返回值

IMMessage:历史消息记录

IMMessage 类成员列表

方法名
返回值
默认值
描述
seqId
long
-1
保留字段,暂时无作用
msgId
long
0
消息的ID值
fromUser
String
""
此条消息发送者的ID
toUser
String
""
此条消息接受者的ID
content
String
""
消息内容
utime
long
0 消息产生的时间,以服务器时间为标准
msgType
int
0 0为单聊,1为群聊
type
int
0 O为用户接受的消息,1为用户发送的消息
contentType
int
0 0为文本消息, 1 为图片消息, 2为语音

示例


private void handGetHistoryMsg() {
		final String userId = sendUserId.getText().toString().trim();
		System.err.println(userId + " has history msg number = " + IMCloudManager.getHistoryMessagesCountOfUserId(getApplicationContext(), userId));
		List<IMMessage> msgs = IMCloudManager.getHistoryMessagesOfUserId(
				getApplicationContext(), userId, 0, 10);
		if (null != msgs) {
			for (com.tencent.android.tpush.IMMessage imMessage : msgs) {
				System.err.println(imMessage);
				if (imMessage.contentType == IMMessage.MESSAGE_CONTENT_TEXT) {
					//处理文本消息
					if (imMessage.type == IMMessage.TYPE_RECEIVED) {
						//处理收到的消息
					} else if (imMessage.type == IMMessage.TYPE_SENT){
						//处理发送的消息
					}
				} else if(imMessage.contentType == IMMessage.MESSAGE_CONTEXT_IMAGE) {
					if (imMessage instanceof ImageMessage) {
						ImageMessage image = (ImageMessage)imMessage;
						//处理图像消息
						if (image.type == IMMessage.TYPE_RECEIVED) {
							
							//处理收到的消息
							String  localUrl = image.localImageUrl;
							if (null == localUrl || localUrl.equals("")) {
								String httpUrl = image.rawImageUrl; //下载图片
							}
						} else if (image.type == IMMessage.TYPE_SENT){
							//处理发送的图片
							String  localUrl = image.localImageUrl;
						}
					}
				} else {
					System.err.println("unkown msg content type");
				}
			}
			
		}

	} 


获取群的聊天记录

获取对应用户的聊天记录

原型


public static List<IMMessage> getHistoryMessagesOfGroupId(Context context, String groupId, int position, int number)


参数

context:

当前应用上下文对象,不能为null

groupId:

一般对应于群ID

position:

最新一条消息的为 position 为 0

number:

获取消息的条数


返回值

IMMessage:历史消息记录

IMMessage 类成员列表


方法名
返回值
默认值
描述
seqId
long
-1
保留字段,暂时无作用
msgId
long
0
消息的ID值
fromUser
String
""
此条消息发送者的ID
toUser
String
""
此条消息接受者的ID
content
String
""
消息内容
utime
long
0 消息产生的时间,以服务器时间为标准
msgType
int
0 0为单聊,1为群聊
type
int
0 O为用户接受的消息,1为用户发送的消息
contentType
int
0 0为文本消息, 1 为图片消息

示例


private void handGetGroupHistoryMsg() {

		final String userId = sendUserId.getText().toString().trim();
		System.err.println(userId + " has history msg number = " + IMCloudManager.getHistoryMessagesCountOfGroupId(getApplicationContext(), userId));
		List<IMMessage> msgs = IMCloudManager.getHistoryMessagesOfGroupId(
				getApplicationContext(), userId, 0, 10);
		if (null != msgs) {
			for (com.tencent.android.tpush.IMMessage imMessage : msgs) {
				System.err.println(imMessage);
				if (imMessage.contentType == IMMessage.MESSAGE_CONTENT_TEXT) {
					//处理文本消息
					if (imMessage.type == IMMessage.TYPE_RECEIVED) {
						//处理收到的消息
					} else if (imMessage.type == IMMessage.TYPE_SENT){
						//处理发送的消息
					}
				} else if(imMessage.contentType == IMMessage.MESSAGE_CONTEXT_IMAGE) {
					if (imMessage instanceof ImageMessage) {
						ImageMessage image = (ImageMessage)imMessage;
						//处理图像消息
						if (image.type == IMMessage.TYPE_RECEIVED) {
							
							//处理收到的消息
							String  localUrl = image.localImageUrl;
							if (null == localUrl || localUrl.equals("")) {
								String httpUrl = image.rawImageUrl; //下载图片
							}
						} else if (image.type == IMMessage.TYPE_SENT){
							//处理发送的图片
							String  localUrl = image.localImageUrl;
						}
					}
				} else {
					System.err.println("unkown msg content type");
				}
			}
		}
	}


重发失败的消息 

获取对应用户的聊天记录

原型


public static List<IMMessage> reSendFailedMessage(Context context, IMMessage msg, IMCloudCallback callBack) 


参数

context:


当前应用上下文对象,不能为null

IMMessage:

失败的消息,用户不能自己实例化,必须来自历史消息记录,或者发送失败的回调

callback:

callback调用,主要包括操作成功和失败的回调

示例


IMCloudManager.reSendFailedMessage(mContext, message,
						new IMCloudCallback() {

							@Override
							public void onSuccess(Object data, int flag) {
								DemoUtil.showToast(
										"ReSendMsgToUseId success with userid = "
												+ userName.trim(), mContext);
								activity.runOnUiThread(new Runnable() {

									@Override
									public void run() {
										message.sentFlag = IMMessage.SENT_STATUS_SUCCEED;
										holder.pb_load.setVisibility(View.GONE);
										List<IMMessage> m = null;
										if (message.msgType == 0)
											m = IMCloudManager
													.getHistoryMessagesOfUserId(
															mContext, userName,
															0, 1);
										else
											m = IMCloudManager
													.getHistoryMessagesOfGroupId(
															mContext, userName,
															0, 1);
										remove(message);
										if (m != null && m.size() > 0)
											add(m.get(0));
									}
								});
							}

							@Override
							public void onFail(final Object data, int errCode,
									String msg) {
								DemoUtil.showToast(
										"ReSendMsgToUseId fail with userid = "
												+ userName.trim() + "error = "
												+ msg, mContext);
								activity.runOnUiThread(new Runnable() {

									@Override
									public void run() {
										message.sentFlag = IMMessage.SENT_STATUS_FAILED;
										holder.pb_load.setVisibility(View.GONE);
										holder.fail.setVisibility(View.VISIBLE);
										if (data != null)
											setValue(message, position, data);
									}
								});

							}

						});


目录

回到顶部