种一棵Android海康摄像机Demo的树

2023-12-26 17:48

本文主要是介绍种一棵Android海康摄像机Demo的树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目中有监控模块,准备使用海康的摄像机,方一运行所提供的Demo,就程序崩溃。

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.demo/com.test.demo.DemoActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x7f020000

低版本图标资源在手机上找不到的原因。  
解决办法:重新更换一张存在的图标,重新运行即可

 

 

 

 

 


本Demo完成实时预览,回放,查找SD卡中的历史录像文件,截图功能。
1.登陆设备

public static  boolean loginDevice(String ip, int port, String name, String psd) {NET_DVR_DEVICEINFO_V30 netDvrDeviceInfoV30 = new NET_DVR_DEVICEINFO_V30();int loginId = HCNetSDK.getInstance().NET_DVR_Login_V30(ip, port,name, psd, netDvrDeviceInfoV30);//登陆失败if (loginId < 0) {return false;}ExceptionCallBack exceptionCbf = getExceptionCbf();if (!HCNetSDK.getInstance().NET_DVR_SetExceptionCallBack(exceptionCbf)) {return false;}return true;
}


2.实时预览:

public boolean startRealTimePlay() {NET_DVR_PREVIEWINFO previewInfo = new NET_DVR_PREVIEWINFO();previewInfo.lChannel = mStartChan;previewInfo.dwStreamType = 0;previewInfo.bBlocked = 1;previewInfo.hHwnd = mSvPlayer.getHolder();
/*        mPlayId = HCNetSDK.getInstance().NET_DVR_RealPlay_V40(mILogID,previewInfo, null);*/mPlayId = HCNetSDK.getInstance().NET_DVR_RealPlay_V40(0,previewInfo, null);if (mPlayId < 0) {return false;}return true;
}

3.回放:

public boolean backPlay(NET_DVR_TIME beginDate, NET_DVR_TIME endDate) {if (mPlayId >= 0) {return false;}NET_DVR_VOD_PARA struVod = new NET_DVR_VOD_PARA();struVod.struBeginTime = beginDate;struVod.struEndTime = endDate;struVod.byStreamType = 0;struVod.struIDInfo.dwChannel = mStartChan;struVod.hWnd = mSvPlayer.getHolder().getSurface();mPlaybackId = HCNetSDK.getInstance().NET_DVR_PlayBackByTime_V40(mILogID, struVod);if (mPlaybackId >= 0) {if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(mPlaybackId, PlaybackControlCommand.NET_DVR_PLAYSTART, null, 0, null)) {return false;}return true;}return false;
}

如果需要实现进度条拖动回放进度功能,只需先停止回放再传入新的开始时间,结束时间不变再调用该方法就行。但是发现这种方式有的时候会出现问题,造成程序崩溃。sdk并没有提供相应的解决方法,使用海康ivms-4500APP拖动回放没有问题,实现方式不一样,ivms-4500会黑屏再回放,不知道是不是缓存了多个SurfaceView来回切换回放。
4.查找录像文件:

public static List<NET_DVR_FINDDATA_V30> findAllFile(NET_DVR_TIME beginDate, NET_DVR_TIME endDate){List<NET_DVR_FINDDATA_V30> monitorFileList = new ArrayList<>(10);NET_DVR_FILECOND netDvrFilecond = new NET_DVR_FILECOND();netDvrFilecond.lChannel = 1;netDvrFilecond.dwFileType = 0;netDvrFilecond.dwIsLocked = 0xff;netDvrFilecond.struStartTime = beginDate;netDvrFilecond.struStopTime = endDate;int findStatus = HCNetSDK.getInstance().NET_DVR_FindFile_V30(0, netDvrFilecond);while (true) {NET_DVR_FINDDATA_V30 file = new NET_DVR_FINDDATA_V30();try {//延时一点时间才能找到文件Thread.sleep(150);} catch (InterruptedException e) {e.printStackTrace();}HCNetSDK.getInstance().NET_DVR_FindNextFile_V30(findStatus, file);if (file.dwFileSize == 0) {break;} else {monitorFileList.add(file);}}HCNetSDK.getInstance().NET_DVR_FindClose_V30(findStatus);return  monitorFileList;
}

5.截图:

public boolean generateCapture() {NET_DVR_JPEGPARA jpeg = new NET_DVR_JPEGPARA();INT_PTR a = new INT_PTR();byte[] buffer = new byte[1024 * 1024];// 设置图片的分辨率0-2,越小质量越高jpeg.wPicSize = 2;jpeg.wPicQuality = 2;if (HCNetSDK.getInstance().NET_DVR_CaptureJPEGPicture_NEW(mILogID, mChanNum, jpeg, buffer, 1024 * 1024, a) && saveCapture(buffer)) {return true;}return false;
}

备注:
1.目前测试登陆和播放都可以异步,其余应该也可以。
2.直接用SurfaceView即可,不需要用Demo所封装的。
3.如果需要全屏和小屏播放,只需要让Activity旋转就可以,可以在View中重写onConfigurationChanged处理切换时候的逻辑:

@Override
protected void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);//横屏if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {}else {}
}

4.Activity,onStop()时会销毁SurfaceView,需要在SurfaceView的surfaceCreated()方法中处理恢复播放:

@Override
public void surfaceCreated(SurfaceHolder holder) {//恢复播放
}

5.如果需要做成列表播放,只需要在RecyclerView的父View嵌套SurfaceView就行:

//RecyclerViewAdapter中item点击回调
@Override
public void onClick(View v) {if(onVideoClickListener != null){int[] point = new int[2];v.getLocationOnScreen(point);onVideoClickListener.onVideoClick(point);}
}public void onVideoClick(final int[] point) {if (mPlayer == null) {mPlayer = (Player) LayoutInflater.from(mContext).inflate(R.layout.player_min, mFlMonitor, false);mPlayer.setOnSurfaceCreateCallBack(this);mFlMonitor.addView(mPlayer);mPlayer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {i++;if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ){return;}alertPlayerPosition(point);if(i == 2) {mPlayer.getViewTreeObserver().removeOnGlobalLayoutListener(this);}}});}
}private void alertPlayerPosition(int[] point) {int[] rlPoint = new int[2];//标题栏和状态栏高度总和if (mTitleStatusBarHeight <= 0) {mFlMonitor.getLocationOnScreen(rlPoint);mTitleStatusBarHeight = rlPoint[1];}int playItemY = point[1];int measuredHeight = mPlayer.getMeasuredHeight();int top = playItemY - mTitleStatusBarHeight;int bottom = top + measuredHeight;mPlayer.layout(mPlayer.getLeft(), top, mPlayer.getRight(), bottom);
}

6.由于特殊原因,恕不能提供完整Demo,有什么问题可以在论坛问我就行。

这篇关于种一棵Android海康摄像机Demo的树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为