Android SDK
本文为您介绍Android系统集成SDK的方法。
前提条件
已开通音视频通信服务。具体操作,请参见开通服务。
环境要求
系统版本:支持Android 4.1及以上版本。
API版本:支持16及以上版本。
CPU架构:支持实体设备架构armeabi-v7a、arm64-v8a。
其他:不支持视频采集旋转,不支持USB外接摄像头。
步骤一:设备端集成SDK
在根目录的
build.gradle
文件中添加Maven仓库地址。allprojects { repositories { jcenter() google() // 阿里云仓库地址 maven { url "http://maven.aliyun.com/nexus/content/repositories/releases/" } } }
在
/app/build.gradle
文件中添加如下内容,引入音视频功能依赖的库文件。implementation 'com.aliyun.alink.linksdk:iot-linkkit:1.7.3-rtc' implementation 'com.aliyun.alink.linksdk:iot-device-manager:1.7.5.4-feat4-rtc' implementation 'com.aliyun.alink.linksdk:public-channel-core:0.7.7.1'
在
/app/src/main/AndroidManifest.xml
文件中添加如下代码,获取相应的设备权限。<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
(可选)在
proguard-rules.pro
文件中,添加-keep
类配置,防止代码混淆。-keep class com.serenegiant.**{*;} -keep class org.webrtc.**{*;} -keep class com.alivc.**{*;} # linkkit API -keep class com.aliyun.alink.**{*;} -keep class com.aliyun.linksdk.**{*;} -dontwarn com.aliyun.** -dontwarn com.alibaba.** -dontwarn com.alipay.** -dontwarn com.ut.** # keep native method -keepclasseswithmembernames class * { native <methods>; } # keep netty -keepattributes Signature,InnerClasses -keepclasseswithmembers class io.netty.** { *; } -keepnames class io.netty.** { *; } -dontwarn io.netty.** -dontwarn sun.** # keep mqtt -keep public class org.eclipse.paho.**{*;} # keep fastjson -dontwarn com.alibaba.fastjson.** -keep class com.alibaba.fastjson.**{*;} # keep gson -keep class com.google.gson.** { *;} # keep network core -keep class com.http.**{*;} -keep class org.mozilla.**{*;} # keep okhttp -dontwarn okhttp3.** -dontwarn okio.** -dontwarn javax.annotation.** -dontwarn org.mozilla.** -keep class okio.**{*;} -keep class okhttp3.**{*;} -keep class org.apache.commons.codec.**{*;} -keep class com.aliyun.alink.devicesdk.demo.FileProvider{*;} -keep class android.support.**{*;} -keep class android.os.**{*;}
步骤二:实现通信功能
在AliRtcChatActivity.java
文件中实现如下功能:
初始化SDK。
//初始化数据通道和信令通道 private void initRTCEngineAndStartPreview() { //默认不开启兼容H5 AliRtcEngine.setH5CompatibleMode(0); // 防止初始化过多 if (mAliRtcEngine == null) { //实例化,必须在主线程进行。 mAliRtcEngine = AliRtcEngine.getInstance(getApplicationContext()); //设置事件的回调监听 mAliRtcEngine.setRtcEngineEventListener(mEventListener); // //设置接受通知事件的回调 mAliRtcEngine.setRtcEngineNotify(mEngineNotify); //初始化信令通道 rtc.init(getApplicationContext()); if(mAudioModeOnly){ int ret = rtc.getRtcEngine().setAudioOnlyMode(true); if(ret != 0){ ALog.e(TAG, "set failed audio only " + ret); } } // 初始化本地视图 initLocalView(); //开启预览 startPreview(); } }
说明mAliRtcEngine:主要用于操作音视频数据流,为AliRtcEngine类的实例。具体请参见:AliRtcEngine接口。
mEventListener:主要用于本地用户操作回调及监听,为AliRtcEngineEventListener类的实例。具体请参见:回调及监听。
mEngineNotify:主要用于SDK事件通知,如对方用户上下线通知等,为AliRtcEngineNotify类的实例。具体请参见:回调及监听。
注册信令回调函数。
void setRemoteListener(){ RemoteClientListener devListener = new RemoteClientListener() { //被呼叫方收到通话邀请的回调 public void onInvitationArrived(Invitation invitation){ ALog.d(TAG,"guest session starts"); rtc.guestResponse(RtcAction.GUEST_ACCEPT, invitation.getCallerIotId(), invitation.getChannelId()); mChannelId = invitation.getChannelId(); mCallerIotId = invitation.getCallerIotId(); }; //主叫方发起通话后获得服务端批准的回调 public void onChannelRequestGranted(String identifier, Invitation invitation) { ALog.d(TAG,"host session starts"); mChannelId = invitation.getChannelId(); mCallerIotId = invitation.getCallerIotId(); } //主叫方收到服务端返回的通话响应的回调,比如accept(接受),reject(拒绝)等。 public void onCalleeResponse(RtcAction action, GuestInfo guestInfo, String channelId, String message){ //对设备端的动作 if(null != action) { ALog.d(TAG, "peer action:" + action.getName()); } //服务端附加的消息 if(null != message){ ALog.d(TAG, "peer message:" + message); } //对设备端的身份校验 if(null != guestInfo){ ALog.d(TAG, "peer guest key:" + guestInfo.productKey); ALog.d(TAG, "peer guest name:" + guestInfo.deviceName); } ALog.d(TAG, "peer channelId:" + channelId); }; }; //向信令服务器注册这些回调 rtc.setRemoteListener(devListener); }
ILinkKitConnectListener listener = new ILinkKitConnectListener() { @Override public void onError(AError error) { ALog.d("connect", "connect failed"); } @Override public void onInitDone(Object data) { ALog.d("connect", "oninitdone"); // 注册远程消息的回调 setRemoteListener(); } }; InitManager.initMqtt(getApplicationContext(), productKey, deviceName, deviceSecret, mqttServerUrl, listener);
主叫方发起通话。
ChannelInfo channel = new ChannelInfo(); channel.guestList = new ArrayList<>(); GuestInfo info = new GuestInfo(guestPk, guestDn); channel.guestList.add(info); rtc.launchChannel(channel);//主叫方调用API发起通话
主叫方结束通话。
if(null != mChannelId) { ALog.d(TAG,"cancle called"); rtc.cancelChannel(mChannelId);//在需要结束通话的地方调用该API结束通话。 }
设置日志级别,方便后续问题定位。
com.aliyun.alink.linksdk.tools.ALog.setLevel(ALog.LEVEL_DEBUG);
步骤三:通信监测
在音视频通信增值服务的服务详情页面,查看通信监测信息,例如通话总时长、通话产生的时间等。