聊天
使用BeTalk 聊天SDK模块,为您的应用程序添加强大的协作能力。
SDK功能:
- 能够实现一对一单或群聊
- 共享文件
- 在文件上添加标注和语音注释
- 进行实时会议
下图说明了示例应用程序和BeTalk SDK的交互方式。
1. 异步编程
你应该有异步编程的一些基本知识。这种类型的编程需要调用一个XXXListener参数的API,然后等待监听回调接下来的步骤,然后再继续。
2. 步骤0:在Android Studio中创建新项目
本教程采用了Android Studio来创建示例应用程序“BeTalk Chat”。确保你已经安装了Android Studio和Android SDK(启动Android Studio中的SDK管理器,然后按照安装指南进行安装)。
您可以通过Android Studio创建新项目,或者使用我们github上示例代码创建一个新项目:
git checkout -f step-00
3. 第1步:添加BeTalk SDK模块
创建BeTalkChat的新项目后,添加BeTalk SDK模块。
首先,下载Android Chat SDK。
解压缩Chat SDK文件,并找到一个名为“BeTalk”文件夹中。将“BeTalk”文件夹复制到“BeTalkChat”文件夹,你的目录结构现在应该是这样的:
BeTalkChat
|– BeTalkChat.iml
|– app
|– build
|– build.gradle
|– gradle
|– gradle.properties
|– gradlew
|– gradlew.bat
|– local.properties
|– BeTalk
|– settings.gradle
下一步是将BeTalk 模块添加到gradle 和Android Studio中,修改
include ':app', ":BeTalk"
编辑BeTalkChat中的build.gradle并添加以下代码片段:
ext {
buildToolsVersion = System.env.CUSTOM_BUILDTOOLS != null ? System.env.CUSTOM_BUILDTOOLS : (project.hasProperty("CUSTOM_BUILDTOOLS") ? project.CUSTOM_BUILDTOOLS : '22.0.1')
useJack = System.env.CUSTOM_JACK != null ? true : (project.hasProperty("CUSTOM_JACK") ? true : false)
}
task wrapper(type: Wrapper) {
gradleVersion = '2.4'
}
在defaultConfig中添加代码段
useJack = rootProject.ext.useJack
在应用程序文件夹中,向build.gradle文件添加:
compile project(':BeTalk')
compile 'org.jsoup:jsoup:1.7.3'
compile 'com.belerweb:pinyin4j:2.5.0'
现在,如下所示在BeTalkChat文件夹中的gradle.properties定义变量。
ANDROID_BUILD_MIN_SDK_VERSION=14
ANDROID_BUILD_TARGET_SDK_VERSION=21
ANDROID_BUILD_TOOLS_VERSION=21.1
ANDROID_BUILD_SDK_VERSION=21
现在,您可以用gradle 文件同步项目:
Tools -> Android -> Sync Project with Gradle Files
请确保您进一步处理之前没有任何编译错误。
您也可以通过GitHub检验第1步完整代码:
git checkout -f step-01
4. 第2步:更新AndroidManifest.xml
添加之后需要用到的权限或或声明(也可以使用时添加)
将下列权限添加到应用节点之前:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
android:name=".permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name=".permission.C2D_MESSAGE" />
声明应用程序节点中的BeTalk相关的活动或服务:
<!-- Activities used in BeTalk Chat SDK -->
<activity
android:name="com.BeTalk.binder.conversation.BTConversationActivity"
android:launchMode="singleTask"
android:theme="@style/BeTalkTheme"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name="com.BeTalk.binder.pageview.PageViewActivity"
android:launchMode="singleTask"
android:theme="@style/BeTalkTheme"
android:windowSoftInputMode="stateHidden|adjustPan" />
<service android:name="com.BeTalk.binder.service.AudioPlayerService" />
<activity
android:name="com.BeTalk.binder.livemeet.LiveMeetActivity"
android:launchMode="singleTask"
android:theme="@style/BeTalkTheme">
</activity>
<activity
android:name="com.BeTalk.binder.activity.BTStackActivity"
android:theme="@style/BTActivityDialog"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name="com.BeTalk.binder.member.BTInviteActivity"
android:theme="@style/BTActivityDialog"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="com.BeTalk.binder.multiimagepicker.MultiImagePickerActivity"
android:theme="@style/BeTalkTheme" />
<activity
android:name="com.BeTalk.binder.util.BTAlertDialog"
android:theme="@style/MoxFullTranslucentActivity"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="com.BeTalk.sdk.BTRemoteNotificationActivity"
android:noHistory="true"
android:theme="@style/BeTalknsparentActivity" />
<service android:name="com.BeTalk.binder.service.MeetService">
<intent-filter android:priority="1000">
<action android:name="BeTalk.intent.action.START_MEET" />
</intent-filter>
</service>
<activity android:name="com.BeTalk.binder.search.BTSearchActivity" />
<activity android:name="com.BeTalk.binder.webnote.BTWebNoteActivity" />
<activity android:name="com.BeTalk.binder.webclip.BTWebClipActivity" />
<activity android:name="com.BeTalk.binder.livemeet.MeetRingActivity" />
<!-- END BeTalk -->
您可以通过GitHub检查第2步完整代码:
git checkout -f step-02
5. 第3步:建立架构和添加测试数据
在这个步骤中,您将建立应用程序架构,并添加一些用户测试数据。
BeTalk Chat SDK并没有用户管理功能,一切取决于你。在本教程中,你可以使用一些测试数据。
您可以通过GitHub检查第3步完整代码:
git checkout -f step-03
6. 第4步:实现登录和注销功能
本教程只涉及到BeTalk Chat SDK登录/设置用户
启动您的应用程序时,您需要初始化BTAccountManager,你可以在BeTalkChatApplication中初始化它,而这个类必须是MultiDexApplication的子类,如下面的代码所示:
@Override
public void onCreate() {
super.onCreate();
try {
BTAccountManager.createInstance(this, "irej6RlLOBo", "uiwE8ZzymRs", true);
} catch (BTSDKException.InvalidParameter invalidParameter) {
Log.e(TAG, "Error when creating BTAccountManager instance.", invalidParameter);
}
}
在创建BTAccountManager时需要传递clientId和clientSecret(第二和第三参数,你在建立自己的App时需替换这两个参数)两个参数。isSandBox(第4个参数)设置为true。
clientSecret应该是保密的,你最好将其存储在你的服务器端。这样有两个好处:
- 相对安全且不易被破解;
- 修改它的时候,它不会影响你现有分布式应用程序客户端。
之后,在BeTalk中建立用户。在LoginActivity 方法中添加下列代码:
// Login success and then setup user on BeTalk
try {
User user = PreferenceUtil.getUser(this);
Bitmap avatar = BitmapFactory.decodeStream(this.getAssets().open(user.avatarPath));
final BTSDKConfig.BTUserInfo btUserInfo =
new BTSDKConfig.BTUserInfo(user.email, BTSDKConfig.BTUserIdentityType.IdentityUniqueId);
final BTSDKConfig.BTProfileInfo btProfileInfo = new BTSDKConfig.BTProfileInfo(user.firstName, user.lastName, avatar);
BTAccountManager.getInstance().setupUser(btUserInfo, btProfileInfo, null, null, this);
} catch (IOException e) {
Log.e(TAG, "Can't decode avatar.", e);
}
装载用户是一个异步操作,需要一个回调传递给它。回调接口可被实现,如下所示:
@Override
public void onLinkAccountDone(boolean success) {
if (success) {
Log.i(TAG, "Linked to BeTalk account successfully.");
startChatListActivity();
} else {
Toast.makeText(this, "Failed to setup BeTalk user.", Toast.LENGTH_LONG).show();
Log.e(TAG, "Failed to setup BeTalk user.");
showProgress(false);
}
用户成功地从您的应用程序登出后,断开BeTalk帐户链接。在BeTalkChat(或在本教程)中,它是在BaseActivity操作工具栏实现的,方便用户从BaseActivity扩展的任何活动中登出。
BTAccountManager.getInstance().unlinkAccount(this);
您可以通过GitHub检查第4步完整代码:
git checkout -f step-04
7. 第5步:显示会话列表
显示会话列表时需考虑两种情况:
- 用户打开您的应用程序时初始化会话列表
- 用户在你的应用程序的会话列表界面中时刷新。
现在,让我们建立一个使用BTChatManager API的会话列表。要获得
BTChatManager.getInstance()
当用户打开的聊天列表界面,您可以调用下面的API来获取所有的聊天记录:
List<BTGroupChatSession> sessions = BTChatManager.getInstance().getGroupChatSessions();
注意:BTGroupChatSession有两种类型的API调用:BTChatManager.openChat()是开始一个会话,BTChatManager.joinMeet()是加入会议。
获得所有会话列表后,必须监听以便界面可以自动更新。
BTChatManager.getInstance().setOnMeetEndListener(new BTChatManager.OnEndMeetListener() {
@Override
public void onMeetEnded(String meetId) {
adapter.refreshData();
}
});
BTChatManager.getInstance().setGroupChatSessionCallback(new BTGroupChatSessionCallback() {
@Override
public void onGroupChatSessionCreated(BTGroupChatSession session) {
adapter.refreshData();
}
@Override
public void onGroupChatSessionUpdated(BTGroupChatSession session) {
adapter.refreshData();
}
@Override
public void onGroupChatSessionDeleted(BTGroupChatSession session) {
adapter.refreshData();
}
});
您可以通过GitHub检查第5步完整代码:
git checkout -f step-05
8. 第6步:开始一个新的会话
在示例应用程序中,你有一个空的会话列表。
你必须建立用户界面选择其他用户,通过调用下面的API来开始会话:
BTChatManager.getInstance().createChat(topic, who, onCreateChatListener);
onCreateChatListener是一个异步操作。
在BeTalk Chat SDK,所有监听操作都是异步操作。此异步操作的结果是未知的,直到回调被触发。
使用下面的代码片段来实现回调接口。
@Override
public void onCreateChatSuccess(String binderId) {
Log.i(TAG, "Create Chat Success. The binderId = " + binderId);
}
@Override
public void onCreateChatFailed(int i, String s) {
Log.e(TAG, "Failed to create chat with code: " + i + ", msg: " + s);
Toast.makeText(this, "Failed to create chat: " + s, Toast.LENGTH_LONG).show();
}
一旦会话创建成功,它会自动打开。
您可以通过GitHub检查第6步完整代码:
git checkout -f step-06
9. 第7步:打开一个现有的会话
通过调用下面的API打开的会话列表中已有的会话:
BTChatManager.getInstance().openChat(binderId, onOpenChatListener);
使用下面的代码来实现回调接口:
@Override
public void onOpenChatSuccess() {
Log.i(TAG, "Open chat success.");
}
@Override
public void onOpenChatFailed(int i, String s) {
Log.e(TAG, "Failed to open chat with code: " + i + ", msg: " + s);
Toast.makeText(this, "Failed to open chat: " + s, Toast.LENGTH_LONG).show();
}
您可以通过GitHub检查第7步完整代码。
git checkout -f step-07
10. 第8步:发起会议
BeTalk Chat SDK可以轻松地用几行代码开始音频/视频会议。您可以共享您的屏幕或注释会议文件。
如果在会话界面之外发起会议功能则此步骤是必需的。
要在会话的用户界面之外发起会议,使用下面的代码片段:
try {
BTChatManager.getInstance().startMeet(currentLoginUser.firstName + "'s meet", null,
arrayList, new BTChatManager.OnStartMeetListener() {
@Override
public void onStartMeetDone(String meetId, String meetUrl) {
Log.d(TAG, "Meet started: " + meetId);
}
@Override
public void onStartMeetFailed(int i, String s) {
Log.e(TAG, "onStartMeetFailed: " + s);
}
});
} catch (BTSDKException.Unauthorized unauthorized) {
Log.e(TAG, "Error when start meet", unauthorized);
} catch (BTSDKException.MeetIsInProgress meetIsInProgress) {
Log.e(TAG, "Error when start meet", meetIsInProgress);
}
请执行回调接口,以确定是否成功启动。
您可以通过GitHub检查第8步完整代码。
git checkout -f step-08
11. 第9步:加入会议
邀请用户加入会议,使用此段代码来实现参会的功能。
try {
BTChatManager.getInstance().joinMeet(session.getMeetID(), currentLoginUser.firstName,
new BTChatManager.OnJoinMeetListener() {
@Override
public void onJoinMeetDone(String meetId, String meetUrl) {
Log.d(TAG, "Joined meet: " + meetId);
}
@Override
public void onJoinMeetFailed() {
Log.e(TAG, "Unable to join meet.");
}
});
} catch (BTSDKException.MeetIsInProgress meetIsInProgress) {
Log.e(TAG, "Error when join meet", meetIsInProgress);
}
您可以通过GitHub检查第9步完整代码:
git checkout -f step-09
12. 步骤10:删除会话
所有会话都是是一种持久性会话,会话中的消息都会被保存,所以新老会话成员可以随时看到所有的聊天记录。
如果您不再需要该会话的话,就可以将其删除。使用此代码片段来实现删除会话功能:
BTChatManager.getInstance().deleteChat(binderId);
您可以通过GitHub检查第10步完整代码:
git checkout -f step-10
13. 步骤11:启用通知
通知是实时通信应用程序的基本特征。在这个示例中,你将使用GCM(谷歌云消息传递),用于基础的通知解决方案。
获得来自谷歌开发者控制台API密钥:
- 打开https://console.developers.google.com/project
- 点击创建项目或使用现有项目
- 转到项目概述页面并记下的项目编号
- 在APIs&auth部分下点击的APIs,然后单击Cloud Messages for Android以确保API已启用。如果没有,请立即启用
- 点击APIs&auth部分下点击Credentials并获得API密钥。如果你没有任何API密钥,请单击创建新的密钥,然后选择创建服务器密钥。
现在,您需要在BeTalk开发者控制台设置API密钥,这样GCM服务器不会禁用的通知。
- 转到我的应用
- 找到你的应用程序,然后单击编辑应用程序
- 滚动到页面底部,找到“For Android devices”部分
- 设置API密钥,然后单击更新保存密钥
接下来,您需要编写代码,当用户成功登录时注册设备。请点击Google Cloud Messaging查询更多细节。请注意,项目编号为GCM发送者ID。
为成功登录的用户注册设备,您可以通过GCM服务器获得注册ID(regid)。用regid建立用户,如下面的代码所示:
try {
User user = PreferenceUtil.getUser(this);
Bitmap avatar = BitmapFactory.decodeStream(this.getAssets().open(user.avatarPath));
BTSDKConfig.BTUserInfo btUserInfo =
new BTSDKConfig.BTUserInfo(user.email, BTSDKConfig.BTUserIdentityType.IdentityUniqueId);
BTSDKConfig.BTProfileInfo btProfileInfo = new BTSDKConfig.BTProfileInfo(user.firstName, user.lastName, avatar);
BTAccountManager.getInstance().setupUser(btUserInfo, btProfileInfo, null, regid, this);
} catch (IOException e) {
Log.e(TAG, "Can't decode avatar.", e);
}
现在BeTalk服务器可以发送通知到注册的设备。为了显示通知,请参阅整合Google云消息。
收到通知后,调用BTNotificationManager.preProcessBTNotification预处理,并检查它是否是一个BeTalk消息。
boolean handled = BTNotificationManager.preProcessBTNotification(getApplicationContext(), intent);
if (handled) {
// This is a BeTalk message and it will be handled by BeTalk
if (intent.getBooleanExtra(BTNotificationManager.BeTalk_MESSAGE_SHOW_NOTIFICATION, false)) {
String title = intent.getStringExtra(BTNotificationManager.BeTalk_MESSAGE_TITLE_TEXT);
if (intent.hasExtra(BTNotificationManager.BeTalk_MESSAGE_ALERT_SOUND)) {
String soundUrl = intent.getStringExtra(BTNotificationManager.BeTalk_MESSAGE_ALERT_SOUND);
Log.d(TAG, "soundUrl = " + soundUrl);
Uri uri = Uri.parse(soundUrl);
sendBeTalkNotification(title, uri, intent);
} else {
sendBeTalkNotification(title, intent);
}
}
} else {
// Not a BeTalk message and app should handle it.
Log.i(TAG, "App should handle it.");
}
如果是BeTalk消息,处理并推送通知,如下面的代码片段:
// Put the message into a notification and post it.
// This is just one simple example of what you might choose to do with
// a GCM message.
private void sendBeTalkNotification(String msg, Intent intent) {
sendBeTalkNotification(msg, null, intent);
}
private void sendBeTalkNotification(String msg, Uri uri, Intent intent) {
Log.d(TAG, "Got notification: msg = " + msg + ", uri = " + uri);
mNotificationManager = (NotificationManager)
this.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = BTNotificationManager.getBTNotificationIntent(this, intent, 0);
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(getString(getApplicationInfo().labelRes))
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(msg))
.setContentText(msg)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);
if (uri != null) {
mBuilder.setSound(uri);
}
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
您可以从GitHub获得步骤11中的代码:
git checkout -f step-11
14. 第12步:准备发布
若要发布您的应用程序,你应该建立签约配置。如果您设置minifyEnabled为True,别忘了更新ProGuard规则。
您可以从Github上获得ProGuard规则。
git checkout -f step-12
15.下载会话SDK
使用BeTalk Android的会话SDK建立自己的应用。