Android端实时音视频开发指南

简介

yun2win-sdk-Android提供Android端实时音视频完整解决方案,方便客户快速集成实时音视频功能. SDK 提供的能力如下:

  • 发起
  • 加入
  • AVClient
  • Channel
  • AVMember

开发准备

  • 到 github下载yun2winSDK及demo
  • 下载源码详解

    app为主体显示Module uikit为公共服务Module

    app下libs的yun2win-av-0.1.jar为音视频,屏幕共享SDK

    主体Module结构图

    base文件夹:app初始相关类

    Bridge文件夹:推送连接、接收和发送

    common文件夹:公共配置等

    db文件夹:数据库管理

    entities文件夹:实体集合

    manage文件夹:模型实体管理

    model文件夹:模型集合

    service文件夹:服务管理

    ui文件夹:界面相关

  • 配置信息

    在清单文件AndroidManifest.xml里加入以下权限,以及写上你注册的appkey

    权限配置(实际开发中可能需要更多的权限,可参考demo):

    复制
       
    <?xml version="1.0" encoding="utf-8" ?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yun2win.demo">
            <!-- 加入应用需要的权限 -->
            <!-- 网络相关 -->
            <uses-permission android:name="android.permission.INTERNET" />
            <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
            <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
            <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
            <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
            <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
            <uses-permission android:name="android.permission.WRITE_SETTINGS" />
            <!-- 手机状态 -->
            <uses-permission android:name="android.permission.GET_TASKS" />
            <uses-permission android:name="android.permission.FLASHLIGHT" />
            <uses-permission android:name="android.permission.VIBRATE" />
            <uses-permission android:name="android.permission.WAKE_LOCK" />
            <uses-permission android:name="android.permission.BLUETOOTH" />
            <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
            <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
            <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
            <!-- 读写文件 -->
            <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
            <!-- 多媒体 -->
            <uses-permission android:name="android.permission.CAMERA" />
            <uses-permission android:name="android.permission.RECORD_AUDIO" />
            <uses-permission android:name="android.permission.READ_PHONE_STATE" />
            <application android:name="y2w.base.AppContext"
            android:allowbackup="true"
            android:icon="@drawable/lyy_icon"
            android:label="@string/app_name"
            android:theme="@style/AppTheme">
                <!-- 设置yun2win应用的appkey -->
                <meta-data android:name="YUN2WIN_APP_KEY"
                android:value="CerAgk970T8MlUmz" /> 
            </application>
    </manifest>

    关于YUN2WIN_APP_KEY对应的value获取,在创建应用后,申请APPKEY并进行相关配置。

  • app打包混淆

    在proguard文件中加入以下keep

    -keep class com.yun2win.** {*;}

    -dontwarn com.yun2win.**

初始化

将以下代码复制到项目Application类onCreate()中

复制

AVClient.init(this);

发起

调用以下代码创建频道:

复制

private void createChannel(){

        avClient = new AVClient(currentUser.getEntity().getId(), currentUser.getEntity().getName(), currentUser.getEntity().getAvatarUrl(),currentUser.getImToken().getAccessToken());
        //创建频道
        avClient.createChannel(new AVBack.Result() {
            @Override
            public void onSuccess(Channel channel) {
                avChannel = channel;
                avChannel.setOnMembersChangedListener(new MembersChangedListener());
                avChannel.setOnVideoListener(new VideoListener());
                avChannel.setOnAudioListener(new AudioListener());
                avChannel.setOnScreenListener(new ScreenListener());
                avChannel.join();//加入通知
                memberNotice(memberIds);
                if(callType.equals(EnumManage.AvCallType.video.toString())){
                    handler.sendEmptyMessage(Oper.OpenVideo);
                    handler.sendEmptyMessage(Oper.OpenAudio);
                }else{
                    handler.sendEmptyMessage(Oper.OpenAudio);
                }
            }
            @Override
            public void onError(Integer integer) {
                noticeShow("创建频道失败");
            }
        });
    }

加入

调用以下代码加入频道:

复制

                                                                       
private void getChannel(String channelId){

        avClient = new AVClient(currentUser.getEntity().getId(),currentUser.getEntity().getName(), currentUser.getEntity().getAvatarUrl(), currentUser.getImToken().getAccessToken());
        //获取频道
        avClient.getChannel(channelId, new AVBack.Result() {
            @Override
            public void onSuccess(Channel channel) {
                avChannel = channel;
                avChannel.setOnMembersChangedListener(new MembersChangedListener());
                avChannel.setOnVideoListener(new VideoListener());
                avChannel.setOnAudioListener(new AudioListener());
                avChannel.setOnScreenListener(new ScreenListener());
                avChannel.join();//加入通知
                if (callType.equals(EnumManage.AvCallType.video.toString())) {
                    handler.sendEmptyMessage(Oper.OpenVideo);
                    handler.sendEmptyMessage(Oper.OpenAudio);
                } else {
                    handler.sendEmptyMessage(Oper.OpenAudio);
                }
            }
            @Override
            public void onError(Integer integer) {
                noticeShow("获取频道失败");
            }
        });
    }

提醒

加入方法必须填入需要加入的channelId。

Channel

频道类:主要方法,其他查看API手册

复制

                                                                       
join()
加入频道
void	leave()
离开频道
void	openAudio()
开启语音
void	openVideo()
开启视频
void	setMute(boolean mute)
设置静音
void	setOnAudioListener(Channel.OnAudioListener onAudioListener)
设置音频监听
void	setOnMembersChangedListener(Channel.OnMembersChangedListener onMembersChangedListener)
设置成员变更监听
void	setOnScreenListener(Channel.OnScreenListener onScreenListener)
设置屏幕共享监听
void	setOnVideoListener(Channel.OnVideoListener onVideoListener)
设置视频监听
void	setSpeaker(boolean speaker)
设置扬声器
void	switchCamera()
转摄像头

AVMember

频道成员类:主要方法,其他查看API手册

复制

                                                                       
org.webrtc.VideoTrack	getScreenTrack()
获取屏幕共享流
java.lang.String	getUid()
获取成员唯一标识码
org.webrtc.VideoTrack	getVideoTrack()
获取视频流
boolean	isAudioMuted()
是否开启静音
boolean	isAudioOpened()
是否开启语音
boolean	isScreenOpened()
是否开屏幕共享
boolean	isVideoOpened()
是否开启视频
void	setAudioMuted(boolean audioMuted)
设置是否静音
void	setAudioOpened(boolean audioOpened)
设置是否开启语音
void	setScreenOpened(boolean screenOpened)
设置屏幕共享
void	setScreenTrack(org.webrtc.VideoTrack screenTrack)
设置屏幕共享流
void	setUid(java.lang.String uid)
设置成员唯一标识码
void	setVideoOpened(boolean videoOpened)
设置是否开启视频
void	setVideoTrack(org.webrtc.VideoTrack videoTrack)
设置视频流
从类继承的方法 java.lang.Object

注意事项

复制

1.创建或者获取Channel对象后,都需要调用join方法加入频道进行实时通讯.
2.为确保接收到所有回调,设置相应监听应该在调用join方法之前.
3.SDK不会自动开启音频视频屏幕共享和白板功能,开发时根据需求调用各功能.
4.屏幕共享功能在移动端暂时不能主动发起.

用户手册

AVSDK手册

 

原文地址:https://www.cnblogs.com/yun2win/p/5780872.html