diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index a8c77df..4d20b38 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -8,23 +8,24 @@ import android.view.MotionEvent import android.view.SurfaceHolder import androidx.lifecycle.lifecycleScope -import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.createVideoFileDir import com.casic.endoscope.extensions.getChannel -import com.casic.endoscope.extensions.initImmersionBar import com.casic.endoscope.extensions.toTime import com.casic.endoscope.utils.ProjectConstant import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.gyf.immersionbar.ImmersionBar import com.hikvision.netsdk.HCNetSDK import com.hikvision.netsdk.NET_DVR_JPEGPARA import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.PTZCommand import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.createImageFileDir +import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.SteeringWheelView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -102,191 +103,177 @@ if (isPreviewSuccess) { val videoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) - binding.videoButton.text = "长按停止" } } binding.videoButton.setOnLongClickListener { //停止视频抓取 hkSDK.NET_DVR_StopSaveRealData(returnUserId) - binding.videoButton.text = "录像" true } - binding.toggleButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() - deviceItem.szDevName = "" - deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( - ProjectConstant.HK_NET_IP, - ProjectConstant.HK_NET_PORT, - ProjectConstant.HK_NET_USERNAME, - ProjectConstant.HK_NET_PASSWORD - ) - if (deviceItem.szDevName.isEmpty()) { - deviceItem.szDevName = deviceItem.devNetInfo.szIp - } - val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( - deviceItem.szDevName, deviceItem.devNetInfo - ) - if (loginV40Jna) { - //配置设备通道 - try { - val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] - returnUserId = deviceInfo.szUserId + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + if (!isPreviewSuccess) { + val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() + deviceItem.szDevName = "" + deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( + ProjectConstant.HK_NET_IP, + ProjectConstant.HK_NET_PORT, + ProjectConstant.HK_NET_USERNAME, + ProjectConstant.HK_NET_PASSWORD + ) + if (deviceItem.szDevName.isEmpty()) { + deviceItem.szDevName = deviceItem.devNetInfo.szIp + } + val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( + deviceItem.szDevName, deviceItem.devNetInfo + ) + if (loginV40Jna) { + //配置设备通道 + try { + val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] + returnUserId = deviceInfo.szUserId - aChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() - startAChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + aChannelNum = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() + startAChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + - deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 - startDChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + + deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 + startDChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - var iAnalogStartChan = startAChannel - var iDigitalStartChan = startDChannel + var iAnalogStartChan = startAChannel + var iDigitalStartChan = startDChannel - val channelList = ArrayList() + val channelList = ArrayList() - for (i in 0 until aChannelNum) { - channelList.add("ACamera_$iAnalogStartChan") - iAnalogStartChan++ - } + for (i in 0 until aChannelNum) { + channelList.add("ACamera_$iAnalogStartChan") + iAnalogStartChan++ + } - for (i in 0 until dChannelNum) { - channelList.add("DCamera_$iDigitalStartChan") - iDigitalStartChan++ - } - selectChannel = Integer.valueOf(channelList[0].getChannel()) + for (i in 0 until dChannelNum) { + channelList.add("DCamera_$iDigitalStartChan") + iDigitalStartChan++ + } + selectChannel = Integer.valueOf(channelList[0].getChannel()) - val streamList = ArrayList() - streamList.add("main_stream") - streamList.add("sub_stream") - streamList.add("third_stream") + val streamList = ArrayList() + streamList.add("main_stream") + streamList.add("sub_stream") + streamList.add("third_stream") - //开始预览 - if (previewHandle != -1) { - SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) - } - val strutPlayInfo = NET_DVR_PREVIEWINFO() - strutPlayInfo.lChannel = selectChannel - strutPlayInfo.dwStreamType = 1 - strutPlayInfo.bBlocked = 1 - strutPlayInfo.hHwnd = binding.surfaceView.holder - previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( - returnUserId, strutPlayInfo, null - ) - if (previewHandle < 0) { - Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") - return@setOnCheckedChangeListener - } - isPreviewSuccess = true - "预览开启成功".show(this) - //开始计时 - timer = Timer() - timerTask = object : TimerTask() { - override fun run() { - seconds++ - lifecycleScope.launch(Dispatchers.Main) { - binding.runningTimeView.text = seconds.toTime() + //开始预览 + if (previewHandle != -1) { + SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) + } + val strutPlayInfo = NET_DVR_PREVIEWINFO() + strutPlayInfo.lChannel = selectChannel + strutPlayInfo.dwStreamType = 1 + strutPlayInfo.bBlocked = 1 + strutPlayInfo.hHwnd = binding.surfaceView.holder + previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( + returnUserId, strutPlayInfo, null + ) + if (previewHandle < 0) { + Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") + return + } + isPreviewSuccess = true + "预览开启成功".show(this@MainActivity) + //开始计时 + timer = Timer() + timerTask = object : TimerTask() { + override fun run() { + seconds++ + lifecycleScope.launch(Dispatchers.Main) { + binding.runningTimeView.text = seconds.toTime() + } } } + timer?.schedule(timerTask, 0, 1000) + } catch (e: IndexOutOfBoundsException) { + e.printStackTrace() + "设备未正常连接,无法开启预览".show(this@MainActivity) } - timer?.schedule(timerTask, 0, 1000) - } catch (e: IndexOutOfBoundsException) { - e.printStackTrace() - "设备未正常连接,无法开启预览".show(this) } - } - } else { - if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { - return@setOnCheckedChangeListener - } - previewHandle = -1 - isPreviewSuccess = false - "预览关闭成功".show(this) - //停止计时 - timerTask?.cancel() - timer?.cancel() - } - } - - binding.leftButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed - ) - isActionUp = false + } else { + if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { + return } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) - isActionUp = true + previewHandle = -1 + isPreviewSuccess = false + "预览关闭成功".show(this@MainActivity) + //停止计时 + timerTask?.cancel() + timer?.cancel() } } - true - } - binding.topButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) - isActionUp = true + override fun onLeftTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.rightButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) - isActionUp = true + override fun onTopTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.bottomButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) - isActionUp = true + override fun onRightTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed + ) + isActionUp = false } } - true - } + + override fun onBottomTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed + ) + isActionUp = false + } + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + when (dir) { + SteeringWheelView.Direction.LEFT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.TOP -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) + isActionUp = true + } + + SteeringWheelView.Direction.RIGHT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.BOTTOM -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) + isActionUp = true + } + } + } + }) binding.downScaleButton.setOnTouchListener { _, event -> when (event.action) { @@ -363,7 +350,11 @@ } override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, true, R.color.white) + ImmersionBar.with(this).statusBarDarkFont(false).init() + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = getStatusBarHeight() + binding.rootView.setPadding(0, statusBarHeight, 0, 0) + binding.rootView.requestLayout() } override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index a8c77df..4d20b38 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -8,23 +8,24 @@ import android.view.MotionEvent import android.view.SurfaceHolder import androidx.lifecycle.lifecycleScope -import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.createVideoFileDir import com.casic.endoscope.extensions.getChannel -import com.casic.endoscope.extensions.initImmersionBar import com.casic.endoscope.extensions.toTime import com.casic.endoscope.utils.ProjectConstant import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.gyf.immersionbar.ImmersionBar import com.hikvision.netsdk.HCNetSDK import com.hikvision.netsdk.NET_DVR_JPEGPARA import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.PTZCommand import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.createImageFileDir +import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.SteeringWheelView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -102,191 +103,177 @@ if (isPreviewSuccess) { val videoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) - binding.videoButton.text = "长按停止" } } binding.videoButton.setOnLongClickListener { //停止视频抓取 hkSDK.NET_DVR_StopSaveRealData(returnUserId) - binding.videoButton.text = "录像" true } - binding.toggleButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() - deviceItem.szDevName = "" - deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( - ProjectConstant.HK_NET_IP, - ProjectConstant.HK_NET_PORT, - ProjectConstant.HK_NET_USERNAME, - ProjectConstant.HK_NET_PASSWORD - ) - if (deviceItem.szDevName.isEmpty()) { - deviceItem.szDevName = deviceItem.devNetInfo.szIp - } - val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( - deviceItem.szDevName, deviceItem.devNetInfo - ) - if (loginV40Jna) { - //配置设备通道 - try { - val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] - returnUserId = deviceInfo.szUserId + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + if (!isPreviewSuccess) { + val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() + deviceItem.szDevName = "" + deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( + ProjectConstant.HK_NET_IP, + ProjectConstant.HK_NET_PORT, + ProjectConstant.HK_NET_USERNAME, + ProjectConstant.HK_NET_PASSWORD + ) + if (deviceItem.szDevName.isEmpty()) { + deviceItem.szDevName = deviceItem.devNetInfo.szIp + } + val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( + deviceItem.szDevName, deviceItem.devNetInfo + ) + if (loginV40Jna) { + //配置设备通道 + try { + val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] + returnUserId = deviceInfo.szUserId - aChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() - startAChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + aChannelNum = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() + startAChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + - deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 - startDChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + + deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 + startDChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - var iAnalogStartChan = startAChannel - var iDigitalStartChan = startDChannel + var iAnalogStartChan = startAChannel + var iDigitalStartChan = startDChannel - val channelList = ArrayList() + val channelList = ArrayList() - for (i in 0 until aChannelNum) { - channelList.add("ACamera_$iAnalogStartChan") - iAnalogStartChan++ - } + for (i in 0 until aChannelNum) { + channelList.add("ACamera_$iAnalogStartChan") + iAnalogStartChan++ + } - for (i in 0 until dChannelNum) { - channelList.add("DCamera_$iDigitalStartChan") - iDigitalStartChan++ - } - selectChannel = Integer.valueOf(channelList[0].getChannel()) + for (i in 0 until dChannelNum) { + channelList.add("DCamera_$iDigitalStartChan") + iDigitalStartChan++ + } + selectChannel = Integer.valueOf(channelList[0].getChannel()) - val streamList = ArrayList() - streamList.add("main_stream") - streamList.add("sub_stream") - streamList.add("third_stream") + val streamList = ArrayList() + streamList.add("main_stream") + streamList.add("sub_stream") + streamList.add("third_stream") - //开始预览 - if (previewHandle != -1) { - SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) - } - val strutPlayInfo = NET_DVR_PREVIEWINFO() - strutPlayInfo.lChannel = selectChannel - strutPlayInfo.dwStreamType = 1 - strutPlayInfo.bBlocked = 1 - strutPlayInfo.hHwnd = binding.surfaceView.holder - previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( - returnUserId, strutPlayInfo, null - ) - if (previewHandle < 0) { - Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") - return@setOnCheckedChangeListener - } - isPreviewSuccess = true - "预览开启成功".show(this) - //开始计时 - timer = Timer() - timerTask = object : TimerTask() { - override fun run() { - seconds++ - lifecycleScope.launch(Dispatchers.Main) { - binding.runningTimeView.text = seconds.toTime() + //开始预览 + if (previewHandle != -1) { + SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) + } + val strutPlayInfo = NET_DVR_PREVIEWINFO() + strutPlayInfo.lChannel = selectChannel + strutPlayInfo.dwStreamType = 1 + strutPlayInfo.bBlocked = 1 + strutPlayInfo.hHwnd = binding.surfaceView.holder + previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( + returnUserId, strutPlayInfo, null + ) + if (previewHandle < 0) { + Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") + return + } + isPreviewSuccess = true + "预览开启成功".show(this@MainActivity) + //开始计时 + timer = Timer() + timerTask = object : TimerTask() { + override fun run() { + seconds++ + lifecycleScope.launch(Dispatchers.Main) { + binding.runningTimeView.text = seconds.toTime() + } } } + timer?.schedule(timerTask, 0, 1000) + } catch (e: IndexOutOfBoundsException) { + e.printStackTrace() + "设备未正常连接,无法开启预览".show(this@MainActivity) } - timer?.schedule(timerTask, 0, 1000) - } catch (e: IndexOutOfBoundsException) { - e.printStackTrace() - "设备未正常连接,无法开启预览".show(this) } - } - } else { - if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { - return@setOnCheckedChangeListener - } - previewHandle = -1 - isPreviewSuccess = false - "预览关闭成功".show(this) - //停止计时 - timerTask?.cancel() - timer?.cancel() - } - } - - binding.leftButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed - ) - isActionUp = false + } else { + if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { + return } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) - isActionUp = true + previewHandle = -1 + isPreviewSuccess = false + "预览关闭成功".show(this@MainActivity) + //停止计时 + timerTask?.cancel() + timer?.cancel() } } - true - } - binding.topButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) - isActionUp = true + override fun onLeftTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.rightButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) - isActionUp = true + override fun onTopTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.bottomButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) - isActionUp = true + override fun onRightTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed + ) + isActionUp = false } } - true - } + + override fun onBottomTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed + ) + isActionUp = false + } + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + when (dir) { + SteeringWheelView.Direction.LEFT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.TOP -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) + isActionUp = true + } + + SteeringWheelView.Direction.RIGHT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.BOTTOM -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) + isActionUp = true + } + } + } + }) binding.downScaleButton.setOnTouchListener { _, event -> when (event.action) { @@ -363,7 +350,11 @@ } override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, true, R.color.white) + ImmersionBar.with(this).statusBarDarkFont(false).init() + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = getStatusBarHeight() + binding.rootView.setPadding(0, statusBarHeight, 0, 0) + binding.rootView.requestLayout() } override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { diff --git a/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml b/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml new file mode 100644 index 0000000..9f6b0ae --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index a8c77df..4d20b38 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -8,23 +8,24 @@ import android.view.MotionEvent import android.view.SurfaceHolder import androidx.lifecycle.lifecycleScope -import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.createVideoFileDir import com.casic.endoscope.extensions.getChannel -import com.casic.endoscope.extensions.initImmersionBar import com.casic.endoscope.extensions.toTime import com.casic.endoscope.utils.ProjectConstant import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.gyf.immersionbar.ImmersionBar import com.hikvision.netsdk.HCNetSDK import com.hikvision.netsdk.NET_DVR_JPEGPARA import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.PTZCommand import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.createImageFileDir +import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.SteeringWheelView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -102,191 +103,177 @@ if (isPreviewSuccess) { val videoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) - binding.videoButton.text = "长按停止" } } binding.videoButton.setOnLongClickListener { //停止视频抓取 hkSDK.NET_DVR_StopSaveRealData(returnUserId) - binding.videoButton.text = "录像" true } - binding.toggleButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() - deviceItem.szDevName = "" - deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( - ProjectConstant.HK_NET_IP, - ProjectConstant.HK_NET_PORT, - ProjectConstant.HK_NET_USERNAME, - ProjectConstant.HK_NET_PASSWORD - ) - if (deviceItem.szDevName.isEmpty()) { - deviceItem.szDevName = deviceItem.devNetInfo.szIp - } - val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( - deviceItem.szDevName, deviceItem.devNetInfo - ) - if (loginV40Jna) { - //配置设备通道 - try { - val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] - returnUserId = deviceInfo.szUserId + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + if (!isPreviewSuccess) { + val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() + deviceItem.szDevName = "" + deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( + ProjectConstant.HK_NET_IP, + ProjectConstant.HK_NET_PORT, + ProjectConstant.HK_NET_USERNAME, + ProjectConstant.HK_NET_PASSWORD + ) + if (deviceItem.szDevName.isEmpty()) { + deviceItem.szDevName = deviceItem.devNetInfo.szIp + } + val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( + deviceItem.szDevName, deviceItem.devNetInfo + ) + if (loginV40Jna) { + //配置设备通道 + try { + val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] + returnUserId = deviceInfo.szUserId - aChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() - startAChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + aChannelNum = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() + startAChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + - deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 - startDChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + + deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 + startDChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - var iAnalogStartChan = startAChannel - var iDigitalStartChan = startDChannel + var iAnalogStartChan = startAChannel + var iDigitalStartChan = startDChannel - val channelList = ArrayList() + val channelList = ArrayList() - for (i in 0 until aChannelNum) { - channelList.add("ACamera_$iAnalogStartChan") - iAnalogStartChan++ - } + for (i in 0 until aChannelNum) { + channelList.add("ACamera_$iAnalogStartChan") + iAnalogStartChan++ + } - for (i in 0 until dChannelNum) { - channelList.add("DCamera_$iDigitalStartChan") - iDigitalStartChan++ - } - selectChannel = Integer.valueOf(channelList[0].getChannel()) + for (i in 0 until dChannelNum) { + channelList.add("DCamera_$iDigitalStartChan") + iDigitalStartChan++ + } + selectChannel = Integer.valueOf(channelList[0].getChannel()) - val streamList = ArrayList() - streamList.add("main_stream") - streamList.add("sub_stream") - streamList.add("third_stream") + val streamList = ArrayList() + streamList.add("main_stream") + streamList.add("sub_stream") + streamList.add("third_stream") - //开始预览 - if (previewHandle != -1) { - SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) - } - val strutPlayInfo = NET_DVR_PREVIEWINFO() - strutPlayInfo.lChannel = selectChannel - strutPlayInfo.dwStreamType = 1 - strutPlayInfo.bBlocked = 1 - strutPlayInfo.hHwnd = binding.surfaceView.holder - previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( - returnUserId, strutPlayInfo, null - ) - if (previewHandle < 0) { - Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") - return@setOnCheckedChangeListener - } - isPreviewSuccess = true - "预览开启成功".show(this) - //开始计时 - timer = Timer() - timerTask = object : TimerTask() { - override fun run() { - seconds++ - lifecycleScope.launch(Dispatchers.Main) { - binding.runningTimeView.text = seconds.toTime() + //开始预览 + if (previewHandle != -1) { + SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) + } + val strutPlayInfo = NET_DVR_PREVIEWINFO() + strutPlayInfo.lChannel = selectChannel + strutPlayInfo.dwStreamType = 1 + strutPlayInfo.bBlocked = 1 + strutPlayInfo.hHwnd = binding.surfaceView.holder + previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( + returnUserId, strutPlayInfo, null + ) + if (previewHandle < 0) { + Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") + return + } + isPreviewSuccess = true + "预览开启成功".show(this@MainActivity) + //开始计时 + timer = Timer() + timerTask = object : TimerTask() { + override fun run() { + seconds++ + lifecycleScope.launch(Dispatchers.Main) { + binding.runningTimeView.text = seconds.toTime() + } } } + timer?.schedule(timerTask, 0, 1000) + } catch (e: IndexOutOfBoundsException) { + e.printStackTrace() + "设备未正常连接,无法开启预览".show(this@MainActivity) } - timer?.schedule(timerTask, 0, 1000) - } catch (e: IndexOutOfBoundsException) { - e.printStackTrace() - "设备未正常连接,无法开启预览".show(this) } - } - } else { - if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { - return@setOnCheckedChangeListener - } - previewHandle = -1 - isPreviewSuccess = false - "预览关闭成功".show(this) - //停止计时 - timerTask?.cancel() - timer?.cancel() - } - } - - binding.leftButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed - ) - isActionUp = false + } else { + if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { + return } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) - isActionUp = true + previewHandle = -1 + isPreviewSuccess = false + "预览关闭成功".show(this@MainActivity) + //停止计时 + timerTask?.cancel() + timer?.cancel() } } - true - } - binding.topButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) - isActionUp = true + override fun onLeftTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.rightButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) - isActionUp = true + override fun onTopTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.bottomButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) - isActionUp = true + override fun onRightTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed + ) + isActionUp = false } } - true - } + + override fun onBottomTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed + ) + isActionUp = false + } + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + when (dir) { + SteeringWheelView.Direction.LEFT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.TOP -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) + isActionUp = true + } + + SteeringWheelView.Direction.RIGHT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.BOTTOM -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) + isActionUp = true + } + } + } + }) binding.downScaleButton.setOnTouchListener { _, event -> when (event.action) { @@ -363,7 +350,11 @@ } override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, true, R.color.white) + ImmersionBar.with(this).statusBarDarkFont(false).init() + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = getStatusBarHeight() + binding.rootView.setPadding(0, statusBarHeight, 0, 0) + binding.rootView.requestLayout() } override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { diff --git a/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml b/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml new file mode 100644 index 0000000..9f6b0ae --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_album.xml b/app/src/main/res/drawable/ic_album.xml deleted file mode 100644 index 4efa798..0000000 --- a/app/src/main/res/drawable/ic_album.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index a8c77df..4d20b38 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -8,23 +8,24 @@ import android.view.MotionEvent import android.view.SurfaceHolder import androidx.lifecycle.lifecycleScope -import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.createVideoFileDir import com.casic.endoscope.extensions.getChannel -import com.casic.endoscope.extensions.initImmersionBar import com.casic.endoscope.extensions.toTime import com.casic.endoscope.utils.ProjectConstant import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.gyf.immersionbar.ImmersionBar import com.hikvision.netsdk.HCNetSDK import com.hikvision.netsdk.NET_DVR_JPEGPARA import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.PTZCommand import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.createImageFileDir +import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.SteeringWheelView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -102,191 +103,177 @@ if (isPreviewSuccess) { val videoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) - binding.videoButton.text = "长按停止" } } binding.videoButton.setOnLongClickListener { //停止视频抓取 hkSDK.NET_DVR_StopSaveRealData(returnUserId) - binding.videoButton.text = "录像" true } - binding.toggleButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() - deviceItem.szDevName = "" - deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( - ProjectConstant.HK_NET_IP, - ProjectConstant.HK_NET_PORT, - ProjectConstant.HK_NET_USERNAME, - ProjectConstant.HK_NET_PASSWORD - ) - if (deviceItem.szDevName.isEmpty()) { - deviceItem.szDevName = deviceItem.devNetInfo.szIp - } - val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( - deviceItem.szDevName, deviceItem.devNetInfo - ) - if (loginV40Jna) { - //配置设备通道 - try { - val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] - returnUserId = deviceInfo.szUserId + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + if (!isPreviewSuccess) { + val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() + deviceItem.szDevName = "" + deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( + ProjectConstant.HK_NET_IP, + ProjectConstant.HK_NET_PORT, + ProjectConstant.HK_NET_USERNAME, + ProjectConstant.HK_NET_PASSWORD + ) + if (deviceItem.szDevName.isEmpty()) { + deviceItem.szDevName = deviceItem.devNetInfo.szIp + } + val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( + deviceItem.szDevName, deviceItem.devNetInfo + ) + if (loginV40Jna) { + //配置设备通道 + try { + val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] + returnUserId = deviceInfo.szUserId - aChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() - startAChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + aChannelNum = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() + startAChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + - deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 - startDChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + + deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 + startDChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - var iAnalogStartChan = startAChannel - var iDigitalStartChan = startDChannel + var iAnalogStartChan = startAChannel + var iDigitalStartChan = startDChannel - val channelList = ArrayList() + val channelList = ArrayList() - for (i in 0 until aChannelNum) { - channelList.add("ACamera_$iAnalogStartChan") - iAnalogStartChan++ - } + for (i in 0 until aChannelNum) { + channelList.add("ACamera_$iAnalogStartChan") + iAnalogStartChan++ + } - for (i in 0 until dChannelNum) { - channelList.add("DCamera_$iDigitalStartChan") - iDigitalStartChan++ - } - selectChannel = Integer.valueOf(channelList[0].getChannel()) + for (i in 0 until dChannelNum) { + channelList.add("DCamera_$iDigitalStartChan") + iDigitalStartChan++ + } + selectChannel = Integer.valueOf(channelList[0].getChannel()) - val streamList = ArrayList() - streamList.add("main_stream") - streamList.add("sub_stream") - streamList.add("third_stream") + val streamList = ArrayList() + streamList.add("main_stream") + streamList.add("sub_stream") + streamList.add("third_stream") - //开始预览 - if (previewHandle != -1) { - SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) - } - val strutPlayInfo = NET_DVR_PREVIEWINFO() - strutPlayInfo.lChannel = selectChannel - strutPlayInfo.dwStreamType = 1 - strutPlayInfo.bBlocked = 1 - strutPlayInfo.hHwnd = binding.surfaceView.holder - previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( - returnUserId, strutPlayInfo, null - ) - if (previewHandle < 0) { - Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") - return@setOnCheckedChangeListener - } - isPreviewSuccess = true - "预览开启成功".show(this) - //开始计时 - timer = Timer() - timerTask = object : TimerTask() { - override fun run() { - seconds++ - lifecycleScope.launch(Dispatchers.Main) { - binding.runningTimeView.text = seconds.toTime() + //开始预览 + if (previewHandle != -1) { + SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) + } + val strutPlayInfo = NET_DVR_PREVIEWINFO() + strutPlayInfo.lChannel = selectChannel + strutPlayInfo.dwStreamType = 1 + strutPlayInfo.bBlocked = 1 + strutPlayInfo.hHwnd = binding.surfaceView.holder + previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( + returnUserId, strutPlayInfo, null + ) + if (previewHandle < 0) { + Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") + return + } + isPreviewSuccess = true + "预览开启成功".show(this@MainActivity) + //开始计时 + timer = Timer() + timerTask = object : TimerTask() { + override fun run() { + seconds++ + lifecycleScope.launch(Dispatchers.Main) { + binding.runningTimeView.text = seconds.toTime() + } } } + timer?.schedule(timerTask, 0, 1000) + } catch (e: IndexOutOfBoundsException) { + e.printStackTrace() + "设备未正常连接,无法开启预览".show(this@MainActivity) } - timer?.schedule(timerTask, 0, 1000) - } catch (e: IndexOutOfBoundsException) { - e.printStackTrace() - "设备未正常连接,无法开启预览".show(this) } - } - } else { - if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { - return@setOnCheckedChangeListener - } - previewHandle = -1 - isPreviewSuccess = false - "预览关闭成功".show(this) - //停止计时 - timerTask?.cancel() - timer?.cancel() - } - } - - binding.leftButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed - ) - isActionUp = false + } else { + if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { + return } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) - isActionUp = true + previewHandle = -1 + isPreviewSuccess = false + "预览关闭成功".show(this@MainActivity) + //停止计时 + timerTask?.cancel() + timer?.cancel() } } - true - } - binding.topButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) - isActionUp = true + override fun onLeftTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.rightButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) - isActionUp = true + override fun onTopTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.bottomButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) - isActionUp = true + override fun onRightTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed + ) + isActionUp = false } } - true - } + + override fun onBottomTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed + ) + isActionUp = false + } + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + when (dir) { + SteeringWheelView.Direction.LEFT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.TOP -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) + isActionUp = true + } + + SteeringWheelView.Direction.RIGHT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.BOTTOM -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) + isActionUp = true + } + } + } + }) binding.downScaleButton.setOnTouchListener { _, event -> when (event.action) { @@ -363,7 +350,11 @@ } override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, true, R.color.white) + ImmersionBar.with(this).statusBarDarkFont(false).init() + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = getStatusBarHeight() + binding.rootView.setPadding(0, statusBarHeight, 0, 0) + binding.rootView.requestLayout() } override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { diff --git a/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml b/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml new file mode 100644 index 0000000..9f6b0ae --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_album.xml b/app/src/main/res/drawable/ic_album.xml deleted file mode 100644 index 4efa798..0000000 --- a/app/src/main/res/drawable/ic_album.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_minus.xml b/app/src/main/res/drawable/ic_minus.xml index 2375cbc..98d3e0b 100644 --- a/app/src/main/res/drawable/ic_minus.xml +++ b/app/src/main/res/drawable/ic_minus.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index a8c77df..4d20b38 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -8,23 +8,24 @@ import android.view.MotionEvent import android.view.SurfaceHolder import androidx.lifecycle.lifecycleScope -import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.createVideoFileDir import com.casic.endoscope.extensions.getChannel -import com.casic.endoscope.extensions.initImmersionBar import com.casic.endoscope.extensions.toTime import com.casic.endoscope.utils.ProjectConstant import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.gyf.immersionbar.ImmersionBar import com.hikvision.netsdk.HCNetSDK import com.hikvision.netsdk.NET_DVR_JPEGPARA import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.PTZCommand import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.createImageFileDir +import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.SteeringWheelView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -102,191 +103,177 @@ if (isPreviewSuccess) { val videoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) - binding.videoButton.text = "长按停止" } } binding.videoButton.setOnLongClickListener { //停止视频抓取 hkSDK.NET_DVR_StopSaveRealData(returnUserId) - binding.videoButton.text = "录像" true } - binding.toggleButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() - deviceItem.szDevName = "" - deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( - ProjectConstant.HK_NET_IP, - ProjectConstant.HK_NET_PORT, - ProjectConstant.HK_NET_USERNAME, - ProjectConstant.HK_NET_PASSWORD - ) - if (deviceItem.szDevName.isEmpty()) { - deviceItem.szDevName = deviceItem.devNetInfo.szIp - } - val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( - deviceItem.szDevName, deviceItem.devNetInfo - ) - if (loginV40Jna) { - //配置设备通道 - try { - val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] - returnUserId = deviceInfo.szUserId + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + if (!isPreviewSuccess) { + val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() + deviceItem.szDevName = "" + deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( + ProjectConstant.HK_NET_IP, + ProjectConstant.HK_NET_PORT, + ProjectConstant.HK_NET_USERNAME, + ProjectConstant.HK_NET_PASSWORD + ) + if (deviceItem.szDevName.isEmpty()) { + deviceItem.szDevName = deviceItem.devNetInfo.szIp + } + val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( + deviceItem.szDevName, deviceItem.devNetInfo + ) + if (loginV40Jna) { + //配置设备通道 + try { + val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] + returnUserId = deviceInfo.szUserId - aChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() - startAChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + aChannelNum = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() + startAChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + - deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 - startDChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + + deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 + startDChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - var iAnalogStartChan = startAChannel - var iDigitalStartChan = startDChannel + var iAnalogStartChan = startAChannel + var iDigitalStartChan = startDChannel - val channelList = ArrayList() + val channelList = ArrayList() - for (i in 0 until aChannelNum) { - channelList.add("ACamera_$iAnalogStartChan") - iAnalogStartChan++ - } + for (i in 0 until aChannelNum) { + channelList.add("ACamera_$iAnalogStartChan") + iAnalogStartChan++ + } - for (i in 0 until dChannelNum) { - channelList.add("DCamera_$iDigitalStartChan") - iDigitalStartChan++ - } - selectChannel = Integer.valueOf(channelList[0].getChannel()) + for (i in 0 until dChannelNum) { + channelList.add("DCamera_$iDigitalStartChan") + iDigitalStartChan++ + } + selectChannel = Integer.valueOf(channelList[0].getChannel()) - val streamList = ArrayList() - streamList.add("main_stream") - streamList.add("sub_stream") - streamList.add("third_stream") + val streamList = ArrayList() + streamList.add("main_stream") + streamList.add("sub_stream") + streamList.add("third_stream") - //开始预览 - if (previewHandle != -1) { - SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) - } - val strutPlayInfo = NET_DVR_PREVIEWINFO() - strutPlayInfo.lChannel = selectChannel - strutPlayInfo.dwStreamType = 1 - strutPlayInfo.bBlocked = 1 - strutPlayInfo.hHwnd = binding.surfaceView.holder - previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( - returnUserId, strutPlayInfo, null - ) - if (previewHandle < 0) { - Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") - return@setOnCheckedChangeListener - } - isPreviewSuccess = true - "预览开启成功".show(this) - //开始计时 - timer = Timer() - timerTask = object : TimerTask() { - override fun run() { - seconds++ - lifecycleScope.launch(Dispatchers.Main) { - binding.runningTimeView.text = seconds.toTime() + //开始预览 + if (previewHandle != -1) { + SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) + } + val strutPlayInfo = NET_DVR_PREVIEWINFO() + strutPlayInfo.lChannel = selectChannel + strutPlayInfo.dwStreamType = 1 + strutPlayInfo.bBlocked = 1 + strutPlayInfo.hHwnd = binding.surfaceView.holder + previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( + returnUserId, strutPlayInfo, null + ) + if (previewHandle < 0) { + Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") + return + } + isPreviewSuccess = true + "预览开启成功".show(this@MainActivity) + //开始计时 + timer = Timer() + timerTask = object : TimerTask() { + override fun run() { + seconds++ + lifecycleScope.launch(Dispatchers.Main) { + binding.runningTimeView.text = seconds.toTime() + } } } + timer?.schedule(timerTask, 0, 1000) + } catch (e: IndexOutOfBoundsException) { + e.printStackTrace() + "设备未正常连接,无法开启预览".show(this@MainActivity) } - timer?.schedule(timerTask, 0, 1000) - } catch (e: IndexOutOfBoundsException) { - e.printStackTrace() - "设备未正常连接,无法开启预览".show(this) } - } - } else { - if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { - return@setOnCheckedChangeListener - } - previewHandle = -1 - isPreviewSuccess = false - "预览关闭成功".show(this) - //停止计时 - timerTask?.cancel() - timer?.cancel() - } - } - - binding.leftButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed - ) - isActionUp = false + } else { + if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { + return } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) - isActionUp = true + previewHandle = -1 + isPreviewSuccess = false + "预览关闭成功".show(this@MainActivity) + //停止计时 + timerTask?.cancel() + timer?.cancel() } } - true - } - binding.topButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) - isActionUp = true + override fun onLeftTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.rightButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) - isActionUp = true + override fun onTopTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.bottomButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) - isActionUp = true + override fun onRightTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed + ) + isActionUp = false } } - true - } + + override fun onBottomTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed + ) + isActionUp = false + } + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + when (dir) { + SteeringWheelView.Direction.LEFT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.TOP -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) + isActionUp = true + } + + SteeringWheelView.Direction.RIGHT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.BOTTOM -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) + isActionUp = true + } + } + } + }) binding.downScaleButton.setOnTouchListener { _, event -> when (event.action) { @@ -363,7 +350,11 @@ } override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, true, R.color.white) + ImmersionBar.with(this).statusBarDarkFont(false).init() + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = getStatusBarHeight() + binding.rootView.setPadding(0, statusBarHeight, 0, 0) + binding.rootView.requestLayout() } override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { diff --git a/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml b/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml new file mode 100644 index 0000000..9f6b0ae --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_album.xml b/app/src/main/res/drawable/ic_album.xml deleted file mode 100644 index 4efa798..0000000 --- a/app/src/main/res/drawable/ic_album.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_minus.xml b/app/src/main/res/drawable/ic_minus.xml index 2375cbc..98d3e0b 100644 --- a/app/src/main/res/drawable/ic_minus.xml +++ b/app/src/main/res/drawable/ic_minus.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_plus.xml b/app/src/main/res/drawable/ic_plus.xml index 969107b..c76cd21 100644 --- a/app/src/main/res/drawable/ic_plus.xml +++ b/app/src/main/res/drawable/ic_plus.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index a8c77df..4d20b38 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -8,23 +8,24 @@ import android.view.MotionEvent import android.view.SurfaceHolder import androidx.lifecycle.lifecycleScope -import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.createVideoFileDir import com.casic.endoscope.extensions.getChannel -import com.casic.endoscope.extensions.initImmersionBar import com.casic.endoscope.extensions.toTime import com.casic.endoscope.utils.ProjectConstant import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.gyf.immersionbar.ImmersionBar import com.hikvision.netsdk.HCNetSDK import com.hikvision.netsdk.NET_DVR_JPEGPARA import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.PTZCommand import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.createImageFileDir +import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.SteeringWheelView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -102,191 +103,177 @@ if (isPreviewSuccess) { val videoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) - binding.videoButton.text = "长按停止" } } binding.videoButton.setOnLongClickListener { //停止视频抓取 hkSDK.NET_DVR_StopSaveRealData(returnUserId) - binding.videoButton.text = "录像" true } - binding.toggleButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() - deviceItem.szDevName = "" - deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( - ProjectConstant.HK_NET_IP, - ProjectConstant.HK_NET_PORT, - ProjectConstant.HK_NET_USERNAME, - ProjectConstant.HK_NET_PASSWORD - ) - if (deviceItem.szDevName.isEmpty()) { - deviceItem.szDevName = deviceItem.devNetInfo.szIp - } - val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( - deviceItem.szDevName, deviceItem.devNetInfo - ) - if (loginV40Jna) { - //配置设备通道 - try { - val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] - returnUserId = deviceInfo.szUserId + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + if (!isPreviewSuccess) { + val deviceItem = SDKGuider.sdkGuider.devManageGuider.DeviceItem() + deviceItem.szDevName = "" + deviceItem.devNetInfo = SDKGuider.sdkGuider.devManageGuider.DevNetInfo( + ProjectConstant.HK_NET_IP, + ProjectConstant.HK_NET_PORT, + ProjectConstant.HK_NET_USERNAME, + ProjectConstant.HK_NET_PASSWORD + ) + if (deviceItem.szDevName.isEmpty()) { + deviceItem.szDevName = deviceItem.devNetInfo.szIp + } + val loginV40Jna = SDKGuider.sdkGuider.devManageGuider.login_v40_jna( + deviceItem.szDevName, deviceItem.devNetInfo + ) + if (loginV40Jna) { + //配置设备通道 + try { + val deviceInfo = SDKGuider.sdkGuider.devManageGuider.devList[0] + returnUserId = deviceInfo.szUserId - aChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() - startAChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + aChannelNum = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byChanNum.toInt() + startAChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + - deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 - startDChannel = - deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() + dChannelNum = deviceInfo.deviceInfoV40_jna.struDeviceV30.byIPChanNum + + deviceInfo.deviceInfoV40_jna.struDeviceV30.byHighDChanNum * 256 + startDChannel = + deviceInfo.deviceInfoV40_jna.struDeviceV30.byStartChan.toInt() - var iAnalogStartChan = startAChannel - var iDigitalStartChan = startDChannel + var iAnalogStartChan = startAChannel + var iDigitalStartChan = startDChannel - val channelList = ArrayList() + val channelList = ArrayList() - for (i in 0 until aChannelNum) { - channelList.add("ACamera_$iAnalogStartChan") - iAnalogStartChan++ - } + for (i in 0 until aChannelNum) { + channelList.add("ACamera_$iAnalogStartChan") + iAnalogStartChan++ + } - for (i in 0 until dChannelNum) { - channelList.add("DCamera_$iDigitalStartChan") - iDigitalStartChan++ - } - selectChannel = Integer.valueOf(channelList[0].getChannel()) + for (i in 0 until dChannelNum) { + channelList.add("DCamera_$iDigitalStartChan") + iDigitalStartChan++ + } + selectChannel = Integer.valueOf(channelList[0].getChannel()) - val streamList = ArrayList() - streamList.add("main_stream") - streamList.add("sub_stream") - streamList.add("third_stream") + val streamList = ArrayList() + streamList.add("main_stream") + streamList.add("sub_stream") + streamList.add("third_stream") - //开始预览 - if (previewHandle != -1) { - SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) - } - val strutPlayInfo = NET_DVR_PREVIEWINFO() - strutPlayInfo.lChannel = selectChannel - strutPlayInfo.dwStreamType = 1 - strutPlayInfo.bBlocked = 1 - strutPlayInfo.hHwnd = binding.surfaceView.holder - previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( - returnUserId, strutPlayInfo, null - ) - if (previewHandle < 0) { - Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") - return@setOnCheckedChangeListener - } - isPreviewSuccess = true - "预览开启成功".show(this) - //开始计时 - timer = Timer() - timerTask = object : TimerTask() { - override fun run() { - seconds++ - lifecycleScope.launch(Dispatchers.Main) { - binding.runningTimeView.text = seconds.toTime() + //开始预览 + if (previewHandle != -1) { + SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle) + } + val strutPlayInfo = NET_DVR_PREVIEWINFO() + strutPlayInfo.lChannel = selectChannel + strutPlayInfo.dwStreamType = 1 + strutPlayInfo.bBlocked = 1 + strutPlayInfo.hHwnd = binding.surfaceView.holder + previewHandle = SDKGuider.sdkGuider.devPreviewGuider.RealPlay_V40_jni( + returnUserId, strutPlayInfo, null + ) + if (previewHandle < 0) { + Log.d(kTag, "initEvent: Err:${MessageCodeHub.getErrorCode()}") + return + } + isPreviewSuccess = true + "预览开启成功".show(this@MainActivity) + //开始计时 + timer = Timer() + timerTask = object : TimerTask() { + override fun run() { + seconds++ + lifecycleScope.launch(Dispatchers.Main) { + binding.runningTimeView.text = seconds.toTime() + } } } + timer?.schedule(timerTask, 0, 1000) + } catch (e: IndexOutOfBoundsException) { + e.printStackTrace() + "设备未正常连接,无法开启预览".show(this@MainActivity) } - timer?.schedule(timerTask, 0, 1000) - } catch (e: IndexOutOfBoundsException) { - e.printStackTrace() - "设备未正常连接,无法开启预览".show(this) } - } - } else { - if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { - return@setOnCheckedChangeListener - } - previewHandle = -1 - isPreviewSuccess = false - "预览关闭成功".show(this) - //停止计时 - timerTask?.cancel() - timer?.cancel() - } - } - - binding.leftButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed - ) - isActionUp = false + } else { + if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { + return } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) - isActionUp = true + previewHandle = -1 + isPreviewSuccess = false + "预览关闭成功".show(this@MainActivity) + //停止计时 + timerTask?.cancel() + timer?.cancel() } } - true - } - binding.topButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) - isActionUp = true + override fun onLeftTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.rightButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) - isActionUp = true + override fun onTopTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed + ) + isActionUp = false } } - true - } - binding.bottomButton.setOnTouchListener { _, event -> - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControlWithSpeed( - previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed - ) - isActionUp = false - } - } - - MotionEvent.ACTION_UP -> { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) - isActionUp = true + override fun onRightTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed + ) + isActionUp = false } } - true - } + + override fun onBottomTurn() { + if (isPreviewSuccess && isActionUp) { + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed + ) + isActionUp = false + } + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + when (dir) { + SteeringWheelView.Direction.LEFT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.TOP -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 1) + isActionUp = true + } + + SteeringWheelView.Direction.RIGHT -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 1) + isActionUp = true + } + + SteeringWheelView.Direction.BOTTOM -> { + hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 1) + isActionUp = true + } + } + } + }) binding.downScaleButton.setOnTouchListener { _, event -> when (event.action) { @@ -363,7 +350,11 @@ } override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, true, R.color.white) + ImmersionBar.with(this).statusBarDarkFont(false).init() + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = getStatusBarHeight() + binding.rootView.setPadding(0, statusBarHeight, 0, 0) + binding.rootView.requestLayout() } override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { diff --git a/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml b/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml new file mode 100644 index 0000000..9f6b0ae --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_blue_10.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_album.xml b/app/src/main/res/drawable/ic_album.xml deleted file mode 100644 index 4efa798..0000000 --- a/app/src/main/res/drawable/ic_album.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_minus.xml b/app/src/main/res/drawable/ic_minus.xml index 2375cbc..98d3e0b 100644 --- a/app/src/main/res/drawable/ic_minus.xml +++ b/app/src/main/res/drawable/ic_minus.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_plus.xml b/app/src/main/res/drawable/ic_plus.xml index 969107b..c76cd21 100644 --- a/app/src/main/res/drawable/ic_plus.xml +++ b/app/src/main/res/drawable/ic_plus.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index f66ea25..5e36bcc 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,20 +4,28 @@ android:id="@+id/rootView" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/white" + android:background="@mipmap/banner" android:orientation="vertical"> - + android:gravity="center_vertical" + android:orientation="horizontal"> - + + @@ -25,223 +33,321 @@ android:id="@+id/openAlbumButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentEnd="true" - android:layout_centerVertical="true" - android:src="@drawable/ic_album" /> - + android:layout_marginEnd="@dimen/dp_10" + android:background="@null" + android:src="@mipmap/image_button" /> + + android:background="@color/backgroundColor" + android:orientation="horizontal"> + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1.5" + android:orientation="vertical"> - + android:layout_margin="@dimen/dp_10" + app:cardCornerRadius="@dimen/dp_7"> - + - + - + - - + - + -