上一篇文章写了《海康威视远程监控Android端APP开发初探》,闲来又整理了一下demo,现在把demo工程的源码发上来,大家一起学习:
工程源文件三个:
1、(监控点信息类)
2、(继承自SurfaceView,用来播放视频并显示)
3、VideoShowActivity(主activity)
布局文件一个:
activity_main.xml
中只需定义一项网络访问的权限:
下面是源代码:
1、
package com.;
public class MonitorCameraInfo {
public String serverip = "";
public int serverport = 0;
public String username = "";
public String userpwd = "";
public int channel = 0;
public String describe = "";
public MonitorCameraInfo() {
}
}
2、
package com.;
import .;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .NET_DVR_CLIENTINFO;
import .NET_DVR_DEVICEINFO_V30;
import ;
public class Sjrs08SurfaceView extends SurfaceView implements
{
private HCNetSDK videoCtr; //网络库sdk
private Player myPlayer = null; //播放库sdk
private int playPort = -1; //播放端口
public boolean playFlag = false; //播放标志
private int userId = -1; //登录帐号id
private MonitorCameraInfo cameraInfo = null; //监控点信息
private SurfaceHolder holder = null;
public Sjrs08SurfaceView(Context paramContext) {
super(paramContext);
initSurfaceView();
}
public Sjrs08SurfaceView(Context paramContext,
AttributeSet paramAttributeSet) {
super(paramContext, paramAttributeSet);
initSurfaceView();
}
public Sjrs08SurfaceView(Context paramContext,
AttributeSet paramAttributeSet, int paramInt) {
super(paramContext, paramAttributeSet);
initSurfaceView();
}
private void initSurfaceView() {
getHolder().addCallback(this);
}
public boolean onDown(MotionEvent paramMotionEvent) {
return false;
}
public boolean onFling(MotionEvent paramMotionEvent1,
MotionEvent paramMotionEvent2, float paramFloat1, float paramFloat2) {
return false;
}
public void onLongPress(MotionEvent paramMotionEvent) {
}
public boolean onScroll(MotionEvent paramMotionEvent1,
MotionEvent paramMotionEvent2, float paramFloat1, float paramFloat2) {
return false;
}
public void onShowPress(MotionEvent paramMotionEvent) {
}
public boolean onSingleTapUp(MotionEvent paramMotionEvent) {
return false;
}
public void surfaceChanged(SurfaceHolder paramSurfaceHolder, int paramInt1,
int paramInt2, int paramInt3) {
}
public void surfaceCreated(SurfaceHolder paramSurfaceHolder) {
holder = ();
}
public void surfaceDestroyed(SurfaceHolder paramSurfaceHolder) {
}
public void setMonitorInfo(MonitorCameraInfo setMonitorInfo) {
= setMonitorInfo;
}
/**
* 时间如水2013-7-10
* 功能:暂定播放
* flag 1/暂停 0/恢复
*/
public void pausePaly(int flag) {
(playPort, flag);
}
public void stopPlay() {
try {
playFlag = false;
videoCtr.NET_DVR_StopRealPlay(playPort);
videoCtr.NET_DVR_Logout_V30(userId);
userId = -1;
videoCtr.NET_DVR_Cleanup();
if (myPlayer != null) {
(playPort);
(playPort);
(playPort);
playPort = -1;
destroyDrawingCache();
}
} catch (Exception e) {
();
} finally {
}
}
/**
* 时间如水2013-7-10
* 功能:开始实时预览*/
public void startPlay() {
try {
// 实例化播放API
myPlayer = ();
// 实例化海康威视android sdk
videoCtr = new HCNetSDK();
videoCtr.NET_DVR_Init(); //初始化海康威视android sdk
videoCtr.NET_DVR_SetExceptionCallBack(mExceptionCallBack); //设置错误回掉函数
// 设置连接超时时长
videoCtr.NET_DVR_SetConnectTime(60000);
playPort = (); //获取空闲播放端口
NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();
// 登录服务器
userId = videoCtr.NET_DVR_Login_V30(,
, ,
, deviceInfo);
("下面是设备信息************************");
("通道开始=" + );
("通道个数=" + );
("设备类型=" + );
("ip通道个数=" + );
byte[] sbbyte = ;
String sNo = "";
for (int i = 0; i < ; i++) {
sNo += (sbbyte[i]);
}
("设备序列号=" + sNo);
("************************");
NET_DVR_CLIENTINFO clientInfo = new NET_DVR_CLIENTINFO();
= ;
= 0x80000000; // 子码流,保证图像实时性
= null;
int playFlag = videoCtr.NET_DVR_RealPlay_V30(userId, clientInfo,
mRealPlayCallBack, false);
("playFlag=" + playFlag);
("GetLastError="
+ videoCtr.NET_DVR_GetLastError());
} catch (Exception e) {
();
stopPlay();
}
}
private ExceptionCallBack mExceptionCallBack = new ExceptionCallBack() {
@Override
public void fExceptionCallBack(int arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
("异常回掉函数运行!");
}
};
private RealPlayCallBack mRealPlayCallBack = new RealPlayCallBack() {
@Override
public void fRealDataCallBack(int lRealHandle, int dataType,
byte[] paramArrayOfByte, int byteLen) {
// TODO Auto-generated method stub
// ("playFlag=" + playFlag + ",dataType=" +
// dataType + ",大小=" + byteLen + "字节,playPort=" + playPort);
if (playPort == -1)
return;
switch (dataType) {
case 1: // 头数据
if ((playPort, paramArrayOfByte, byteLen,
1024 * 1024)) {
if ((playPort, 1)) {
if ((playPort, holder)) {
playFlag = true;
} else {
playError(3);
}
} else {
playError(2);
}
} else {
playError(1);
}
break;
case 4:
if (playFlag
&& (playPort, paramArrayOfByte,
byteLen)) {
playFlag = true;
} else {
playError(4);
playFlag = false;
}
}
}
};
private void playError(int step) {
switch (step) {
case 1:
("openStream error,step=" + step);
break;
case 2:
("setStreamOpenMode error,step=" + step);
break;
case 3:
("play error,step=" + step);
break;
case 4:
("inputData error,step=" + step);
break;
}
stopPlay();
}
}
3、VideoShowActivity
package com.;
import ;
import ;
public class VideoShowActivity extends Activity {
Sjrs08SurfaceView nowSjrs08SurfaceView; //SurfaceView对象,用来显示视频
@Override
protected void onCreate(Bundle savedInstanceState) {
(savedInstanceState);
setContentView(.activity_main);
nowSjrs08SurfaceView = (Sjrs08SurfaceView) findViewById(.video_0);
}
@Override
protected void onResume() {
();
if (!) { //如果没有在播放的话
MonitorCameraInfo cameraInfo = new MonitorCameraInfo();
= "192.168.0.100";
= 8000;
= "ceshiadmin";
= "123456";
= 1;
= "测试点";
(cameraInfo);
(); //开始实时预览
}
}
@Override
protected void onPause() {
();
if () {
(); //停止实时预览
}
}
}
4、activity_main.xml
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:
android:layout_width="400dp"
android:layout_height="300dp"
android:layout_alignParentLeft="true" />