|—src
|—main
|—AndroidManifest.xml
|—java
|—io
|—agora
|—tutorials1v1vcall
|—VideoChatViewActivity.java
|—jniLibs
|—arm64-v8a
|—PLACEHOLDER
|—armeabi-v7a
|—PLACEHOLDER
|—x86
|—PLACEHOLDER
|—res
|—drawable-xxxhdpi
|—btn_end_call.png
|—btn_mute.png
|—btn_switch_camera.png
|—btn_video.png
|—btn_voice.png
|—ic_launcher.png
|—layout
|—activity_video_chat_view.xml
|—values
|—colors.xml
|—dimens.xml
|—strings.xml
|—styles.xml
|—build.gradle
|—gradle
|—wrapper
|—gradle-wrapper.jar
|—gradle-wrapper.properties
|—gradle.properties
|—gradlew
|—gradlew.bat
|—images
|—ActivityViewChat.png
|—LICENSE.md
|—README.md
|—README.zh.md
|—settings.gradle


2.查看最项目的settings.gradlebuild.gradle(最外层)

如果你想导入AS中查看,可以看一下com.android.tools.build:gradle的版本修改一下

---->[settings.gradle]----------------看一下项目包含的模块------------
include ‘:app’

---->[build.gradle]----------------看一下项目的一些信息------------
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath ‘com.android.tools.build:gradle:3.1.4’
}
}
allprojects {
repositories {
jcenter()
google()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}


3.查看模块下的build.gradle

---->[app/build.gradle]----------------看一下项目的具体信息------------
apply plugin: ‘com.android.application’
android {
compileSdkVersion 26
defaultConfig {
applicationId “io.agora.tutorials1v1vcall”
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName “1.0”
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
sourceSets {//这里是jniLibs的目录
main {
jniLibs.srcDirs = [’…/…/…/libs’]
}
}
}

dependencies {//这里是依赖
implementation fileTree(dir: ‘…/…/…/libs’, include: [’*.jar’]) // DO NOT CHANGE, CI may needs it when packaging
implementation ‘com.android.support:appcompat-v7:26.1.0’
}


4.查看AndroidManifest.xml,得到入口Activity

可见示例的入口是VideoChatViewActivity,并看一下权限

|— 权限 ------------


三、创建IChat项目


1、配置项目

项目的配置如图,将依赖包以及.so文件放在对应位置

为了方便些,将res文件夹的资源拷贝一下


2、配置APP ID


3.视频通话Activity的分析

一共也就200多行,还包括一大坨权限申请的代码,这里权限申请的代码单独拎出来,就当复习一下。

3.1:权限申请(非要点,可忽略)

---->[成员变量]----------------------------------
private static final int PERMISSION_REQ_ID = 22;
//WRITE_EXTERNAL_STORAGE 权限只是为了保存日志到SD卡
private static final String[] REQUESTED_PERMISSIONS = {
Manifest.permission.RECORD_AUDIO,//录音权限
Manifest.permission.CAMERA,//相机权限
Manifest.permission.WRITE_EXTERNAL_STORAGE//SD卡写权限
};

if (checkSelfPermission(REQUESTED_PERMISSIONS[0], PERMISSION_REQ_ID) &&
checkSelfPermission(REQUESTED_PERMISSIONS[1], PERMISSION_REQ_ID) &&
checkSelfPermission(REQUESTED_PERMISSIONS[2], PERMISSION_REQ_ID)) {
//执行到此处说明已有权限成功
initAgoraEngineAndJoinChannel();
}

/**

  • 检查权限的方法
  • @param permission 权限
  • @param requestCode 请求码
  • @return 是否拥有权限
    */
    public boolean checkSelfPermission(String permission, int requestCode) {
    Log.i(LOG_TAG, "checkSelfPermission " + permission + " " + requestCode);
    if (ContextCompat.checkSelfPermission(this, permission)
    != PackageManager.PERMISSION_GRANTED) {
    //发送权限请求
    ActivityCompat.requestPermissions(this, REQUESTED_PERMISSIONS, requestCode);
    return false;
    }
    return true;
    }

@Override
public void onRequestPermissionsResult(
int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Log.i(LOG_TAG, "onRequestPermissionsResult " + grantResults[0] + " " + requestCode);
switch (requestCode) {
case PERMISSION_REQ_ID: {//请求码
if (grantResults[0] != PackageManager.PERMISSION_GRANTED ||
grantResults[1] != PackageManager.PERMISSION_GRANTED ||
grantResults[2] != PackageManager.PERMISSION_GRANTED) {
//三个权限有任意的未被允许,弹吐司,退出
showLongToast("Need permissions " +
Manifest.permission.RECORD_AUDIO + “/” +
Manifest.permission.CAMERA + “/” +
Manifest.permission.WRITE_EXTERNAL_STORAGE);
finish();
break;
}
//执行到此处说明用户已允许权限
initAgoraEngineAndJoinChannel();
break;
}
}
}


4.初始化Agora引擎和连接频道

/**

  • 初始化Agora引擎和连接频道
    */
    private void initAgoraEngineAndJoinChannel() {
    initializeAgoraEngine();//初始化Agora引擎
    setupVideoProfile();//设置视频信息
    setupLocalVideo();//设置本地的视频窗
    joinChannel();//连接频道
    }

/**

  • 初始化Agora引擎
    */
    private void initializeAgoraEngine() {
    try {
    mRtcEngine = RtcEngine.create(//实例化Rtc引擎
    getBaseContext(),//传入Context
    getString(R.string.agora_app_id), //传入APP ID
    mRtcEventHandler);//RTC事件处理器
    } catch (Exception e) {//发生异常时捕获异常
    Log.e(LOG_TAG, Log.getStackTraceString(e));
    throw new RuntimeException(“NEED TO check rtc sdk init fatal error\n” + Log.getStackTraceString(e));
    }
    }

/**

  • 设置视频信息
    */
    private void setupVideoProfile() {
    mRtcEngine.enableVideo();//启用视屏
    mRtcEngine.setVideoEncoderConfiguration(//视频解码配置
    new VideoEncoderConfiguration(//实例化对象
    VideoEncoderConfiguration.VD_120x120,//尺寸
    VideoEncoderConfiguration.FRAME_RATE.FRAME_RATE_FPS_15,//帧率
    VideoEncoderConfiguration.STANDARD_BITRATE,//比特率
    VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_FIXED_PORTRAIT));//旋转模式
    }
    |—关于VideoEncoderConfiguration对象---->[VideoEncoderConfiguration构造方法]------------------
    public VideoEncoderConfiguration(
    VideoEncoderConfiguration.VideoDimensions dimensions, //尺寸
    VideoEncoderConfiguration.FRAME_RATE frameRate,//帧率
    int bitrate, //比特率
    VideoEncoderConfiguration.ORIENTATION_MODE orientationMode)//旋转模式

/**

  • 设置本地视频窗
    */
    private void setupLocalVideo() {
    FrameLayout container = findViewById(R.id.local_video_view_container);//FrameLayout视图
    SurfaceView surfaceView = RtcEngine.CreateRendererView(getBaseContext());//创建SurfaceView
    surfaceView.setZOrderMediaOverlay(true);
    container.addView(surfaceView);
    mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, 0));
    }

最后

总而言之,Android开发行业变化太快,作为技术人员就要保持终生学习的态度,让学习力成为核心竞争力,所谓“活到老学到老”只有不断的学习,不断的提升自己,才能跟紧行业的步伐,才能不被时代所淘汰。

在这里我分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。需要的朋友可以私信我【资料】或者 点这里 免费领取

还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。 领取地址: Android学习PDF+架构视频+最新面试文档+源码笔记

脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。 领取地址: Android学习PDF+架构视频+最新面试文档+源码笔记

Agora-SDK-在Android中的使用(在线视频通话),Android推送技术解析相关推荐

  1. Agora SDK 在Android中的使用(在线视频通话)| 掘金技术征文

    首先声明本文是Agora SDK入门的小白文章 一.集成 1.注册账号创建项目 其中最重要的要数 App ID 了 2.下载Agora SDK 二.学会看示例代码(可跳过) 1.整体了解项目结构(1v ...

  2. 腾讯T3亲自教你!Android推送技术解析,写给正在求职的安卓开发

    前言 开发10年,老码农,曾经是爱奇艺架构师,东芝集团高级工程师,三星架构师.5年之内频繁被辞退.内心拔凉拔凉的,在这五年理我思考了很多,也意识到了自己的不足.今年趁着疫情把自己知识的不足做了个查漏补 ...

  3. Android中的各种保活2-Android端外推送到底有多烦?

    Android端外推送到底有多烦? 原创  2016-08-06  张铁蕾  张铁蕾 http://mp.weixin.qq.com/s?__biz=MzA4NTg1MjM0Mg==&mid= ...

  4. 软件android_id,Android中@id和@+id及@android:id的区别介绍

    前言 昨天突然有新来的同事问我这个@id 和@+id 的区别 ,为什么 我们的项目都是@id 自己新增的ui 使用的@+id 这里说下我的简单的回复项目是维护的之前的是为了统一管理使用了@id  方便 ...

  5. 个推unipush在线和离线推送 springboot后端代码 uniapp

    个推unipush在线和离线推送 springboot后端代码 uniapp 先说一下来龙去脉,公司要做app推送,是uniapp,我是个新手小白,拿到需求就轻装上阵了,过程很艰难,花了很多时间才做完 ...

  6. Android推送技术总结

    Android推送技术总结 Android平台接入推送机制一般有两种,一种是Google官方提供的C2DM云端推送方案:另外一种是第三方,如极光.个推和友盟等推送平台. C2DM云端推送方案 1)简单 ...

  7. android小米推送,Android手机端小米推送Demo解析和实现方法

    最近这几个月都是在准备找工作和找工作中,付出了很多,总算是有点收获,所以都没有怎么整理笔记.到了最近才有空把自己的笔记整理一下发上来,分享一下我的学习经验. 推送 由于最近项目要用到Android的消 ...

  8. php主动推送弹幕_百万在线的美拍直播弹幕系统的实时推送技术实践之路

    1.内容概述 1.jpg (30.13 KB, 下载次数: 321) 2 年前 上传 直播弹幕是直播系统的核心功能之一.如何迅速作出一个有很好扩展性的弹幕系统?如何应对业务迅速发展?相信很多工程师/架 ...

  9. miui android 9q,小米 9 MIUI Android Q Beta 优先体验版正式推送:轻松升级

    7 月 11 日,小米 MIUI 官微宣布,小米 9 MIUI Android Q Beta 优先体验版现已推送!已获得测试资格的小伙伴已经可以升级体验. 换言之已经获得资格的小米 9 用户现在就可以 ...

最新文章

  1. 在线作图|微生物多样性分析——丰度等级曲线
  2. 【复杂网络】用户画像不应脱离社会关系,谈复杂网络的关键技术和应用实践
  3. 用java编写打印时间_编写一个java程序,读取系统时间,然后将时间用中文输出...
  4. 单片机中断机制对日常生活的启示_单片机原理部分课后习题解
  5. 微软修复工具_微软正在推出更新以修复此前被发现的Windows 10 SFC问题
  6. 拼图推迟将Java 9的发布日期推迟到2017年
  7. html怎么弄艺术字体,如何为图片加上艺术字的图文方法步骤
  8. Javascript中暂停功能的实现
  9. php单选框点击取消,取消选中单选框radio的三种方式
  10. siamfc代码解读_每日一文:目标跟踪(SiamFC)
  11. springboot publish event 事件机制demo
  12. 阿雪的学习记录|【V-Rep】小车动起来,添加视觉、距离传感器
  13. 【七】【vlc-android】vlc的decoder控制层传输数据与ffmpeg音频解码模块decoder层进行解码的数据交互流程源码分析
  14. 洛谷P4942 小凯的数字
  15. node之request模块
  16. colorkey唇釉是否安全_colorkey唇釉真假辨别_colourkey唇釉真伪
  17. UCF Local Programming Contest 2012(Practice)E. Pete's Pantry 【模拟】
  18. 荣耀手表magic2是否支持鸿蒙,荣耀Magic Watch 2支持哪些运动模式
  19. PySpark 之 map
  20. rfid android开发板,iTOP-6818开发板-Android4.4系统下RFID射频模块测试例程

热门文章

  1. 2021年安全员-B证-项目负责人(广东省)考试平台及安全员-B证-项目负责人(广东省)模拟试题
  2. 售前解决方案秘诀,学会后写方案不再困难重重!
  3. 如何用手机拍出高逼格的照片
  4. 年度最佳 JavaScript和CSS 开源库推荐!
  5. MPP硬编码H265(500倍压缩)
  6. ESP8266 Arduino 解决开发板管理器下载开发包失败和速度慢的方法
  7. excel转word后表格超出页面_excel数据复制后表格变大-从excel中复制进word的表格,自动调整后表格太大,......
  8. java 将 text 文字、文本 内容 转为 图片
  9. 基于微信小程序的点餐系统源码/基于uni-app点餐系统app【有多种UI样式】
  10. edge 浏览器截取全图保存成图片