Android SDK

本文为您介绍Android系统集成SDK的方法。

前提条件

已开通音视频通信服务。具体操作,请参见开通服务

环境要求

  • 系统版本:支持Android 4.1及以上版本。

  • API版本:支持16及以上版本。

  • CPU架构:支持实体设备架构armeabi-v7a、arm64-v8a。

  • 其他:不支持视频采集旋转,不支持USB外接摄像头。

步骤一:设备端集成SDK

  1. 在根目录的build.gradle文件中添加Maven仓库地址。

    allprojects { 
       repositories { 
         jcenter()
         google()
         // 阿里云仓库地址
         maven { 
                url "http://maven.aliyun.com/nexus/content/repositories/releases/" 
            }
        }
    }
  2. /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'
  3. /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"/> 
  4. (可选)在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文件中实现如下功能:

  1. 初始化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类的实例。具体请参见:回调及监听

  2. 注册信令回调函数。

    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);
  3. 主叫方发起通话。

            ChannelInfo channel = new ChannelInfo();
            channel.guestList = new ArrayList<>();
            GuestInfo info = new GuestInfo(guestPk, guestDn);
            channel.guestList.add(info);
            rtc.launchChannel(channel);//主叫方调用API发起通话
  4. 主叫方结束通话。

            if(null != mChannelId) {
                ALog.d(TAG,"cancle called");
                rtc.cancelChannel(mChannelId);//在需要结束通话的地方调用该API结束通话。
            }
  5. 设置日志级别,方便后续问题定位。

    com.aliyun.alink.linksdk.tools.ALog.setLevel(ALog.LEVEL_DEBUG);

步骤三:通信监测

在音视频通信增值服务的服务详情页面,查看通信监测信息,例如通话总时长、通话产生的时间等。通信监测

阿里云首页 物联网平台 相关技术圈