Android SDK 接入指南
应用集成到客户端
- import asynctcp, imsdk, imkit模块到自己的app工程
在Application的onCreate初始化
String androidID = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID); //设置设备唯一标识,用于多点登录时设备校验 IMService.getInstance().setDeviceID(androidID); //监听网路状态变更 IMService.getInstance().registerConnectivityChangeReceiver(getApplicationContext()); mIMService.setPeerMessageHandler(PeerMessageHandler.getInstance()); mIMService.setGroupMessageHandler(GroupMessageHandler.getInstance()); mIMService.setCustomerMessageHandler(CustomerMessageHandler.getInstance());
登录成功后设置uid,token
IMService.getInstance().setToken(token); PeerMessageHandler.getInstance().setUID(uid); GroupMessageHandler.getInstance().setUID(uid); CustomerMessageHandler.getInstance().setAppId(appid); CustomerMessageHandler.getInstance().setUID(uid); SyncKeyHandler handler = new SyncKeyHandler(this.getApplicationContext(), String.format("sync_key_%d", uid)); handler.load(); IMService.getInstance().setSyncKeyHandler(handler);
打开消息db, 数据库表结构参照demo中的MessageDatabaseHelper源代码
File p = this.getDir("db", MODE_PRIVATE); File f = new File(p, String.format("gobelieve_%d.db", uid)); String path = f.getPath(); MessageDatabaseHelper dh = MessageDatabaseHelper.getInstance(); dh.open(this.getApplicationContext(), path); SQLiteDatabase db = dh.getDatabase(); PeerMessageDB.getInstance().setDb(db); GroupMessageDB.getInstance().setDb(db); CustomerMessageDB.getInstance().setDb(db);
启动IMService接受消息
IMService.getInstance().start();
添加消息observer,处理相应类型的消息
//连接状态 IMService.getInstance().addObserver(ob); //点对点消息 IMService.getInstance().addPeerObserver(ob); //群组消息 IMService.getInstance().addGroupObserver(ob); //客服消息 IMService.getInstance().addGroupObserver(ob); //直播的聊天室消息 IMService.getInstance().addRoomObserver(ob); //实时消息,用于voip的信令 IMService.getInstance().addRTObserver(ob); //系统消息 IMService.getInstance().addSystemObserver(ob);
应用进入后台,断开socket链接
IMService.getInstance().enterBackground();
应用返回前台,重现链接socket
IMService.getInstance().enterForeground();
发送点对点消息
IMMessage im = new IMMessage(); im.msgLocalID = 本地数据库的消息id im.sender = 当前用户id im.receiver = 对端的id im.content = "可以是任意格式的字符串" IMService.getInstance().sendPeerMessageAsync(im);
发送群组消息
IMMessage im = new IMMessage(); im.msgLocalID = 本地数据库的消息id im.sender = 当前用户id im.receiver = 群组id im.content = "可以是任意格式的字符串" IMService.getInstance().sendGroupMessageAsync(im);
发送聊天室消息
IMMessage im = new RoomMessage(); im.sender = 当前用户id im.receiver = roomid im.content = "可以是任意格式的字符串" IMService.getInstance().sendRoomMessageAsync(im);
打开点对点会话
Intent intent = new Intent(this, PeerMessageActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("peer_uid", peer_uid); intent.putExtra("peer_name", ""); intent.putExtra("current_uid", uid); startActivity(intent);
打开群聊会话
Intent intent = new Intent(this, GroupMessageActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("group_id", groupId); intent.putExtra("group_name", ""); intent.putExtra("current_uid", uid); startActivity(intent);
打开客服会话
Intent intent = new Intent(this, CustomerMessageActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("store_id", storeId); intent.putExtra("app_id", APP_ID); intent.putExtra("current_uid", uid); intent.putExtra("store_name", "商店名称"); intent.putExtra("app_name", "app名称"); intent.putExtra("name", "用户昵称"); startActivity(intent);
用户注销
IMService.getInstance().stop()
AndroidManifest.xml配置
manifest 标签下添加:
<!-- 必需: 权限配置 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
application 标签下添加:
<activity android:name="com.beetle.bauhinia.PeerMessageActivity" android:exported="true" android:windowSoftInputMode="adjustResize|stateHidden" android:theme="@style/imkit.ActionBar"> <intent-filter> <action android:name="android.intent.action.VIEW" /> </intent-filter> </activity> <activity android:name=".GroupMessageActivity" android:exported="true" android:theme="@style/imkit.ActionBar" android:windowSoftInputMode="adjustResize|stateHidden"> <intent-filter> <action android:name="android.intent.action.VIEW" /> </intent-filter> </activity> <activity android:name=".CustomerMessageActivity" android:exported="true" android:theme="@style/imkit.ActionBar" android:windowSoftInputMode="adjustResize|stateHidden"> <intent-filter> <action android:name="android.intent.action.VIEW" /> </intent-filter> </activity> <activity android:name="com.beetle.bauhinia.activity.PhotoActivity" android:label="照片" android:theme="@style/imkit.ActionBar"> </activity> <activity android:name="com.beetle.bauhinia.MapActivity" android:label="位置" android:theme="@style/imkit.ActionBar"> </activity> <activity android:name="com.beetle.bauhinia.LocationPickerActivity" android:label="位置" android:theme="@style/imkit.ActionBar"> </activity> <activity android:name="com.beetle.bauhinia.WebActivity" android:label="" android:theme="@style/imkit.ActionBar"> </activity> <activity android:name="com.beetle.bauhinia.gallery.ui.GalleryGridUI" android:label="@string/gallery_chat_files" android:launchMode="singleTop" android:screenOrientation="portrait" android:theme="@style/imkit.ActionBar" /> <activity android:name="com.beetle.bauhinia.gallery.ui.GalleryUI" android:launchMode="singleTop" android:screenOrientation="portrait" android:theme="@style/imkit.NoActionBar" /> <activity android:name="com.beetle.bauhinia.activity.OverlayActivity" android:theme="@style/NoActionBar" /> <activity android:name="com.beetle.bauhinia.activity.MessageFileActivity" android:label="文件预览" android:theme="@style/imkit.ActionBar" /> <!-- authorities 当前包名+'.fileprovider' --> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.beetle.im.demo.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
类IMService
设置当前用户的access token
方法名:public void setAccessToken(String token)
功能:在调用start之前必须要设置用户的accessToken,token是由第三方应用服务器调用IM服务器RestAPI所得。
参数说明:
* token 客户端连接IM服务必须的acessToken
返回值:无返回值
设置当前用户id
方法名:public void setUID(long uid)
参数说明:
* uid 当前用户id
返回值:无返回值
设置当前设备id
方法名:public void setDeviceID(String deviceID)
功能:设备id可以用户多点登陆的唯一性判断,可选调用
参数说明:
*deviceID 设备id
返回值:无返回值
监控网络变化
方法名: public void registerConnectivityChangeReceiver(Context context)
功能: 可以及时的根据网络变化情况,断开,建立socket链接。
设置观察者
方法名: public void addObserver(IMServiceObserver observer)
功能:设置observer,在observer中处理接受到的消息。
参数说明:
* observer 观察者
返回值:无返回值
开始接受消息
方法名:public void start()
功能:用户登陆成功后,连接im服务器来接受在线消息。
停止接受消息
方法名:public void stop()
功能:用户注销后,断开和im服务器的连接,从而终止接受在线消息。
应用进入到前台
方法名:public void enterForeground()
功能:应用进入前台,im服务器将停止将消息推送到通知栏
应用进入到后台
方法名:public void enterBackground()
功能:应用进入后台,im服务器会将将消息推送到通知栏
发送消息
方法名:public void sendPeerMessageAsync(IMMessage msg)
参数说明:
*msg 消息对象
发送群组消息
方法名:public void sendGroupMessageAsync(IMMessage msg)
参数说明:
*msg 消息对象
接口IMServiceObserver
连接状态
方法名:public void onConnectState(IMService.ConnectState state)
功能:连接状态变更通知
参数说明:
*state 连接的状态 STATE_UNCONNECTED, STATE_CONNECTING, STATE_CONNECTED, STATE_CONNECTFAIL
返回值:无返回值
接口PeerMessageObserver
消息
方法名:public void onPeerMessage(IMMessage msg)
功能:接受到一条im消息
参数说明:
*msg 消息对象
返回值:无返回值
消息ACK
方法名:public void onPeerMessageACK(IMMessage msg)
功能:服务器对收到消息的ack,此时这条消息才能标志为发送成功
参数说明:
*msg 消息对象
返回值:无返回值
消息发送失败
方法名:public void onPeerMessageFailure(IMMessage msg)
功能:消息发出后,未收到服务器的ack,在和服务器的连接断开后,会通知消息发送失败。
参数说明:
*msg 消息对象
返回值:无返回值
接口GroupMessageObserver
消息
方法名:public void onGroupMessage(IMMessage msg)
功能:接受到一条im消息
参数说明:
*msg 消息对象
返回值:无返回值
消息ACK
方法名:public void onGroupMessageACK(IMMessage msg)
功能:服务器对收到消息的ack,此时这条消息才能标志为发送成功
参数说明:
*msg 消息对象
返回值:无返回值
消息发送失败
方法名:public void onGroupMessageFailure(IMMessage msg)
功能:消息发出后,未收到服务器的ack,在和服务器的连接断开后,会通知消息发送失败。
参数说明:
*msg 消息对象
返回值:无返回值
类IMApi
设置当前用户的device token
方法名:public boolean bindDeviceToken(PostDeviceToken token)
功能:设置device token后,im服务器会对用户推送离线消息,device token来自于push系统生成。
参数说明:
*deviceToken 推送的deviceToken
返回值:boolean 是否设置成功。
清空当前用户关联的device token
方法名:public boolean unbindDeviceToken(PostDeviceToken token)
功能:im服务器不会再对这台设备推送离线消息
参数说明:
*deviceToken 推送的deviceToken
返回值:boolean 是否清空成功。