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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何设置照片的高度没有滚条_基金定投选几只合适,如何设置止盈止损,有没有好的组合推荐?...

【自荐】萌萌的猪猪侠&#xff1a;一个用自己的语言&#xff0c;自己的感受&#xff0c;自己的实盘分享投资理财的自媒体。【说会话】山色空蒙雨亦奇。住在山脚下就能看到这样美丽的景色。这或许是最近比较好的风景呢。昨天看朋友的朋友圈&#xff0c;朋友的父母没有抗过新冠肺…

Spring开发环境搭建和第一个示例程序

前言 虽然之前用过Spring&#xff0c;但是今天试着去搭建依然遇到了困难&#xff0c;而且上网找教程&#xff0c;很多写的是在web里使用Spring MVC的示例&#xff0c;官方文档里的getting start一开始就讲原理去了&#xff08;可能打开的方法不对&#xff09;。没办法&#xf…

渗透测试流程(单台服务器)

渗透测试流程&#xff08;单台服务器&#xff09; 转载于:https://www.cnblogs.com/sky--/p/5781432.html

python实战项目前后端分离flask_Flask Vue 构建前后端分离的应用

Hello, this is a home page rendered by Jinja2 Template Engine.

windows 7搭建流媒体服务

前言 下了一部几G的高清影片&#xff0c;但是手机的存储卡却只有2G,放不下怎么办&#xff1f;或者电脑里有好几百首歌&#xff0c;移到手机里播放就麻烦了&#xff0c;有没有办法直接播放电脑里的音乐呢&#xff1f;又或者&#xff0c;在床上躺着&#xff0c;想要控制电脑里的歌…

spring depends-on 不起作用

beans-realation.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.springframework…

使用Jedis源码生成Jedis.jar

前言 现在github上很多项目都使用maven工程来发布&#xff0c;没有jar包&#xff0c;所以下载下源码之后&#xff0c;还要自己打包成jar包形式以便引用。这个文档可以简略描述打包的过程 打包步奏 首先要在电脑上安装Maven并且安装eclipse Maven插件打开Eclipse&#xff0c;Fi…

python break跳出外层_失去循环标记的Python,我这样实现跳出外层循环

不完美的Python 自从各类Python大火&#xff0c;感觉天上地下哪儿都有Python的一席之地&#xff0c;Python功夫好啊…但python有些细节上缺少其他语言的便利。今天我们就来举几个例子。 跳出外层循环 大家都知道&#xff0c;在Java中存在标签的概念&#xff0c;当我们存在多层循…

获取toast值

/** * 获取Toast的String值 * return */ public String getToast(int timeout){ TextView toastTextView null; String toastText ""; long endTime SystemClock.uptimeMillis() timeout; while(SystemClock.uptimeMillis() < endTime){ toastTextView (Text…

Redis windows学习(一)——redis安装和基础使用

前言 最近做项目时&#xff0c;打算用Redis做缓存服务器&#xff0c;于是研究了一下Redis。由于项目是在windows下&#xff0c;也不打算开个虚拟机&#xff0c;所以就直接安装在windows下。虽然&#xff0c;Redis官网并不提供windows版本&#xff0c;但还是指明了可以在微软开…

button 隐藏属性_PyQt5实现仿QQ贴边隐藏功能!有点意思

此程序大致功能为&#xff1a;可变换颜色&#xff0c;贴边隐藏。变换颜色思路QPalette( [ˈplət] 调色板)类相当于对话框或控件的调色板&#xff0c;它管理着控件或窗体的所有颜色信息&#xff0c;每个窗体或控件都包含一个QPalette对象&#xff0c;在显示时按照它的QPalette对…

query的list()和iterate()区别 面试题

query的list()和iterate()区别 1.返回的类型不一样&#xff0c;list返回List&#xff0c;iterate返回iterator 2.查询策略不同。 获取数据的方式不一样&#xff0c;list会直接查询数据库&#xff0c;iterate会先到数据库中把id取出来&#xff0c;然后真正要遍历某个对象的时候…

Redis windows学习(二)——Redis持久化的AOF模式和RDB模式

AOF和RDB是什么 Redis进行操作时&#xff0c;有两种方式将操作的结果保存下来。一种是将结果以快照的方式保存在二进制文件中&#xff08;默认叫&#xff1a;dump.rdb* &#xff09;&#xff0c;这就是RDB模式&#xff0c;另一种是将操作的命令追加到一个记录文件里&#xff0…

java+eclipse+selenium环境搭建

这几天在学selenium&#xff0c;大头虾的我。安装环境还是遇到了挺多问题&#xff0c;赶紧来记录下。不然下次又。。。&#xff08;参考虫师的《Selenium2 Java自动化测试实战》&#xff09;&#xff0c;就随便写写加深下自己的印象。 1、安装java 访问java官网下载jdk http://…

unity socket传输图片_python3实现socket传输图片

我最近在做一个项目的时候需要把树莓派上的摄像头拍摄的图片实时传输到我的PC上我想通过socket完成这个功能我找了找网上的代码&#xff0c;好多都是python2.x版本的&#xff0c;或者是图片总是传不过来的&#xff0c;只能自己写了一个我先附上我的源代码&#xff0c;再来聊一聊…

Spring AOP编程问题:下面代码哪里错了?可以考验对Spring AOP的实现机制是否了解的

引言 刚刚开始学Spring AOP&#xff0c;按照教程配置好之后&#xff0c;可以像正常方法那样执行&#xff0c;却怎么也不会执行切面的方法。去群里问了一下&#xff0c;结果也没有解决。然后自己慢慢的试&#xff0c;终于发现了原因。 下面是一段有问题的代码&#xff0c;只有…

System.Web.HttpContext.Current.Session为NULL解决方法

http://www.cnblogs.com/tianguook/archive/2010/09/27/1836988.html 自定义 HTTP 处理程序&#xff0c;从IHttpHandler继承&#xff0c;在写System.Web.HttpContext.Current.Session["Value"]的时 候&#xff0c;没有问题&#xff0c;但想将这个Session写到某个变量…

python 对象_Python中的Barrier对象

python中的Barrier对象用于等待固定数量的线程完成执行&#xff0c;然后任何特定线程才能继续执行程序。每个线程在到达Barrier时都调用wait()函数。Barrier负责跟踪wait()调用的数量。如果该数目超出了为其初始化Barrier的线程数&#xff0c;则Barrier为等待线程提供了一种继续…

Spring AOP原理浅析及入门实例

上篇问题及Spring AOP实现原理浅析 上篇说了一个AOP编程问题&#xff0c;那是一个错误的AOP案例。它的错误在A类中&#xff0c;再次粘贴A类代码&#xff1a; Componentpublic class AImpl implements A{public void doing() {System.out.println("hello");}public s…

AE CreateFeatureClass 创建shp. 删除shp. 向shp中添加要素

/// <summary>/// 创建多边形shp/// </summary>/// <param name"pPolygon"></param>/// <param name"shpPath"></param>public static void CreatePolygonFeatureClass(IPolygon pPolygon, string shpfolder,string …