作为一个小白,刚看萤石云的sdk是有点云里雾里的。在接入文档中,它给你讲解了如何登陆入平台,但是到了播放那边却开始一笔带过。甚至于官方的视频教程居然还用的是eclipse的。这就很离谱了。好在使用萤石云的大神也有很多。今天集成成功的功劳来自于这两位。

sunshine_0707   --  这位提供了一个简洁的代码块,可以直接顺利地调用摄像头播放。

秦子帅  --  这位很详细地讲解了如何配置该sdk。奈何本人略小白,眼睛看懂了,脑子还是没跟上,手就更没有跟上了。

于是决定先记录下来,等晚一些时候将集成步骤写出来,留做笔记。

本文基于Android Studio开发。

首先按照文档来,没什么好说的。

使用 Gradle 获得

如果是之前采用过直接下载方式的需要删除之前拷贝进来的所有so库文件以及jar包

dependencies {compile 'com.ezviz.sdk:ezviz-sdk:4.9.0.6'}

配置 Android 权限

在 AndroidMainfest.xml 文件中添加:

//网络权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>//存储权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>//wifi 状态权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
//热点配网扫描wifi需要使用
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

配置build.gradle

    defaultConfig {...ndk {abiFilters "armeabi-v7a" //自4.8.8版本开始支持arm64-v8a}}sourceSets {main {jniLibs.srcDirs = ['libs']}}

配置 AndroidManifest.xml

添加如下activity定义,用于sdk中间页显示,包含登录、开通云存储等。

    <activityandroid:name="com.videogo.main.EzvizWebViewActivity"android:screenOrientation="portrait"android:configChanges="orientation|keyboardHidden"></activity>

添加如下广播接收器,用于接收中间页登录成功消息启动其他界面。将you_BroadcastReceiver替换为自己代码中定义的BroadcastReceiver。

(Android8.0及以上系统,由于静态注册广播的限制,很可能会收不到登录成功的广播,因此建议改用在代码中动态注册的方式注册BroadcastReceiver)

   <receiverandroid:name="you_BroadcastReceiver"android:exported="false" ><intent-filter><action android:name="com.videogo.action.OAUTH_SUCCESS_ACTION" /></intent-filter></receiver>

这里的广播要做实例,例如 android:name=".thisBroadcastReceiver"的话,新建一个类thisBroadcastReceiver,extends BroadcastReceiver

public class thisBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (TextUtils.equals(intent.getAction(),"com.videogo.action.OAUTH_SUCCESS_ACTION")){EZAccessToken accessToken = EZOpenSDK.getInstance().getEZAccessToken();// begin your work}}
}

然后在AndroidManifest里的Application里添加name

<applicationandroid:allowBackup="true"android:name=".thisApplication"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme">

然后新建类thisApplication

public class thisApplication extends Application {private static String APP_KEY = "你懂的";@Overridepublic void onCreate() {super.onCreate();//初始化sdk/** * sdk日志开关,正式发布需要去掉 */EZOpenSDK.showSDKLog(true);/** * 设置是否支持P2P取流,详见api */EZOpenSDK.enableP2P(false);EZOpenSDK.initLib(this,APP_KEY);}
}

这样前期工作就做完了。

然后在要播放视频的页面xml里添加一个SurfaceView

<SurfaceViewandroid:id="@+id/remoteplayback_sv"android:layout_width="match_parent"android:layout_height="500dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"/>

随便写,demo用的。需要做调整的可以自己调整一下位置大小。

然后。。。就是将sunshine_0707的代码拿过来用上去,就可以了。

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{private SurfaceView mRealPlaySv;private SurfaceHolder mRealPlaySh;private EZPlayer mEZPlayer = null;private List<EZDeviceInfo> mDeviceInfoList;//摄像头底部的序列号private final int serialNo='6***********5';//摄像头底部的验证码private final String  code='G***********J';private static final int MSG_ON_DEVICE_RESPONSE=  1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/** 这里的AccessToken取个值,用来写Demo的*  写项目的时候要注意AccessToken每隔一个星期就会改变一次* */String accessToken="at.d*******************************3mn";EZOpenSDK.getInstance().setAccessToken(accessToken);mRealPlaySv=(SurfaceView)findViewById(R.id.remoteplayback_sv);mRealPlaySh = mRealPlaySv.getHolder();mRealPlaySh.addCallback(this);new Thread() {@Overridepublic void run() {super.run();try {mDeviceInfoList = EZOpenSDK.getInstance().getDeviceList(0, 20);mHandler.sendEmptyMessage(MSG_ON_DEVICE_RESPONSE);} catch (BaseException e) {e.printStackTrace();}}}.start();
}/*** 通过ezdevice 得到其中通道信息* @param deviceInfo* @return*/public static EZCameraInfo getCameraInfoFromDevice(EZDeviceInfo deviceInfo, int camera_index) {if (deviceInfo == null) {return null;}if (deviceInfo.getCameraNum() > 0 && deviceInfo.getCameraInfoList() != null && deviceInfo.getCameraInfoList().size() > camera_index) {return deviceInfo.getCameraInfoList().get(camera_index);}return null;}private void startPlay() {EZDeviceInfo deviceInfo = null;for (EZDeviceInfo ezDeviceInfo : mDeviceInfoList) {Log.d("EZDeviceInfo", ezDeviceInfo.getDeviceName() + ";;SN=" + ezDeviceInfo.getDeviceSerial() + ";; type=" + ezDeviceInfo.getDeviceType());//比较的自己的摄像头底部上写的序列号if (serialNo.equals(ezDeviceInfo.getDeviceSerial())) {deviceInfo = ezDeviceInfo;break;}}if(deviceInfo == null){return;}//获取使用的摄像头信息EZCameraInfo cameraInfo = getCameraInfoFromDevice(deviceInfo,0);//创建播放器对象mEZPlayer = EZOpenSDK.getInstance().createPlayer(cameraInfo.getDeviceSerial(), cameraInfo.getCameraNo());if (mEZPlayer == null)return;if (cameraInfo == null) {return;}//设置handler,该handler被用于从播放器向handler传递消息mEZPlayer.setHandler(mHandler);//设置播放器显示的surfacemEZPlayer.setSurfaceHold(mRealPlaySh);//开始播放mEZPlayer.startRealPlay();//视频的加密密码,默认为摄像头的验证码mEZPlayer.setPlayVerifyCode(code);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {if (mEZPlayer != null) {mEZPlayer.setSurfaceHold(holder);}mRealPlaySh = holder;}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if (mEZPlayer != null) {mEZPlayer.setSurfaceHold(null);}mRealPlaySh = null;}private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what){case MSG_ON_DEVICE_RESPONSE://开始播放startPlay();break;}}};
}————————————————
版权声明:本文为CSDN博主「sunshine_0707」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sunshine_0707/article/details/88546606

至此,你已经可以完美播放了。然后分析一下自己的需求。

序列号和验证码那边。

因为我不止一个设备需要播放,所以需要使用list将设备列表列出来。

大神写的demo中,是指定了序列号,然后通过对比之后取出相应的设备信息,然后进行播放。

for (EZDeviceInfo ezDeviceInfo : mDeviceInfoList) {Log.d("EZDeviceInfo", ezDeviceInfo.getDeviceName() + ";;SN=" + ezDeviceInfo.getDeviceSerial() + ";; type=" + ezDeviceInfo.getDeviceType());//比较的自己的摄像头底部上写的序列号if (serialNo.equals(ezDeviceInfo.getDeviceSerial())) {deviceInfo = ezDeviceInfo;break;}}

只要将这段改动一下,就可以得到一个设备列表。然后通过序列码-验证码的map一一对应,做到选择播放。

Android - 关于萤石云SDK的集成相关推荐

  1. EasyCVR平台基于萤石云SDK接入的设备播放流程及接口调用

    EasyCVR视频融合云服务支持海量视频汇聚与管理.处理与分发.智能分析等视频能力,在功能上,可支持视频监控直播.云端录像.云存储.录像检索与回看.智能告警.平台级联.服务器集群等.EasyCVR平台 ...

  2. EasyCVR添加萤石云SDK接入的设计与开发流程

    我们在前期的文章中介绍过关于EasyCVR近期新增了多个功能,包括SDK接入方式的拓展.经过一段时间的设计.开发与测试,EasyCVR平台已经支持稳定接入华为SDK.宇视SDK.乐橙SDK.萤石SDK ...

  3. 萤石云视频EZOpenSDK集成(实现播放,视频放大功能)

    前言 去年在项目中用到了萤石云视频,它的项目源码很多,找到有用的代码很费时间,所以今天写成文章把集成步骤,预览功能,双击放大,手势放大功能以及注意事项等分享给大家. 效果图如下: 萤石开发平台地址: ...

  4. Android接入融云sdk流程(思路)

    1.导入RongImKit以及v4包. 2.在融云控制台为自己的App申请AppKey和AppSecret. 3.在AndroidManifest中添加相应权限.服务.广播和app对应的AppKey. ...

  5. Android(9) 环信sdk手动集成(非添加easeui依赖快速集成)

    @先看看效果是不是自己想要的吧@ 准备:参考官方文档,先注册并创建应用 (这里再分享一下利用easeui快速集成的方法吧   --->   https://blog.csdn.net/qq_38 ...

  6. android 动态加载sdk,LiteAVSDK集成,因此可以动态加载库

    在Android开发中,Android Studio用于集成第三方SDK(例如,腾讯视频云移动直播,播放器,短视频以及实时音频和视频). 通常有两种集成方法: aar集成和jar + so集成. An ...

  7. 成功解决萤石云SDK对讲功能设备端无声音手机端有声音的问题

    解决方法: 在调用下面方法时 加上2秒的时间延迟 player.setVoiceTalkStatus(true); Timer timer = new Timer();timer.schedule(n ...

  8. 萤石云平台接入_前端接入监控视频

    简介 在可视化平台的展示中,监控视频可能是不可或缺的一部分.由于屏幕的尺寸限制,监控视频在可视化平台中占比不大,但是对于设计到实物的企业来说,监控视频在可视化平台中的展现是必不可少的一部分. 海康威视 ...

  9. android.intent.action.view 融云,Android 融云SDK集成单聊

    一 .下载 SDK 您可以到融云官方网站下载融云 SDK.融云 SDK 各部分功能以插件化的形式独立提供,开发者可以根据自己的需要,自由组合下载.各组件的功能如下: IMKit – 融云 IM 界面组 ...

最新文章

  1. iOS开发实战小知识点(五)——获取JS meta异常
  2. linux监听端口丢失,linux – 如果没有监听端口,则为Systemd重启服务
  3. java ruby脚本_Java 程序中直接执行 Ruby 脚本 (JRuby)
  4. 操作系统之进程管理:15、哲学家进餐问题
  5. DataCapa 启动
  6. 今日计划:修改Plog,为期2天
  7. 120 -算法 - 枚举 数学类 4138:质数的和与积
  8. linux RPM包安装、更新、删除等操作命令简明总结, 如何查看yum安装的软件路径 ?...
  9. BF的数据结构题单-提高组——P1783 海滩防御
  10. JAVA8新特性的StreamAPI 遇到的问题stream has already been operated upon or closed
  11. 仙剑奇侠传编年史(转自网络)
  12. Pytorch深度学习实战1-6:图解牛顿迭代法,牛顿不止力学三定律
  13. JAVA计算机毕业设计林家餐厅自助点餐管理系统(附源码、数据库)
  14. 实操-安装esxi6.0和配置
  15. 我的世界显示服务器头像,我的世界怎么让服务器升级换头像 | 手游网游页游攻略大全...
  16. 杭电考研计算机多少分及格,2020考研:杭电计算机好考吗?分数线是多少?
  17. 网站内容更新的操作方法有哪些
  18. Alcatel OminPCX Office 模拟分机不显示来电号码的解决
  19. 0x80070570文件或目录损坏且无法读取 CHKDSK修复方法
  20. 使用BumpTop将桌面撞入3D

热门文章

  1. 计算机华宇平台负责人 - 阿撒
  2. VC++中如何获取GB2312字符集中汉字拼音首字母
  3. 软件测试入职1年多薪资正常应该有多少?
  4. C# 16位十六进制有符号数转十进制数
  5. react学习(一)-初始项目
  6. 黑鸟每日安全资源推送​(求关注,良心推送)
  7. iOS 怎样获取wifi名(无法获取wifi名)(亲测有效)
  8. PAT 乙级 1001 害死人不偿命的(3n+1)猜想(C语言)
  9. 先锋商泰面试实习经历
  10. Matlab固有频率不对,matlab固有频率表