用户工具

video_sdk:androidsdkguide

Android SDK 开发指南

本指南一共包含以下七块信息:

第一节. 前言

在您阅读此文档时,我们假定您已经具备了基础的Android应用开发经验,并能够理解相关基础概念以及会使用eclipse等开发工具。 在讲解VideoSDK的集成过程中,我们会以云之讯Demo 为例进行讲解。云之讯Demo是VideoSDK和IMSDK的集成示例demo,开发者可以参考demo的集成用法,我们也鼓励开发者根据自己的需求进行调整。
云之讯Video SDK为开发者提供基础的Video通讯能力,开发者使用SDK快速接入通讯能力。云之讯Demo是VideoSDK与IMSDK的示例Demo, 我们强烈建议开发者在使用VideoSDK之前,先体验云之讯Demo。

第二节. 集成前准备

2.1. 注册开发者账号

开发者在集成云之讯SDK前,需在云之讯官方网站注册开发者帐号,可参考新手指引

2.2. 下载SDK

前往云之讯官网下载云之讯SDK(下载地址), SDK包括2个jar包和5个so库:

1) 音视频核心功能 jar包:yunzhixun_video_SDK_ver_x.x.x.x.jar (必须添加)

2) TCP连接jar包:yunzhixun_TCP_SDK_ver_x.x.x_release.jar (必须添加)

3) 音视频处理库:libUGo.so (必须添加)

4) 加解密序列号库:libpack.so (必须添加)

5) 视频解码库:libH264Decoder.so (可选 只使用音频功能可不添加)

6) 视频编码库:libH264Encoder.so (可选 只使用音频功能可不添加)

7) libOpenSLES.so (必须添加)

2.3. 导入SDK库

2.3.1

在eclipse中新建一个Android工程将SDK包中提供的yunzhixun_video_SDK_ver_x.x.x.x.jar、 yunzhixun_TCP_SDK_ver_x.x.x_release.jar包拷贝到android工程的libs目录下,将armeabi文件夹下的所有so文件拷贝到android工程libs目录下的armeabi目录下,放置位置如下图所示:

2.3.2

Jar包加入到Build Path中,如下图:

2.3.3

把导入包勾选 如果执行了Add to Build Path 仍然无法使用jar包,请指向自己的工程,点击鼠标右键,选择Properties目录—>选择Java BuildPath目录—>Order and Export把导入的包勾选—>按下OK,效果如下图:

2.4. 添加SDK权限和核心控制器

  •  将下列权限配置添加到Android工程中的AndroidManifest文件中
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CAMERA" />
 
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
  •  将下表Service与Receiver配置到工程中的AndroidManifest文件中
    <service android:name="com.yzxtcp.service.YzxIMCoreService" />
    <receiver android:name="com.yzxtcp.tools.tcp.receiver.AlarmReceiver" >
    </receiver>
    <receiver android:name="com.yzxtcp.tools.tcp.receiver.MsgBackReceiver" >
    </receiver>
    <receiver android:name="com.yzx.tools.RtppReceiver" />

第三节. 快速集成

3.1 SDK初始化

在整个应用中初始化只需要执行一次,建议在Application中执行,以下是建议的初始化形式:

  •  新建MyApplication.java 并继承自Application
    public class MyApplication extends Application {
 
	@Override
	public void onCreate() {
		super.onCreate();
		//SDK初始化
		UCSService.initAction(this);
		UCSService.init(this, true);
	}
    }
  •  在AndroidManifest.xml文件中添加MyApplication android:name=”.MyApplication”
    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

3.2 添加监听器

在使用音视频功能前请先添加好音视频状态接口,接口说明请参考音视频回调接口

接口设置可参考下列代码:

    UCSCall.addCallStateListener(new CallStateListener() {
 
			@Override
			public void singlePass(int reason) {
			//单通发生时回调
			}
			@Override
			public void onRemoteCameraMode(UCSCameraType cameraType) {
				//对端视频模式回调
			}
			@Override
			public void onNetWorkState(int reason, String message) {
				//通话中网络状态上报
			}
			@Override
			public void onIncomingCall(String callId, String callType,
					String callerNumber, String nickName, String userdata) {
				//有新的来电
			}
			@Override
			public void onHangUp(String callId, UcsReason reason) {
				//呼叫被释放
			}
			@Override
			public void onDialFailed(String callId, UcsReason reason) {
				//呼叫失败
			}
			@Override
			public void onDTMF(int dtmfCode) {
				//dtmf回调
			}
			@Override
			public void onCameraCapture(String videoCapFilePath) {
				//视频会话截屏回调
			}
			@Override
			public void onAnswer(String callId) {
				//接通时回调
			}
 
			@Override
			public void onAlerting(String callId) {
				//对方振铃中回调
			}
		});

3.3 连接云之讯服务器

依赖前提条件SDK初始化完成

  • 获取TOKEN

token方式登入(所有关于云之讯IM的操作都必须在登入成功后才能使用) token 称为用户令牌, token 则是您 App 上的每一个用户的身份授权象征,使用这个 token 作为该用户的唯一身份凭证与其他用户进行通信。 token是从AS服务器(用户服务器,您必须拥有自己的服务器)获取,token由AS服务器按照一定规则生成。 注意:这个TOKEN不是注册开发者账号时获得的TOKEN, 具体可参考IM服务端API介绍及接入

  • 获取到TOKEN后就可以使用下面方法接入服务器了:
        UCSManager.connect(token,	new ILoginListener() {
		@Override
		public void onLogin(UcsReason reason) {
			if (reason.getReason() == UcsErrorCode.NET_ERROR_CONNECTOK) {
				//登陆成功
			} else {
				//登陆失败
			}
		}
	});
  • 账户密码方式登入(仅限老平台用户继续使用,新接入者无需关心这种登入方式)
    UCSManager.connent(String sid, String sidPwd,String clientId,String clientPwd,new ILoginListener() {
    @Override
    public void onLogin(UcsReason reason) {
       if (reason.getReason() == UcsErrorCode.NET_ERROR_CONNECTOK) {
				//登陆成功
		} else {
				//登陆失败
		}
    }
});

3.4 拨打VOIP语音电话

前提条件:以下所有功能的调用都必须满足以下条件

  1. 连接服务器成功(调用UCSManager.connect()并返回UcsErrorCode.NET_ERROR_CONNECTOK)
  • 关键功能API说明:
/**
    * 发起一个呼叫
    * @param mContext:上下文
    * @param callType: VOIP:语音    VIDEO:视频
    * @param calledNumner:用户clientId或者手机号码
    * @param userdata: 自定义透传数据(用于需要借助PaaS平台透传数据给AS服务器或者被叫方,最大长度128字节)  可设置为””
*/
UCSCall.dial(Context mContext,CallType callType,String calledNumner,String userdata)
  • 拨打VOIP语音电话实例代码调用
UCSCall.dial(mContext,UCSCall.CallType.VOIP, “15845678988”,””);
  • 响应回调
public void onAlerting(String callId) {
	//对方振铃中回调
}
 
public void onAnswer(String callId) {
	//对方接通时回调
}
 
public void onHangUp(String callId, UcsReason reason) {
	//对方拒接或挂断电话
}
 
public void onDialFailed(String callId, UcsReason reason) {
	//呼叫失败
}

3.5 拨打视频电话

关键功能API说明

初始化视频设置

/**
     *初始化视频配置
     * @param mActivity 用于显示视频的activity
     * @param remoteLinearLayout:显示对方视频的布局(LinearLayout)
     * @param localLinearLayout:显示自己视频的布局(LinearLayout)
*/
void initCameraConfig(Activity mActivity, LinearLayout remoteLinearLayout, LinearLayout localLinearLayout)

刷新摄像头参数参考UCSCameraTypeUCSFrameType

/**  注意:必须在主线程才能调用
     * 刷新摄像头
     * @param cameraType:要刷新摄像头的枚举
     * @param frameType: 是否加上边框的枚举
     * @return
*/
int refreshCamera(UCSCameraType cameraType, UCSFrameType frameType)

UCSCall.dial()函数说明参考函数说明参考

  • 拨打视频电话实例
mBtnCallVideo.setOnClickListener(new OnClickListener() {
 
			@Override
			public void onClick(View v) {
				//开启免提
				UCSCall.setSpeakerphone(MainActivity.this, true);
				//初始化视频配置 必须调用
				UCSCall.initCameraConfig(MainActivity.this, remotelayout,
						locallayout);
				//发起视频呼叫
				UCSCall.dial(MainActivity.this, CallType.VIDEO, "13428702535",
						"");
			}
});
 
当对方响铃后就可以调用
//开启本地视频显示  该方法必须在主线程调用
UCSCall.refreshCamera(UCSCameraType.LOCALCAMERA,	UCSFrameType.FRAME);
 
当对方接通后就可以调用
//刷新本地和远端视频显示  该方法必须在主线程调用
UCSCall.refreshCamera(UCSCameraType.ALL, UCSFrameType.FRAME);
 
 
布局参数定义
private LinearLayout remotelayout, locallayout;
remotelayout = (LinearLayout) findViewById(R.id.remotelayout);
locallayout = (LinearLayout) findViewById(R.id.locallayout);

在要显示视频的布局文件中加入如下代码 视频布局文件可参考

<LinearLayout
        android:id="@+id/remotelayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal" >
    </LinearLayout>
 
    <LinearLayout
        android:id="@+id/locallayout"
        android:layout_width="96dip"
        android:layout_height="144dip"
        android:layout_alignParentRight="true"
        android:layout_marginRight="10dp"
        android:background="#7F7F7F"
        android:orientation="horizontal" >
</LinearLayout>

3.6 有新的来电

void onIncomingCall(String callId, String callType, String callerNumber ,String nickName,String userdata)

3.7 拒接或挂断电话

/**
     * 拒接或挂断电话
     * @param mContext:上下文
     * @param callId:当前通话ID 可以设置为””
*/
 
UCSCall.hangUp(Context mContext, String callId);

3.8 接通电话

/**
     * 接通电话
     * @param mContext:上下文
     * @param callId:当前通话ID 可以设置为””
*/
 
UCSCall.answer(Context mContext, String callid);

页面工具