聊天

使用BeTalk 聊天SDK模块,为您的应用程序添加强大的协作能力。

SDK功能:

  • 能够实现一对一单或群聊
  • 共享文件
  • 在文件上添加标注和语音注释
  • 进行实时会议

下图说明了示例应用程序和BeTalk SDK的交互方式。

betalkandroidsdk1

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建立自己的应用。