云会议Android客户端SDK是提供给第三方开发者整合全时云会议的一组接口,包括接口文档、接口定义源代码文件、接口调用库文件等。通过该SDK,第三方开发者能够开发出带有全时云会议接入功能的软件产品。 调用前请仔细阅读最下方的注意事项。
下载云会议Android端SDK压缩包,点击下载,下载完成后解压缩即可。
SDK包清单:
将libs目录下的gnet_meeting.aar、GNetTangSDK.jar、armeabi-v7a目录下的so文件,放置在宿主项目lib目录下。
云会议SDK自身编译所使用的配置如下所示:
compileSdkVersion 27
minSdkVersion 17
targetSdkVersion 26
在宿主项目的build.gradle文件中添加配置:
注意点:如下的文件配置:dirs 'libs 和 jniLibs.srcDirs = ['libs'] 需要根据宿主对应的libs所在目录判断e.g.:如果宿主app的libs文件夹在src/main下面。则 dirs 'src/main/libs' 。
android{
repositories {
flatDir {
dirs 'libs'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
manifest.srcFile 'src/main/AndroidManifest.xml'
java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
}
}
}
在宿主项目中添加依赖库代码: 见以下说明:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
//compile files('libs/GNetTangSDK.jar')
//compile files('libs/gnet_network.jar')
//compile files('libs/gnet_image_loader.jar')
testCompile 'junit:junit:4.12'
compile 'com.android.support:design:26.1.0'
compile 'com.android.support:percent:26.1.0'
compile 'com.android.support:appcompat-v7:26.1.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:cardview-v7:26.1.0'
// 以aar方式集成云会议SDK
compile(name: 'gnet_meeting', ext: 'aar')
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.umeng.analytics:analytics:6.1.4'
compile 'com.google.zxing:core:3.3.0'
compile 'org.greenrobot:eventbus:3.1.0'
compile 'jp.wasabeef:glide-transformations:2.0.1'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.google.code.gson:gson:2.6.1'
compile 'com.j256.ormlite:ormlite-android:5.0'
// minSdkVersion 17
compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'
compile 'io.reactivex.rxjava2:rxandroid:2.1.1'
compile 'io.reactivex.rxjava2:rxjava:2.2.7'
compile 'com.squareup.okio:okio:1.11.0'
// retrofit 2 + OkHttp 3 (如果使用retrofit 1.9 或 OkHttp 2 可以不添加下面的4条引用)
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.12.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
// retrofit 1.9 + OkHttp 2(如果使用retrofit 2 或 OkHttp 3 可以不添加下面的2条引用)
//compile 'com.squareup.okhttp:okhttp:2.7.5'
//compile 'com.squareup.retrofit:retrofit:1.9.0'
}
注意:如果您使用Retrofit 1.9 + OkHttp 2 ,则使用gent_libs/http/retrofit1.9_okhttp2中的gnet_network.jar包
并在build.gradle中添加相关的引用:
compile 'com.squareup.okhttp:okhttp:2.7.5'
compile 'com.squareup.retrofit:retrofit:1.9.0'
还需要在调用TangSdkApp.initSdk()方法之前调用一个新的接口:
TangInterface.setHttpMethodVersion(HttpMethodVersion.RETROFIT_1_OKHTTP_2); // 使用okhttp3的话,无需调用该方法
如果您使用了Retrofit 2 + OkHttp 3 ,则使用gent_libs/http/retrofit2_okhttp3中的gnet_network.jar包
并在build.gradle中添加相关的引用:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.12.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
为了兼容Glide 3 和 Glide 4版本,需要您引入gent_libs/imageLoader文件夹中的jar包 如果您使用Glide 3.x.x 则使用glide3文件夹中的jar包,并引入Glide 3的库
compile files('libs/gnet_image_loader.jar')
compile 'com.github.bumptech.glide:glide:3.x.x'
如果您使用Glide 4.x.x 则使用glide4文件夹中的jar包,并引入Glide 4的库
compile files('libs/gnet_image_loader.jar')
compile 'com.github.bumptech.glide:glide:4.x.x'
上述两个jar包gnet_network.jar,gnet_image_loader.jar, 如果采用compile fileTree(include: ['*.jar'], dir: 'libs')
这种方式来配置的话,可以不用单独通过compile jar包的方式加载
下图展示了Demo App的libs目录结构:
如果出现方法数超过64K的问题,请参考17节
在宿主项目中的Application中添加代码:
//如果您使用Retrofit 1.9 + OkHttp 2, 需要在调用TangSdkApp.initSdk()方法之前调用一个新的接口:
TangInterface.setHttpMethodVersion(HttpMethodVersion.RETROFIT_1_OKHTTP_2); // 使用okhttp3的话,无需调用该方法
调用如下代码,进行SDK的初始化。this
TangSdkApp.initSdk(Context context);
建议该方法在宿主项目的自定义Application的onCreate()方法中调用,context传入当前application的实例即可
SDK环境分为三种:线上环境,测试环境,Beta环境
API
void initEnvironment(Environment environment)
参数说明
environment:环境变量(具体详见调用方式)
调用方式
TangInterface.initEnvironment(TangInterface.Environment.BETA);//如果使用测试环境,在初始化的代码块添加
TangInterface.initEnvironment(TangInterface.Environment.ONLINE);//如果使用线上正式环境,则在初始化代码块添加
TangInterface.initEnvironment(TangInterface.Environment.OFFLINE);//如果使用线下测试环境,则在初始化代码块添加
如果不调用该方法,默认情况下是ONLINE环境
全时云会议支持多语言,目前支持中文、英文和日文
默认语言:系统语言
API
void initLanguage(Context context, Language language)
参数说明
context:上下文对象
language:TangInterface.Language.ENGLISH :英文
TangInterface.Language.CHINESE :中文
TangInterface.Language.JAPANESE :日文
调用方式:
TangInterface.initLanguage(this, TangInterface.Language.ENGLISH);
TangInterface.initLanguage(this, TangInterface.Language.CHINESE);
LanguageSettingUtil.getInstance(context).saveLanguage(LanguageSettingUtil.JAPANESE);
提供宿主单独设置日志存放路的方法。(宿主需要正确设置日志存放的路径,否则不能提供有效的日志信息)
API:
TangInterface.setLogPath(String logPath)
参数说明:
logPath:正确的日志存放路径
调用方式:
// 该方法需要在Application的onCreate方法中调用。需要在调用TangSdkApp.initSdk()方法之前调用
@Override
public void onCreate() {
TangInterface.setLogPath(xxx);
}
默认情况下,如果不调用该方法,云会议SDK会使用自己设定的日志路径。
注意:如果宿主App直接继承云会议SDK自身的Application(即TangSdkApp),那么setLogPath()方法需要在调用super.onCreate()方法之前调用
在初始化完成后,即可在需要加入会议的代码中调用入会的API。
API
void joinConference(Context context, ConferenceReq conferenceReq, final TangCallback<String> mCallback)
参数说明
参数名 | 说明 |
---|---|
context | 上下文对象,当前fragment或者activity |
conferenceReq | 会议请求实体对象 |
mCallback | 调用成功与否的回调 |
ConferenceReq.java详细参数说明:
参数名 | 说明 | 必须 |
---|---|---|
name | 用户名,会中显示的用户名 | name和email可以二选一 |
用户邮箱 | name和email可以二选一 | |
pcode | 入会密码。参会人密码 或 主持人密码 | 是 |
userID | 如果传入userId, 云会议服务器会根据传入的userId匹配全时用户系统中的用户信息, 参会人姓名以全时系统中用户名为准 |
否 |
iconUrl | 入会头像链接。 为空使用该用户自己设定的头像 |
否 |
conferenceId | 会议ID,如果该会议是预约会议必须要传 | 是(预约会议) |
from | 入会来源 | 否 |
isShowInvite | 控制是否显示 邀请参会人 | 否 |
isShowChat | 控制是否显示聊天按钮 | 否 |
allowUserChooseVoiceType | 控制SDK语音选择方式(不设置的情况下,根据帐号配置生效)。该参数为枚举类型,具体取值会在下面具体介绍 | 否 |
preferredVoiceType | 设置默认入会语音连接方式 | 否 |
pstnCallNumber | 默认入会方式为PreferredVoiceType.PSTN时,设置该参数,即可直接拨打该手机号入会 | 否 |
mInvitationCall | 设置自定义邀请UI,不设置默认参考invitationType参数,参考13 | 否 |
invitationType | 设置使用云会议端自带通讯录。如果没有自定义邀请的UI,通过改参数查看类型参考14 | 否 |
AllowUserChooseVoiceType.java说明:
取值 | 说明 |
---|---|
AllowUserChooseVoiceType_Nil | |
AllowUserChooseVoiceType_PSTN_VOIP | 电话+VoIP |
AllowUserChooseVoiceType_CallIn_VOIP | 电话主动呼入+VoIP |
AllowUserChooseVoiceType_PSTN | 仅电话 |
AllowUserChooseVoiceType_VOIP | 仅VoIP |
AllowUserChooseVoiceType_CallIn | 仅主动呼入 |
设置的allowUserChooseVoiceType值,必须是BOSS中配置的子集
BOSS配置语音方式 | 可选值 |
---|---|
AllowUserChooseVoiceType_PSTN_VOIP | AllowUserChooseVoiceType中定义的所有值 |
AllowUserChooseVoiceType_CallIn_VOIP | AllowUserChooseVoiceType_CallIn_VOIP AllowUserChooseVoiceType_VOIP AllowUserChooseVoiceType_CallIn |
AllowUserChooseVoiceType_PSTN | AllowUserChooseVoiceType_PSTN AllowUserChooseVoiceType_CallIn |
AllowUserChooseVoiceType_VOIP | AllowUserChooseVoiceType_VOIP |
AllowUserChooseVoiceType_CallIn | AllowUserChooseVoiceType_CallIn |
PreferredVoiceType.java说明:
取值 | 说明 |
---|---|
PreferredVoiceType.NONE(0) | 默认值,根据 AllowUserChooseVoiceType 来决定是下面哪种方式(推荐这种方式) |
PreferredVoiceType.NO_VOICE(7) | 不选语音方式入会 |
PreferredVoiceType.PSTN(6) | 电话语音方式入会 |
PreferredVoiceType.VOIP(1) | 以VoIP方式入会 |
BaseResp.java说明:
属性 | 说明 |
---|---|
result | 入会是否成功 |
errorCode | 入会失败的错误码 |
errorMessage | 入会失败的描述信息 |
data | 入会失败附带数据 |
调用方式:
ConferenceReq req = new ConferenceReq(userId, username, pCode);
req.setPreferredVoiceType(PreferredVoiceType.NONE); //建议设置为 NONE ,让SDK来弹出语音选择框,让用户选择语音方式入会
TangInterface.joinConference(mContext, conferenceReq, new TangCallback<String>() {
@Override
public void onCallback(BaseResp<String> baseResp) {
}
});
会中状态监听包括
API
void setMeetingStatusListener(TangCallback<MeetingStatus> mCallback)
参数说明
mCallback:回调,具体回调信息参考下面调用方式中解释
调用方式:
TangInterface.setMeetingStatusListener(new TangCallback<TangInterface.MeetingStatus>() {
@Override
public void onCallback(BaseResp<TangInterface.MeetingStatus> baseResp) {
switch (baseResp.getData()) {
case LEAVE:
// 离开会议
break;
case END:
// 结束会议
break;
case HOST_END_MEETING:
// 主持人结束会议
break;
case RE_ONLINE:
// 断线后重连成功
break;
case OFFLINE:
// 断线
break;
}
}
});
宿主app在某些情况下(单点登录),需要在其他地方调用退会功能。
API
void exitConference();
参数说明
无参数
调用方式:
TangInterface.exitConference();
设置会中显示小球,可以不退出会议的情况下进行一些其他操作。
API
void showMinimzeFucBtn(MeetingMinimze minimze)
参数说明
minimze:TangInterface.MeetingMinimze.YES 显示 TangInterface.MeetingMinimze.NO 不显示
调用方式:
TangInterface.showMinimzeFucBtn(TangInterface.MeetingMinimze.YES);//显示
TangInterface.showMinimzeFucBtn(TangInterface.MeetingMinimze.NO);//不显示
可以设定小球在屏幕内的移动范围
API
TangInterface.setFloatViewMoveArea(Rect rect)
参数:
Rect rect
包含left, top, right, bottom 四个点,用来定义一个矩形区域,规定小球的可移动范围
返回值:
boolean
true:表示设置的可移动区域有效,设置生效
false:表示设置的可移动区域无效,设置不生效,使用SDK默认的移动区域
说明:
1.不调用该接口,会使用SDK提供的默认移动区域。SDK提供的默认移动区域为状态栏以下的整个屏幕区域。
2.请确保设置的矩形区域整体位于屏幕范围内,否则设置不生效。
3.确保left比right小至少60dp的像素大小,top比bottom小至少60dp的像素大小,否则设置不生效
4.如果设置不生效,则会使用默认设置或上一次生效设置。
设置会中显示小球,可以不退出会议的情况下进行一些其他操作。
API
void setMinimzeStatusLIstener(TangCallback<TangInterface.MeetingMinimzeStatus> mCallback)
参数说明
mCallback
调用方式:
TangInterface.setMinimzeStatusLIstener(new TangCallback<TangInterface.MeetingMinimzeStatus>() {
@Override
public void onCallback(BaseResp<TangInterface.MeetingMinimzeStatus> baseResp) {
switch (baseResp.getData()) {
case MIN:
// 最小化状态
break;
case NORMAL:
// 普通入会状态
break;
}
}
});
API
/**
* 隐藏小球,回到会中界面
*/
TangInterface.maximize(Context context)
/**
* 显示小球,隐藏会中界面
*/
TangInterface.minimize(Context context)
参数
Context context 调用接口时需要传递一个Context对象
可根据实际情况将会中界面切回前台,主要用于开启显示小球的情况
API
void bringMeetingToFront(Context context)
参数说明
context:入会界面Actvity的实例
是否有GNetTang的会议实例创建过,主要用在 同时使用 TangClientSDK.framework 和GNetTangSDK.framework 会冲突,可以调用该接口,询问一下,当前是否有会议进行中
API
boolean isConferenceCreated()
调用方式:
if (TangInterface.isConferenceCreated()) {
Toast.makeText(MainActivity.this, "isConferenceCreated", Toast.LENGTH_SHORT).show();
} else {
//入会
}
返回:true 已创建, false 未创建
宿主app通过调用这个API,进行日志提交,以供云会议SDK开发者进行问题分析。
API
void uploadLogs(LogSubmitReq req, String desc, TangCallback<String> mCallback);
参数说明:
req: (phone,email,name,userId其中一个必须要有值)
userId:用户ID
name :用户名
email:用户邮箱
phone:手机号码
desc:问题描述
mCallback:接口回调
调用方式
TangInterface.uploadLogs(userId,desc,new TangCallback<String>() {
@Override
public void onCallback(BaseResp<String> resp) {
if (resp.getResult()) {
// 上传成功
} else {
// 上传失败
}
}
});
API
/**
* 设置自定义域名
*/
TangInterface.setFeedbackEnabled(boolean enabled)
参数
说明:true 表示开启会中问题反馈功能;
false 表示关闭会中问题反馈功能
提供给宿主APP单独设置外呼邀请的UI,如果不设置默认为拨号外呼界面
对应入会参数ConferenceReq中的mInvitationCall属性
参数说明:
public interface IInvitationCall {
void inviteWithAttendList(Context context, HadInviteListBean hadInviteListBean , TangCallback<List<InvitePhoneBean>> callback);设置邀请UI
inviteDataBean:包含最大邀请和已邀请的人数等
callback:宿主方需要通过此回调,把选择的人员回调给SDK处理
void onHadAttendCountChanged(int count);会中已邀请人数的变化
count:已邀请的人数是不断变化的,宿主APP需要不断改变可以邀请的数量
}
public class HadInviteListBean{
private int totalCount;//邀请最大限制人数
private int invitedCount;//已邀请的人数
private int pcode;//(参会人pcode)
private int conferenceId;//吊起串中cid
private int tempConferenceId;//吊起串中 conf_id
private List<InvitePhoneBean> attendeeList;//已邀请人列表
}
public class InvitationBean{
private String name;//邀请人的姓名
private String phoneNumber;//邀请人的手机号码
private String userId;//邀请人的id(非必填)
}
设置是否使用云会议自带通讯录界面
对应入会参数ConferenceReq中的invitationType属性
参数说明:TangInterface.InvitationType
GNET_ADDRESS_BOOK:云会议邀请.
CALL : 拨号界面邀请
默认不设置为拨号邀请界面
具体使用可以参考Demo App(Simple)
API
/**
* 设置自定义域名
*/
TangInterface.setUniformDomain(String[] uniformHostUrls)
参数
说明:如果没有需求,请不要调用,否则会导致SDK无法正常使用
建议该方法在TangInterface.initSdk()调用以后再调用
获取sdk版本相关信息
API: TangInterface.getSdkVersion()//获取sdk版本号 TangInterface.getGnetTangVersion()//获取平台版本
方法数超过64K导致编译出现问题的解决方案如下:
1.在app的gradle中添加如下配置:
defaultConfig {
...
multiDexEnabled true
}
dependencies {
...
compile 'com.android.support:multidex:1.0.1'
...
}
2.如果你的应用程序继承 Application , 那么你需要重写并继承 MultiDexApplication
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
3.如果没有自定义的Application,则需要在AndroidManifest.xml中添加如下配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
云会议SDK提供会中界面换肤功能
API
public static void setSkin(String skinFilePath, SkinLoaderListener callback)
参数:
skinFilePath:指定皮肤包资源文件的完整路径
callback:皮肤资源加载回调,包含四个回调方法,分别为:
onStart() 加载皮肤资源前
onSuccess() 加载皮肤资源成功后的回调
onFailed(String msg) 加载失败后的回调,msg为错误信息
onProgress() 从网络下载资源包的过程,目前还没有启用
说明:
TangInterface.config().enableCrashHandler(false);
SDK默认配置是true,也就是会启用自带的异常捕获,这可能导致第三方的捕获异常功能不可用,如果出现这种情况,可禁用自带异常捕获
建议不要禁用,可以在调用TangSdkApp.init()方法后再调用第三方库的初始化方法
TangInterface.config().enableCustomerService(true);
SDK默认配置为true,会中参会列表界面下方会提供一个在线IM客服入口,用户可使用该入口在线咨询全时客服,解决会中遇到的问题。
建议开启。
TangInterface.config().enableMeetingServiceNotification(true);
SDK默认配置为true,SDK成功入会以后,会开启一个前台服务,提高云会议所在进程的存活率,尽可能降低在开会过程中app被杀掉的风险。
开启该配置以后,入会成功会在系统通知栏显示一个通知,无法手动关闭。
建议开启。
###19.4 开启会后营销
TangInterface.config().enableAccountApply(true);
SDK默认配置为false,SDK退会以后,如果该设置为true,并且为非登录状态,会弹出申请云会议正式帐号的弹框界面。
请根据自身产品需求,考虑是否开启
###19.5 显示会议信息
TangInterface.config().setShowConfInfo(true);
SDK默认配置为true,如果该设置为false,入会后的参会列表下方的功能菜单中将不会出现查看会议信息的入口。
错误码
错误码 | 说明 |
---|---|
40001 | 没有麦克风权限 |
40010 | 会议入会调起串错误 |
40011 | 获取会议信息失败 |
40012 | 入会姓名格式不正确 |
40020 | 当前手机系统为X86,目前不支持 |
40030 | 入会失败 |
15007 | 取消入会 |
17000 | 语音类型设置错误 |
17001 | 正在入会中,请不要重复入会 |
1.开发IDE使用Android Studio
2.云会议的SDK资源文件以gnet_ / Gnet开头 ,为防止覆盖文件,请避免此开头字段;
3.云会议的SDK初始化的dependencies引用需要相同的版本号,尽可能保持其他第三方依赖库版本号相同
6.因为全时云会议在会中会可能需要使用到音频(麦克风,喇叭) , 视频(摄像头) , 请避免这些资源的竞争
7.关于混淆:将aar包排除在混淆之外[-keep class com.quanshi]