From 78bd3633725ce1d5b69d377c5e5b32d0e51b8988 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 18 Jul 2023 15:45:11 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=9B=9E=E6=94=BE=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/bean/TraceVideoBean.kt | 8 + .../com/navinfo/omqs/http/NetworkService.kt | 8 +- .../navinfo/omqs/http/NetworkServiceImpl.kt | 28 +++ .../omqs/ui/activity/map/MainActivity.kt | 92 +++++++++- .../omqs/ui/activity/map/MainViewModel.kt | 164 ++++++++++++++++-- .../omqs/ui/activity/scan/QRCodeViewModel.kt | 10 ++ .../omqs/ui/activity/scan/QrCodeActivity.kt | 6 + .../EvaluationResultViewModel.kt | 10 +- .../fragment/evaluationresult/LeftAdapter.kt | 4 +- app/src/main/res/layout/activity_main.xml | 1 + .../collect/library/data/entity/Feature.java | 2 +- .../library/map/handler/MarkHandler.kt | 52 +++--- 12 files changed, 334 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/bean/TraceVideoBean.kt diff --git a/app/src/main/java/com/navinfo/omqs/bean/TraceVideoBean.kt b/app/src/main/java/com/navinfo/omqs/bean/TraceVideoBean.kt new file mode 100644 index 00000000..f8d0da42 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/bean/TraceVideoBean.kt @@ -0,0 +1,8 @@ +package com.navinfo.omqs.bean + +data class TraceVideoBean( + var userid: String = "", + var playMode: String = "", + var time: String = "", + var command: String = "", +) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt b/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt index beca12b6..2570f031 100644 --- a/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt +++ b/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt @@ -6,8 +6,7 @@ import com.navinfo.omqs.bean.IndoorConnectionInfoBean import com.navinfo.omqs.bean.LoginUserBean import com.navinfo.omqs.bean.QRCodeBean import com.navinfo.omqs.bean.SysUserBean -import okhttp3.ResponseBody -import retrofit2.Response +import com.navinfo.omqs.bean.TraceVideoBean /** @@ -38,4 +37,9 @@ interface NetworkService { * 更新用户信息 */ suspend fun updateServerInfo(url: String,indoorConnectionInfoBean: IndoorConnectionInfoBean): NetResult + + /** + * 设置轨迹对应的视频 + */ + suspend fun sendServerCommand(url: String,traceVideoBean: TraceVideoBean): NetResult } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt b/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt index e2ce3a7e..059229b8 100644 --- a/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt +++ b/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt @@ -6,6 +6,7 @@ import com.navinfo.omqs.bean.IndoorConnectionInfoBean import com.navinfo.omqs.bean.LoginUserBean import com.navinfo.omqs.bean.QRCodeBean import com.navinfo.omqs.bean.SysUserBean +import com.navinfo.omqs.bean.TraceVideoBean import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import okhttp3.ResponseBody @@ -110,6 +111,33 @@ class NetworkServiceImpl @Inject constructor( map["baseurl"] = indoorConnectionInfoBean.baseurl map["platform"] = indoorConnectionInfoBean.platform + val result = netApi.retrofitUpdateServerInfo(url,map) + if (result.isSuccessful) { + if (result.code() == 200) { + NetResult.Success(result.body()) + } else { + NetResult.Failure(result.code(), result.message()) + } + } else { + NetResult.Failure(result.code(), result.message()) + } + } catch (e: Exception) { + NetResult.Error(e) + } + } + + override suspend fun sendServerCommand( + url: String, + traceVideoBean: TraceVideoBean + ): NetResult = + //在IO线程中运行 + withContext(Dispatchers.IO) { + return@withContext try { + val map: MutableMap = HashMap() + map["userid"] = traceVideoBean.userid + map["playMode"] = traceVideoBean.playMode + map["time"] = traceVideoBean.time + val result = netApi.retrofitUpdateServerInfo(url,map) if (result.isSuccessful) { if (result.code() == 200) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index f2e296c2..a36d1cb2 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -20,11 +20,13 @@ import androidx.navigation.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.map.NIMapController import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.bean.SignBean +import com.navinfo.omqs.bean.TraceVideoBean import com.navinfo.omqs.databinding.ActivityMainBinding import com.navinfo.omqs.http.offlinemapdownload.OfflineMapDownloadManager import com.navinfo.omqs.tools.LayerConfigUtils @@ -34,12 +36,14 @@ import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment import com.navinfo.omqs.ui.fragment.signMoreInfo.SignMoreInfoFragment import com.navinfo.omqs.ui.fragment.tasklist.TaskManagerFragment +import com.navinfo.omqs.ui.other.BaseToast import com.navinfo.omqs.ui.widget.RecyclerViewSpacesItemDecoration import com.navinfo.omqs.util.FlowEventBus import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.oscim.core.GeoPoint +import org.oscim.layers.marker.MarkerItem import org.oscim.renderer.GLViewport import org.videolan.vlc.Util import java.math.BigDecimal @@ -227,7 +231,10 @@ class MainActivity : BaseActivity() { //捕捉列表变化回调 viewModel.liveDataNILocationList.observe(this) { if(viewModel.isSelectTrace()){ - Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + //Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + viewModel.showMarker(this,it) + val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${it.time}:000") + viewModel.sendServerCommand(this,traceVideoBean) } } @@ -535,10 +542,17 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun tracePointsOnclick() { viewModel.setSelectTrace(!viewModel.isSelectTrace()) + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + if(viewModel.isSelectTrace()){ Toast.makeText(this,"请选择轨迹点!",Toast.LENGTH_LONG).show() + //调用撤销自动播放 + binding.mainActivitySnapshotFinish.isEnabled = false + binding.mainActivitySnapshotRewind.isEnabled = false + binding.mainActivitySnapshotPause.isEnabled = false + binding.mainActivitySnapshotNext.isEnabled = false + viewModel.cancelTrace() } - binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() } /** @@ -550,6 +564,7 @@ class MainActivity : BaseActivity() { viewModel.setSelectTrace(false) viewModel.setMediaFlag(false) viewModel.setSelectPauseTrace(false) + binding.mainActivityMenuIndoorGroup.visibility = View.GONE binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() @@ -569,7 +584,16 @@ class MainActivity : BaseActivity() { */ @RequiresApi(Build.VERSION_CODES.N) fun rewindTraceOnclick() { - pasePlayTrace() + pausePlayTrace() + val item = mapController.markerHandle.getNILocation(viewModel.currentIndexNiLocation-1) + if(item!=null){ + viewModel.currentIndexNiLocation = viewModel.currentIndexNiLocation-1 + viewModel.showMarker(this,(item as MarkerItem).uid as NiLocation) + val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000") + viewModel.sendServerCommand(this,traceVideoBean) + }else{ + dealNoData() + } } /** @@ -581,6 +605,41 @@ class MainActivity : BaseActivity() { binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + if(viewModel.isSelectPauseTrace()){ + playVideo() + }else{ + pauseVideo() + viewModel.cancelTrace() + } + } + + @RequiresApi(Build.VERSION_CODES.N) + fun playVideo(){ + if (mapController.markerHandle.getCurrentMark()==null) { + BaseToast.makeText(this, "请先选择轨迹点!", BaseToast.LENGTH_SHORT).show() + return + } + viewModel.setSelectTrace(false) + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + val traceVideoBean = TraceVideoBean(command = "playVideo?", userid = Constant.USER_ID) + viewModel.sendServerCommand(this,traceVideoBean) + } + + /** + * 设置为播放状态 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun setPlayStatus() { + //切换为播放 + viewModel.setSelectPauseTrace(true) + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + playVideo() + } + + @RequiresApi(Build.VERSION_CODES.N) + fun pauseVideo(){ + val traceVideoBean = TraceVideoBean(command = "pauseVideo?", userid = Constant.USER_ID) + viewModel.sendServerCommand(this,traceVideoBean) } /** @@ -588,15 +647,38 @@ class MainActivity : BaseActivity() { */ @RequiresApi(Build.VERSION_CODES.N) fun nextTraceOnclick() { - pasePlayTrace() + pausePlayTrace() + val item = mapController.markerHandle.getNILocation(viewModel.currentIndexNiLocation+1) + if(item!=null){ + viewModel.currentIndexNiLocation = viewModel.currentIndexNiLocation+1 + viewModel.showMarker(this,(item as MarkerItem).uid as NiLocation) + val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000") + viewModel.sendServerCommand(this,traceVideoBean) + }else{ + dealNoData() + } } @RequiresApi(Build.VERSION_CODES.N) - fun pasePlayTrace() { + private fun dealNoData() { + BaseToast.makeText(this, "无数据了!", Toast.LENGTH_SHORT).show() + + //无数据时自动暂停播放,并停止轨迹 + if (viewModel.isSelectPauseTrace()) { + pauseVideo() + viewModel.cancelTrace() + viewModel.setSelectPauseTrace(false) + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + } + } + + @RequiresApi(Build.VERSION_CODES.N) + fun pausePlayTrace() { viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() viewModel.setSelectPauseTrace(false) binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + viewModel.cancelTrace() } diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 6a0b84ab..aa4b38f6 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -15,10 +15,10 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.PopupWindow +import android.widget.Toast import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils @@ -35,10 +35,16 @@ import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.bean.ImportConfig +import com.navinfo.omqs.bean.QRCodeBean import com.navinfo.omqs.bean.SignBean +import com.navinfo.omqs.bean.TraceVideoBean import com.navinfo.omqs.db.RealmOperateHelper +import com.navinfo.omqs.http.NetResult +import com.navinfo.omqs.http.NetworkService +import com.navinfo.omqs.ui.activity.scan.QrCodeStatus import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.manager.TakePhotoManager +import com.navinfo.omqs.ui.other.BaseToast import com.navinfo.omqs.ui.widget.SignUtil import com.navinfo.omqs.util.DateTimeUtil import com.navinfo.omqs.util.SoundMeter @@ -56,6 +62,7 @@ import org.oscim.core.MapPosition import org.oscim.map.Map import org.videolan.libvlc.LibVlcUtil import java.io.File +import java.io.IOException import java.util.* import javax.inject.Inject @@ -69,6 +76,7 @@ class MainViewModel @Inject constructor( private val mapController: NIMapController, private val traceDataBase: TraceDataBase, private val realmOperateHelper: RealmOperateHelper, + private val networkService: NetworkService, private val sharedPreferences: SharedPreferences ) : ViewModel() { @@ -97,6 +105,8 @@ class MainViewModel @Inject constructor( */ val liveDataSignMoreInfo = MutableLiveData() + private var traceTag: String = "TRACE_TAG" + // var testPoint = GeoPoint(0, 0) //uuid标识,用于记录轨迹组 @@ -120,6 +130,9 @@ class MainViewModel @Inject constructor( val liveDataCenterPoint = MutableLiveData() + //状态 + val qrCodeStatus: MutableLiveData = MutableLiveData() + /** * 是不是线选择模式 */ @@ -144,6 +157,8 @@ class MainViewModel @Inject constructor( private var lastNiLocaion: NiLocation? = null + var currentIndexNiLocation: Int = 0; + init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> when (e) { @@ -163,8 +178,9 @@ class MainViewModel @Inject constructor( liveDataNoteIdList.value = list } - override fun onNiLocation(item: NiLocation) { + override fun onNiLocation(index: Int, item: NiLocation) { liveDataNILocationList.value = item + currentIndexNiLocation = index } }) @@ -175,11 +191,11 @@ class MainViewModel @Inject constructor( mapController.onMapClickFlow.collectLatest { // testPoint = it //线选择状态 -/* if (bSelectRoad) { - captureLink(it) - } else { - captureItem(it) - }*/ + /* if (bSelectRoad) { + captureLink(it) + } else { + captureItem(it) + }*/ } } viewModelScope.launch(Dispatchers.IO) { @@ -259,7 +275,7 @@ class MainViewModel @Inject constructor( mapController.locationLayerHandler.niLocationFlow.collect { location -> //过滤掉无效点 - if(!GeometryTools.isCheckError(location.longitude,location.latitude)){ + if (!GeometryTools.isCheckError(location.longitude, location.latitude)) { val geometry = GeometryTools.createGeometry( GeoPoint( location.latitude, location.longitude @@ -289,9 +305,10 @@ class MainViewModel @Inject constructor( if (lastNiLocaion != null) { val disance = GeometryTools.getDistance( location.latitude, location.longitude, - lastNiLocaion!!.latitude, lastNiLocaion!!.longitude) + lastNiLocaion!!.latitude, lastNiLocaion!!.longitude + ) //相距差距大于2.5米以上进行存储 - if (disance > 2.5) { + if (disance > 2.5 && disance < 60) { traceDataBase.niLocationDao.insert(location) mapController.markerHandle.addNiLocationMarkerItem(location) mapController.mMapView.vtmMap.updateMap(true) @@ -299,8 +316,8 @@ class MainViewModel @Inject constructor( } } else { traceDataBase.niLocationDao.insert(location) -/* mapController.markerHandle.addNiLocationMarkerItem(location) - mapController.mMapView.vtmMap.updateMap(true)*/ + mapController.markerHandle.addNiLocationMarkerItem(location) + mapController.mMapView.vtmMap.updateMap(true) lastNiLocaion = location } } @@ -309,7 +326,11 @@ class MainViewModel @Inject constructor( //用于定位点捕捉道路 viewModelScope.launch(Dispatchers.Default) { mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> - if (!isSelectRoad()&&!GeometryTools.isCheckError(location.longitude,location.latitude)) captureLink( + if (!isSelectRoad() && !GeometryTools.isCheckError( + location.longitude, + location.latitude + ) + ) captureLink( GeoPoint( location.latitude, location.longitude @@ -335,11 +356,11 @@ class MainViewModel @Inject constructor( */ @RequiresApi(Build.VERSION_CODES.N) private suspend fun captureLink(point: GeoPoint) { - if(captureLinkState){ + if (captureLinkState) { return } - try{ + try { captureLinkState = true val linkList = realmOperateHelper.queryLink( @@ -437,9 +458,9 @@ class MainViewModel @Inject constructor( liveDataRoadName.postValue(null) } - }catch (e:Exception){ + } catch (e: Exception) { - }finally { + } finally { captureLinkState = false } @@ -673,5 +694,114 @@ class MainViewModel @Inject constructor( liveDataSignMoreInfo.value = data } + fun sendServerCommand(context: Context, traceVideoBean: TraceVideoBean) { + if (TextUtils.isEmpty(Constant.INDOOR_IP)) { + Toast.makeText(context, "获取ip失败!", Toast.LENGTH_LONG).show() + return + } + + viewModelScope.launch(Dispatchers.Default) { + val url = "http://${Constant.INDOOR_IP}:8080/sensor/service/${traceVideoBean.command}?" + + when (val result = networkService.sendServerCommand( + url = url, + traceVideoBean = traceVideoBean + )) { + is NetResult.Success<*> -> { + + if (result.data != null) { + try { + + val defaultUserResponse = result.data as QRCodeBean + + if (defaultUserResponse.errcode == 0) { + + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "命令成功。", + Toast.LENGTH_LONG + ).show() + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS) + } + } else { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "命令无效${defaultUserResponse.errmsg}", + Toast.LENGTH_SHORT + ) + .show() + } + } + + } catch (e: IOException) { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${e.message}", + Toast.LENGTH_SHORT + ).show() + } + } + } + } + + is NetResult.Error<*> -> { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${result.exception.message}", + Toast.LENGTH_SHORT + ) + .show() + } + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + } + + is NetResult.Failure<*> -> { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${result.code}:${result.msg}", + Toast.LENGTH_SHORT + ) + .show() + } + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + } + + else -> {} + } + + } + + } + + /** + * 显示marker + * @param trackCollection 轨迹点 + * @param type 1 提示最后一个轨迹点 非1提示第一个轨迹点 + */ + fun showMarker(context: Context, niLocation: NiLocation) { + if (mapController.markerHandle != null) { + mapController.markerHandle.removeMarker(traceTag) + if (niLocation != null) { + mapController.markerHandle.addMarker( + GeoPoint( + niLocation.latitude, + niLocation.longitude + ), traceTag, "", niLocation as java.lang.Object + ) + } + } + } + + /** + * 结束自动播放 + */ + fun cancelTrace() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt index 1e82d3c7..566a92aa 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt @@ -33,6 +33,16 @@ enum class QrCodeStatus { * 信息更新成功 */ QR_CODE_STATUS_SERVER_INFO_SUCCESS, + + /** + * 信息更新轨迹成功 + */ + QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS, + + /** + * 信息更新轨迹失败 + */ + QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE, } @HiltViewModel diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt index 12706f25..876c1ab6 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt @@ -61,6 +61,12 @@ class QrCodeActivity : BaseActivity() { } QrCodeStatus.QR_CODE_STATUS_SERVER_INFO_SUCCESS -> { + } + QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS -> { + + } + QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE -> { + } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 0f3fc0ae..1468539c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -212,6 +212,7 @@ class EvaluationResultViewModel @Inject constructor( if (classType2 != null) { classType = classType2 } + classCode = bean.renderEntity.code.toString() } //如果右侧栏没数据,给个默认值 if (liveDataQsRecordBean.value!!.classType.isEmpty()) { @@ -298,11 +299,12 @@ class EvaluationResultViewModel @Inject constructor( /** * 查询问题类型列表 */ - fun getProblemTypeList(classType: String) { + fun getProblemTypeList(scProblemTypeBean: ScProblemTypeBean) { viewModelScope.launch(Dispatchers.IO) { - getProblemList(classType) + getProblemList(scProblemTypeBean.classType) } - classTypeTemp = classType + classTypeTemp = scProblemTypeBean.classType + classCodeTemp = scProblemTypeBean.elementCode } /** @@ -381,7 +383,7 @@ class EvaluationResultViewModel @Inject constructor( GeoPoint( p.latitude, p.longitude - ), markerTitle + ), markerTitle,"",null ) //获取linkid diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt index d5a1f5d5..261b2106 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt @@ -7,7 +7,7 @@ import com.navinfo.omqs.databinding.TextItemSelectBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder -class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : +class LeftAdapter(private var itemListener: ((Int, ScProblemTypeBean) -> Unit?)? = null) : BaseRecyclerViewAdapter() { private var selectTitle = "" @@ -28,7 +28,7 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : selectTitle = title.classType notifyDataSetChanged() } - itemListener?.invoke(position, title.classType) + itemListener?.invoke(position, title) } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index cdc5c529..774553c2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -380,6 +380,7 @@ { override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { itemListener?.let { - it.onNiLocation((niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) + it.onNiLocation(index,(niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) } return true } @@ -303,7 +295,8 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : fun addMarker( geoPoint: GeoPoint, title: String?, - description: String? = "" + description: String? = "", + uid: java.lang.Object?=null, ) { var marker: MarkerItem? = null for (e in mDefaultMarkerLayer.itemList) { @@ -318,6 +311,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : tempTitle = StringUtil.createUUID() } val marker = MarkerItem( + uid, tempTitle, description, geoPoint @@ -333,6 +327,14 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } + fun getCurrentMark(): MarkerInterface? { + + if(mDefaultMarkerLayer!=null){ + return mDefaultMarkerLayer.itemList[mDefaultMarkerLayer.itemList.size-1] + } + return null + } + /** * 移除marker */ @@ -520,9 +522,13 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 添加质检数据marker */ - public suspend fun addNiLocationMarkerItem(niLocation: NiLocation) { + fun addNiLocationMarkerItem(niLocation: NiLocation) { + var geoMarkerItem = createNILocationBitmap(niLocation) + niLocationItemizedLayer.addItem(geoMarkerItem) + niLocationItemizedLayer.update() + } - var itemizedLayer: ItemizedLayer? = null + private fun createNILocationBitmap(niLocation: NiLocation): MarkerItem{ val direction: Double = niLocation.direction @@ -548,8 +554,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : MarkerSymbol(niLocationBitmap2, MarkerSymbol.HotspotPlace.CENTER, false) geoMarkerItem.marker = symbolGpsTemp } - niLocationItemizedLayer.addItem(geoMarkerItem) - itemizedLayer = niLocationItemizedLayer } 1 -> { @@ -565,14 +569,10 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : MarkerSymbol(niLocationBitmap3, MarkerSymbol.HotspotPlace.CENTER, false) geoMarkerItem.marker = symbolGpsTemp } - niLocationItemizedLayer.addItem(geoMarkerItem) - itemizedLayer = niLocationItemizedLayer } - } - itemizedLayer!!.update() - + return geoMarkerItem } @@ -794,10 +794,22 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : niLocationItemizedLayer.update() } + fun getNILocationItemizedLayerSize():Int{ + return niLocationItemizedLayer.itemList.size + } + + fun getNILocation(index:Int):MarkerInterface?{ + return if(index>-1&&index) fun onNoteList(list: MutableList) - fun onNiLocation(it: NiLocation) + fun onNiLocation(index:Int,it: NiLocation) } From 53275472f44b927b4fd0f74ab866963979733446 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 18 Jul 2023 15:56:21 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt | 1 + .../com/navinfo/collect/library/map/handler/MarkHandler.kt | 3 +-- vtm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 56f211a1..105345e6 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -73,6 +73,7 @@ class MainViewModel @Inject constructor( private val mapController: NIMapController, private val traceDataBase: TraceDataBase, private val realmOperateHelper: RealmOperateHelper, + private val networkService: NetworkService, private val sharedPreferences: SharedPreferences ) : ViewModel() { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 79888e5f..c114af4a 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -4,7 +4,6 @@ import android.content.Context import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Color -import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import com.navinfo.collect.library.R @@ -186,7 +185,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer.setOnItemGestureListener(object : OnItemGestureListener { override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { itemListener?.let { - it.onNiLocation((niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) + it.onNiLocation(index,(niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) } return true } diff --git a/vtm b/vtm index 1ee201a4..dd13e533 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a +Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323 From 0378378dec89f04c166f5c88e01f9d96fa068455 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 18 Jul 2023 17:08:07 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9A=E4=BD=8D?= =?UTF-8?q?=E6=97=A0=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainViewModel.kt | 31 ++++++------------- .../map/handler/LocationLayerHandler.kt | 12 ++----- .../library/map/handler/MarkHandler.kt | 4 +-- 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 105345e6..8e7dae95 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -270,21 +270,10 @@ class MainViewModel @Inject constructor( */ @RequiresApi(Build.VERSION_CODES.N) private fun initLocation() { + //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { //用于定位点捕捉道路 - mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> - if (!isSelectRoad() && !GeometryTools.isCheckError( - location.longitude, location.latitude - ) - ) { - captureLink( - GeoPoint( - location.latitude, location.longitude - ) - ) - } - } mapController.locationLayerHandler.niLocationFlow.collect { location -> //过滤掉无效点 @@ -335,23 +324,23 @@ class MainViewModel @Inject constructor( } } } + } - //用于定位点捕捉道路 viewModelScope.launch(Dispatchers.Default) { + //用于定位点捕捉道路 mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> if (!isSelectRoad() && !GeometryTools.isCheckError( - location.longitude, - location.latitude + location.longitude, location.latitude ) - ) captureLink( - GeoPoint( - location.latitude, - location.longitude + ) { + captureLink( + GeoPoint( + location.latitude, location.longitude + ) ) - ) + } } } - //显示轨迹图层 mapController.layerManagerHandler.showNiLocationLayer() diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt index 0743a60d..749b2d58 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt @@ -30,7 +30,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : // // } - val niLocationFlow = MutableSharedFlow(3) + val niLocationFlow = MutableSharedFlow(5) init { ///添加定位图层到地图,[NIMapView.LAYER_GROUPS.NAVIGATION] 是最上层layer组 @@ -67,18 +67,12 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : val errorCode = it.locType mCurrentLocation = it mLocationLayer.setPosition(it.latitude, it.longitude, it.radius) -// Log.e( -// "qj", -// "location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}" -// ) + Log.e("qj", "location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}") -// if (niLocationListener != null) { getCurrentNiLocation()?.let { it1 -> - mContext.lifecycleScope.launch(Dispatchers.Default) { + mContext.lifecycleScope.launch { niLocationFlow.emit(it1) } - -// }// niLocationListener.call(it1) } } //第一次定位成功显示当前位置 if (this.bFirst) { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index c114af4a..0c4bb225 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -504,7 +504,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : 0 -> { //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 - if (direction != 0.0) { + if (direction > 0.0) { val symbolGpsTemp = MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER, false) geoMarkerItem.marker = symbolGpsTemp @@ -519,7 +519,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : 1 -> { //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 - if (direction != 0.0) { + if (direction > 0.0) { val symbolLidarTemp = MarkerSymbol(niLocationBitmap1, MarkerSymbol.HotspotPlace.CENTER, false) geoMarkerItem.marker = symbolLidarTemp From 063927653a4d842709b8191b6a0410cff191ffe4 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 18 Jul 2023 18:00:31 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=A4=E5=86=85?= =?UTF-8?q?=E6=95=B4=E7=90=86=E5=B7=A5=E5=85=B7=E5=8F=8D=E5=90=91=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainViewModel.kt | 55 +- .../omqs/ui/activity/map/SocketServer.kt | 583 ++++++++++++++++++ .../library/data/dao/impl/INiLocationDao.java | 3 + 3 files changed, 637 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 8e7dae95..d00460e5 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -26,7 +26,6 @@ import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.* import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener -import com.navinfo.collect.library.map.handler.OnTaskLinkItemClickListener import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant @@ -75,7 +74,7 @@ class MainViewModel @Inject constructor( private val realmOperateHelper: RealmOperateHelper, private val networkService: NetworkService, private val sharedPreferences: SharedPreferences -) : ViewModel() { +) : ViewModel(),SocketServer.OnConnectSinsListener{ private var mCameraDialog: CommonDialog? = null @@ -133,6 +132,9 @@ class MainViewModel @Inject constructor( //状态 val qrCodeStatus: MutableLiveData = MutableLiveData() + //状态 + val indoorToolsStatus: MutableLiveData = MutableLiveData() + /** * 是不是线选择模式 */ @@ -157,7 +159,9 @@ class MainViewModel @Inject constructor( private var lastNiLocaion: NiLocation? = null - var currentIndexNiLocation: Int = 0; + var currentIndexNiLocation: Int = 0 + + private var socketServer:SocketServer? = null init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> @@ -203,6 +207,8 @@ class MainViewModel @Inject constructor( initNoteData() initNILocationData() } + + socketServer = SocketServer(mapController,traceDataBase,sharedPreferences) } /** @@ -343,7 +349,6 @@ class MainViewModel @Inject constructor( } //显示轨迹图层 mapController.layerManagerHandler.showNiLocationLayer() - } /** @@ -724,6 +729,17 @@ class MainViewModel @Inject constructor( Toast.LENGTH_LONG ).show() qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS) + + //启动双向控制服务 + + //启动双向控制服务 + if (socketServer != null && socketServer!!.isServerClose) { + socketServer!!.connect( + Constant.INDOOR_IP, + this@MainViewModel + ) + } + } } else { withContext(Dispatchers.Main) { @@ -804,4 +820,35 @@ class MainViewModel @Inject constructor( fun cancelTrace() { } + + override fun onConnect(success: Boolean) { + if (!success && socketServer != null) { + BaseToast.makeText( + mapController.mMapView.context, + "轨迹反向控制服务失败,请确认连接是否正常!", + Toast.LENGTH_SHORT + ).show() + } + } + + override fun onIndexing() { + //切换为暂停状态 + indoorToolsStatus.postValue(IndoorToolsStatus.PAUSE) + } + + override fun onStop() { + TODO("Not yet implemented") + } + + override fun onPlay() { + TODO("Not yet implemented") + } + + override fun onParseEnd() { + TODO("Not yet implemented") + } + + override fun onReceiveLocation(mNiLocation: NiLocation?) { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt new file mode 100644 index 00000000..1f6cbb10 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt @@ -0,0 +1,583 @@ +package com.navinfo.omqs.ui.activity.map + +import android.app.Service +import android.content.Intent +import android.content.SharedPreferences +import android.os.Binder +import android.os.Handler +import android.os.IBinder +import android.os.Message +import android.text.TextUtils +import android.util.Log +import com.navinfo.collect.library.data.dao.impl.TraceDataBase +import com.navinfo.collect.library.data.entity.NiLocation +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.Constant +import com.navinfo.omqs.util.DateTimeUtil +import org.json.JSONObject +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream +import java.io.Serializable +import java.net.Socket +import java.util.Collections +import kotlin.math.abs + + +enum class IndoorToolsStatus { + PAUSE, + PLAY, + NEXT, + REWIND +} + +/** + * @author qj + * @version V1.0 + * @Date 2018/4/18. + * @Description: 轨迹反向控制服务 + */ +class SocketServer( + private val mapController: NIMapController, + private val traceDataBase: TraceDataBase, + private val sharedPreferences: SharedPreferences +) : Service() { + //类标识 + private val TAG = "SocketServer" + + //线程池 + private val threadConnect = ThreadLocal() + + //读的线程 + private var tRecv: RecvThread? = null + + //解析线程 + private var tParse: ParseThread? = null + + //输出流 + private var outStr: OutputStream? = null + + //输入流 + private var inStr: InputStream? = null + + //状态 + var connectstatus = false + + //socket + private var client: Socket? = null + + //接收缓存 + private val sData = ByteArray(512) + + //反馈接口 + private var mListener: OnConnectSinsListener? = null + + //服务 + private val mBinder: MyBinder = MyBinder() + + //接收集合 + private val mTaskList = Collections.synchronizedList(ArrayList()) + + //连接线程 + private var connectThread: Thread? = null + + //缓存ip + private var lastIp = "" + private val mHandler: Handler = object : Handler() { + override fun handleMessage(msg: Message) { + when (msg.what) { + 0x11 -> if (mListener != null) { + if (msg.obj != null && msg.obj is NiLocation) { + mListener!!.onReceiveLocation(msg.obj as NiLocation) + } else { + mListener!!.onReceiveLocation(null) + } + } + + 0x22 -> //索引定位中 + if (mListener != null) { + mListener!!.onIndexing() + } + + 0x33 -> if (mListener != null) { + mListener!!.onConnect(true) + } + + 0x44 -> if (mListener != null) { + mListener!!.onConnect(false) + } + + 0x55 -> if (mListener != null) { + mListener!!.onPlay() + } + + 0x66 -> if (mListener != null) { + mListener!!.onStop() + } + + 0x99 -> if (mListener != null) { + mListener!!.onParseEnd() + } + + 0x999 -> if (mListener != null) { + mListener!!.onConnect(false) + disconnect() + } + } + } + } + + override fun onCreate() { + super.onCreate() + } + + override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { + return super.onStartCommand(intent, flags, startId) + } + + override fun onDestroy() { + super.onDestroy() + } + + override fun onBind(intent: Intent): IBinder? { + return mBinder + } + + inner class MyBinder : Binder() { + // 返回Activity所关联的Service对象,这样在Activity里,就可调用Service里的一些公用方法 和公用属性 + val service: SocketServer + get() =// 返回Activity所关联的Service对象,这样在Activity里,就可调用Service里的一些公用方法 和公用属性 + this@SocketServer + } + + /** + * 启动sock连接 + * + * @param ip + * @param listener 结果回调 + */ + fun connect(ip: String, listener: OnConnectSinsListener?) { + if (connectThread != null && connectThread!!.isAlive && TextUtils.equals(lastIp, ip)) { + return + } + mListener = listener + lastIp = ip + connectThread = object : Thread() { + override fun run() { + try { + client = threadConnect.get() + if (client == null) { + client = Socket(ip, 8010) + client!!.soTimeout = 3000000 + client!!.keepAlive = true + threadConnect.set(client) + } + outStr = client!!.getOutputStream() + inStr = client!!.getInputStream() + if (tRecv != null) { + tRecv!!.cancel() + } + tRecv = RecvThread() + val thread = Thread(tRecv) + thread.start() + + //解析线程 + if (tParse != null) { + tParse!!.cancel() + } + tParse = ParseThread() + val parsethread = Thread(tParse) + parsethread.start() + + //socket启动成功 + val msg = Message() + msg.what = 0x33 + mHandler.sendMessage(msg) + if (!connectstatus) { + connectstatus = true // 更改连接状态 + } + } catch (e: Exception) { + e.printStackTrace() + //启动失败 + val msg = Message() + msg.what = 0x44 + mHandler.sendMessage(msg) + } + } + } + (connectThread as Thread).start() + } + + /** + * sock是否启动 + * + * @return true 启动 false停止 + */ + val isStart: Boolean + get() = if (connectThread != null && connectThread!!.isAlive) { + true + } else false + + /** + * 销毁连接 + */ + fun disconnect() { + try { + + //销毁线程 + if (tRecv != null) { + tRecv!!.cancel() + } + + //销毁线程 + if (tParse != null) { + tParse!!.cancel() + } + } catch (e: Exception) { + } + try { + if (outStr != null) outStr!!.close() + if (inStr != null) inStr!!.close() + if (client != null) client!!.close() + } catch (e: IOException) { + e.printStackTrace() + } + } + + /** + * 解析接收到得线程 + */ + private inner class ParseThread : Runnable { + private var runFlag = true + + //轨迹时间buffer + private val traceTimeBuffer = 1500 + private var timeIndex = 0 + fun cancel() { + runFlag = false + } + + override fun run() { + try { + while (runFlag) { + if (mTaskList.size > 0) { + timeIndex = mTaskList.size - 1 + val result = parseResult(mTaskList[timeIndex]) + var resultNiLocation: NiLocation? = null + if (result != null) { + when (result.type) { + 1 -> { + //先暂停播放 + val msg = Message() + msg.what = 0x22 + mHandler.sendMessage(msg) + val currentTime: Long = DateTimeUtil.getTimePointSSS( + result.data + ) + val currentTimeStr: String = DateTimeUtil.TimePointSSSToTime( + result.data + ) + val startTime = currentTime - traceTimeBuffer + val endTme = currentTime + traceTimeBuffer + + //转换为数据库时间 + val startTimeStr: String = + DateTimeUtil.getDateSimpleTime(startTime) + + //转换为数据库时间 + val endTimeStr: String = + DateTimeUtil.getDateSimpleTime(endTme) + if (!TextUtils.isEmpty(startTimeStr) && !TextUtils.isEmpty( + endTimeStr + ) + ) { + Log.e(TAG, "getTraceData开始") + val list: List? = + getTrackList(startTimeStr, endTimeStr, currentTimeStr) + Log.e(TAG, "getTraceData结束") + if (list != null && list.size > 0) { + var disTime: Long = 0 + + + //只有一个点不进行判断直接返回结果 + if (list.size == 1) { + resultNiLocation = list[0] + } else { + + //遍历集合取最近时间的轨迹点 + b@ for (nilocation in list) { + if (!TextUtils.isEmpty(nilocation.time)) { + + //只获取到秒的常量 + val time: Long = + nilocation.timeStamp.toLong() + + val disTimeTemp = abs(time - currentTime) + + //如果时间相同直接返回该点 + if (disTimeTemp == 0L) { + resultNiLocation = nilocation + break@b + } else { + + //第一次不对比,取当前值 + if (disTime == 0L) { + disTime = disTimeTemp + resultNiLocation = + nilocation + } else { + + //前一个差值大于当前差值则取当前相对小的值 + if (disTime - disTimeTemp > 0) { + disTime = disTimeTemp + resultNiLocation = + nilocation + } + } + } + } + } + } + } + } + val msg1 = Message() + msg1.what = 0x11 + msg1.obj = resultNiLocation + mHandler.sendMessage(msg1) + } + + 2 -> { + val msg4 = Message() + msg4.what = 0x55 + mHandler.sendMessage(msg4) + } + + 3 -> { + val msg5 = Message() + msg5.what = 0x66 + mHandler.sendMessage(msg5) + } + } + } + + + //解析时索引与集合索引对比,如果不相同代表有新命令,需要继续解析最后一条,否则清空集合不在解析 + try { + if (timeIndex == mTaskList.size - 1) { + mTaskList.clear() + } + } catch (e: Exception) { + } + val msg2 = Message() + msg2.what = 0x99 + mHandler.sendMessage(msg2) + } + } + } catch (e: Exception) { + e.printStackTrace() + val msg = Message() + msg.what = 0x99 + mHandler.sendMessage(msg) + } + } + } + + /** + * 获取轨迹数据 + * + * @param startTimeStr 起始时间 + * @param endTimeStr 结束时间 + * @param currentTimeStr 当前点时间,如果存在便直接获取一个点 + * @return list 数据集合 + */ + private fun getTrackList( + startTimeStr: String, + endTimeStr: String, + currentTimeStr: String + ): List? { + if (!TextUtils.isEmpty(startTimeStr) && !TextUtils.isEmpty(endTimeStr)) { + var startTime: Long = 0 + var endTime: Long = 0 + try { + startTime = startTimeStr.toLong() + endTime = endTimeStr.toLong() + } catch (e: java.lang.Exception) { + } + if (startTime != 0L && endTime != 0L) { + + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + + val list: MutableList = traceDataBase.niLocationDao.taskIdAndTimeTofindList(id.toString(),startTime,endTime) + + if (list.size > 0) return list + } + } + return null + } + + /** + * 接收管道数据 + */ + private inner class RecvThread : Runnable { + private var runFlag = true + fun cancel() { + runFlag = false + } + + override fun run() { + var rlRead: Int + try { + while (runFlag) { + var line: String = "" + if (!isServerClose) { + rlRead = inStr!!.read(sData) //对方断开返回-1 + if (rlRead > 0) { + Log.e(TAG, sData.toString() + "") + line = String(sData, 0, rlRead) + mTaskList.add(line) + } else { + connectFaild("连接断开") + } + } else { + connectFaild("连接断开") + } + } + } catch (e: IOException) { + connectFaild(e.toString()) + e.printStackTrace() + } + } + } + + /** + * 连接失败 + * @param e 原因 + */ + private fun connectFaild(e: String) { + val msg2 = Message() + msg2.what = 0x999 + mHandler.sendMessage(msg2) + } + + /** + * 判断是否断开连接,断开返回true,没有返回false + * @return + */ + val isServerClose: Boolean + get() { + return try { + client!!.sendUrgentData(0) //发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信 + false + } catch (se: Exception) { + true + } + } + + /** + * 停止接收管道数据 + */ + fun stop() { + Log.e(TAG, "stop!") + connectstatus = false + if (tRecv != null) { + tRecv!!.cancel() + } + if (tParse != null) { + tParse!!.cancel() + } + } + + /** + * 开始接收管道数据 + */ + fun start() { + Log.e(TAG, "start!") + if (tRecv != null) { + tRecv!!.cancel() + } + tRecv = RecvThread() + val thread = Thread(tRecv) + thread.start() + + //解析线程 + if (tParse != null) { + tParse!!.cancel() + } + tParse = ParseThread() + val parsethread = Thread(tParse) + parsethread.start() + } + + fun setTraceMap() { + + } + + /** + * 轨迹反向控制回调接口 + */ + interface OnConnectSinsListener { + /** + * 连接状态 + * + * @param success true 连接成功 false 连接失败 + */ + fun onConnect(success: Boolean) + + /** + * 索引中 + */ + fun onIndexing() + + /** + * 暂停 + */ + fun onStop() + + /** + * 播放 + */ + fun onPlay() + + /** + * 结束完成 + */ + fun onParseEnd() + + /** + * 轨迹点 + * + * @param mNiLocation + */ + fun onReceiveLocation(mNiLocation: NiLocation?) + } + + /** + * 解析返回值 + * + * @return 时间信息 + */ + private fun parseResult(data: String): Result? { + var data = data + if (!TextUtils.isEmpty(data)) { + try { + data = data.replace("\n".toRegex(), "") + val json = JSONObject(data) + val type = json.optInt("type") + val mResult: Result = Result() + mResult.type = type + if (type == 1) { + mResult.data = json.optString("data", "") + } + return mResult + } catch (e: Exception) { + } + } + return null + } + + //结果类对象 + internal inner class Result : Serializable { + var type = 0 + var data: String? = null + } +} \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java b/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java index 9d362617..c4fa6f57 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java @@ -47,6 +47,9 @@ public interface INiLocationDao { @Query("SELECT * FROM niLocation") List findAll(); + @Query("SELECT * FROM niLocation where time>=:startTime and time<=:endTime and taskId=:taskId") + List taskIdAndTimeTofindList(String taskId,long startTime,long endTime); + @Query("SELECT * FROM niLocation where taskId =:taskId") List findToTaskIdAll(String taskId); } From 45de9982fcf3e4132680cf3639b52faa772c58b7 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Wed, 19 Jul 2023 17:01:02 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=A4=E5=86=85?= =?UTF-8?q?=E6=95=B4=E7=90=86=E5=B7=A5=E5=85=B7=E5=8F=8D=E5=90=91=E6=8E=A7?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 151 +++++++++++++----- .../omqs/ui/activity/map/MainViewModel.kt | 98 +++++++++--- .../omqs/ui/activity/map/SocketServer.kt | 49 ++++-- .../omqs/ui/activity/scan/QRCodeViewModel.kt | 9 -- .../omqs/ui/activity/scan/QrCodeActivity.kt | 6 - .../personalcenter/PersonalCenterFragment.kt | 4 +- .../src/main/assets/editormarker.xml | 45 +++--- .../library/map/handler/MarkHandler.kt | 21 +++ 8 files changed, 272 insertions(+), 111 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index ebb13c47..7869f445 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -185,6 +185,7 @@ class MainActivity : BaseActivity() { MotionEvent.ACTION_DOWN -> { voiceOnTouchStart()//Do Something } + MotionEvent.ACTION_UP -> { voiceOnTouchStop()//Do Something } @@ -235,13 +236,18 @@ class MainActivity : BaseActivity() { ) } - //捕捉列表变化回调 + //捕捉轨迹点 viewModel.liveDataNILocationList.observe(this) { - if(viewModel.isSelectTrace()){ + if (viewModel.isSelectTrace()) { //Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() - viewModel.showMarker(this,it) - val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${it.time}:000") - viewModel.sendServerCommand(this,traceVideoBean) + viewModel.showMarker(this, it) + viewModel.setCurrentIndexNiLocation(it) + val traceVideoBean = TraceVideoBean( + command = "videotime?", + userid = Constant.USER_ID, + time = "${it.time}:000" + ) + viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.SELECT_POINT) } } @@ -321,6 +327,49 @@ class MainActivity : BaseActivity() { } } + viewModel.liveIndoorToolsResp.observe(this){ + when(it){ + IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS->{ + + if(viewModel.indoorToolsCommand==IndoorToolsCommand.SELECT_POINT){ + selectPointFinish(true) + } + + } + IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE->{ + if(viewModel.indoorToolsCommand==IndoorToolsCommand.SELECT_POINT){ + selectPointFinish(false) + } + } + } + } + + //室内整理工具反向控制 + viewModel.liveIndoorToolsCommand.observe(this) { + when (it) { + IndoorToolsCommand.PLAY -> { + setPlayStatus() + } + IndoorToolsCommand.INDEXING -> { + pausePlayTrace() + } + IndoorToolsCommand.SELECT_POINT -> { + + } + + IndoorToolsCommand.NEXT -> { + } + + IndoorToolsCommand.REWIND -> { + } + + IndoorToolsCommand.STOP -> { + //切换为暂停状态 + pausePlayTrace() + } + } + } + lifecycleScope.launch { // 初始化地图图层控制接收器 FlowEventBus.subscribe>( @@ -551,13 +600,10 @@ class MainActivity : BaseActivity() { viewModel.setSelectTrace(!viewModel.isSelectTrace()) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() - if(viewModel.isSelectTrace()){ - Toast.makeText(this,"请选择轨迹点!",Toast.LENGTH_LONG).show() + if (viewModel.isSelectTrace()) { + Toast.makeText(this, "请选择轨迹点!", Toast.LENGTH_LONG).show() //调用撤销自动播放 - binding.mainActivitySnapshotFinish.isEnabled = false - binding.mainActivitySnapshotRewind.isEnabled = false - binding.mainActivitySnapshotPause.isEnabled = false - binding.mainActivitySnapshotNext.isEnabled = false + setViewEnable(false) viewModel.cancelTrace() } } @@ -592,13 +638,17 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun rewindTraceOnclick() { pausePlayTrace() - val item = mapController.markerHandle.getNILocation(viewModel.currentIndexNiLocation-1) - if(item!=null){ - viewModel.currentIndexNiLocation = viewModel.currentIndexNiLocation-1 - viewModel.showMarker(this,(item as MarkerItem).uid as NiLocation) - val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000") - viewModel.sendServerCommand(this,traceVideoBean) - }else{ + val item = mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() - 1) + if (item != null) { + viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex() - 1) + viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) + val traceVideoBean = TraceVideoBean( + command = "videotime?", + userid = Constant.USER_ID, + time = "${(item.uid as NiLocation).time}:000" + ) + viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.REWIND) + } else { dealNoData() } } @@ -612,24 +662,24 @@ class MainActivity : BaseActivity() { binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() - if(viewModel.isSelectPauseTrace()){ + if (viewModel.isSelectPauseTrace()) { playVideo() - }else{ + } else { pauseVideo() viewModel.cancelTrace() } } @RequiresApi(Build.VERSION_CODES.N) - fun playVideo(){ - if (mapController.markerHandle.getCurrentMark()==null) { + fun playVideo() { + if (mapController.markerHandle.getCurrentMark() == null) { BaseToast.makeText(this, "请先选择轨迹点!", BaseToast.LENGTH_SHORT).show() return } viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() val traceVideoBean = TraceVideoBean(command = "playVideo?", userid = Constant.USER_ID) - viewModel.sendServerCommand(this,traceVideoBean) + viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.PLAY) } /** @@ -644,9 +694,9 @@ class MainActivity : BaseActivity() { } @RequiresApi(Build.VERSION_CODES.N) - fun pauseVideo(){ + fun pauseVideo() { val traceVideoBean = TraceVideoBean(command = "pauseVideo?", userid = Constant.USER_ID) - viewModel.sendServerCommand(this,traceVideoBean) + viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.STOP) } /** @@ -655,13 +705,17 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun nextTraceOnclick() { pausePlayTrace() - val item = mapController.markerHandle.getNILocation(viewModel.currentIndexNiLocation+1) - if(item!=null){ - viewModel.currentIndexNiLocation = viewModel.currentIndexNiLocation+1 - viewModel.showMarker(this,(item as MarkerItem).uid as NiLocation) - val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000") - viewModel.sendServerCommand(this,traceVideoBean) - }else{ + val item = mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() + 1) + if (item != null) { + viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex()+1) + viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) + val traceVideoBean = TraceVideoBean( + command = "videotime?", + userid = Constant.USER_ID, + time = "${(item.uid as NiLocation).time}:000" + ) + viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.NEXT) + } else { dealNoData() } } @@ -688,6 +742,26 @@ class MainActivity : BaseActivity() { viewModel.cancelTrace() } + /** + * 选点结束 + * @param value true 选点成功 false 选点失败 + */ + @RequiresApi(Build.VERSION_CODES.N) + private fun selectPointFinish(value: Boolean) { + if (value) { + setViewEnable(true) + viewModel.setSelectPauseTrace(false) + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + } + } + + private fun setViewEnable(value: Boolean){ + binding.mainActivitySnapshotRewind.isEnabled = value + binding.mainActivitySnapshotNext.isEnabled = value + binding.mainActivitySnapshotPause.isEnabled = value + binding.mainActivitySnapshotFinish.isEnabled = value + } + /** * 打开或关闭底部导航栏 @@ -708,7 +782,12 @@ class MainActivity : BaseActivity() { mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65) } mapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude)) + .animateTo( + GeoPoint( + mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude, + mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude + ) + ) } @RequiresApi(Build.VERSION_CODES.N) @@ -769,14 +848,14 @@ class MainActivity : BaseActivity() { */ fun showIndoorDataLayout() { binding.mainActivityMenuIndoorGroup.visibility = View.VISIBLE - if(Constant.INDOOR_IP.isNotEmpty()){ + if (Constant.INDOOR_IP.isNotEmpty()) { setIndoorGroupEnable(true) - }else{ + } else { setIndoorGroupEnable(false) } } - private fun setIndoorGroupEnable(enable: Boolean){ + private fun setIndoorGroupEnable(enable: Boolean) { binding.mainActivitySnapshotFinish.isEnabled = enable binding.mainActivityTraceSnapshotPoints.isEnabled = enable binding.mainActivitySnapshotMediaFlag.isEnabled = enable diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index d00460e5..f180c729 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -43,6 +43,7 @@ import com.navinfo.omqs.ui.manager.TakePhotoManager import com.navinfo.omqs.ui.other.BaseToast import com.navinfo.omqs.ui.widget.SignUtil import com.navinfo.omqs.util.DateTimeUtil +import com.navinfo.omqs.util.ShareUtil import com.navinfo.omqs.util.SoundMeter import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.lifecycle.HiltViewModel @@ -74,7 +75,7 @@ class MainViewModel @Inject constructor( private val realmOperateHelper: RealmOperateHelper, private val networkService: NetworkService, private val sharedPreferences: SharedPreferences -) : ViewModel(),SocketServer.OnConnectSinsListener{ +) : ViewModel(), SocketServer.OnConnectSinsListener { private var mCameraDialog: CommonDialog? = null @@ -130,10 +131,10 @@ class MainViewModel @Inject constructor( val liveDataCenterPoint = MutableLiveData() //状态 - val qrCodeStatus: MutableLiveData = MutableLiveData() + val liveIndoorToolsResp: MutableLiveData = MutableLiveData() //状态 - val indoorToolsStatus: MutableLiveData = MutableLiveData() + val liveIndoorToolsCommand: MutableLiveData = MutableLiveData() /** * 是不是线选择模式 @@ -159,9 +160,11 @@ class MainViewModel @Inject constructor( private var lastNiLocaion: NiLocation? = null - var currentIndexNiLocation: Int = 0 + private var currentIndexNiLocation: Int = 0 - private var socketServer:SocketServer? = null + private var socketServer: SocketServer? = null + + var indoorToolsCommand: IndoorToolsCommand? = null init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> @@ -208,7 +211,7 @@ class MainViewModel @Inject constructor( initNILocationData() } - socketServer = SocketServer(mapController,traceDataBase,sharedPreferences) + socketServer = SocketServer(mapController, traceDataBase, sharedPreferences) } /** @@ -277,6 +280,7 @@ class MainViewModel @Inject constructor( @RequiresApi(Build.VERSION_CODES.N) private fun initLocation() { + val shareUtil = ShareUtil(mapController.mMapView.context, 1) //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { //用于定位点捕捉道路 @@ -309,20 +313,20 @@ class MainViewModel @Inject constructor( } val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) location.taskId = id.toString() + if (shareUtil.connectstate) { + location.media = 1 + } + var disance = 0.0 //增加间距判断 if (lastNiLocaion != null) { - val disance = GeometryTools.getDistance( + disance = GeometryTools.getDistance( location.latitude, location.longitude, lastNiLocaion!!.latitude, lastNiLocaion!!.longitude ) - //相距差距大于2.5米以上进行存储 - if (disance > 2.5 && disance < 60) { - traceDataBase.niLocationDao.insert(location) - mapController.markerHandle.addNiLocationMarkerItem(location) - mapController.mMapView.vtmMap.updateMap(true) - lastNiLocaion = location - } - } else { + + } + //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米 + if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 2.5 && disance < 60))) { traceDataBase.niLocationDao.insert(location) mapController.markerHandle.addNiLocationMarkerItem(location) mapController.mMapView.vtmMap.updateMap(true) @@ -699,13 +703,19 @@ class MainViewModel @Inject constructor( liveDataSignMoreInfo.value = data } - fun sendServerCommand(context: Context, traceVideoBean: TraceVideoBean) { + fun sendServerCommand( + context: Context, + traceVideoBean: TraceVideoBean, + indoorToolsCommand: IndoorToolsCommand + ) { if (TextUtils.isEmpty(Constant.INDOOR_IP)) { Toast.makeText(context, "获取ip失败!", Toast.LENGTH_LONG).show() return } + this.indoorToolsCommand = indoorToolsCommand + viewModelScope.launch(Dispatchers.Default) { val url = "http://${Constant.INDOOR_IP}:8080/sensor/service/${traceVideoBean.command}?" @@ -728,7 +738,8 @@ class MainViewModel @Inject constructor( "命令成功。", Toast.LENGTH_LONG ).show() - qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS) + + liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS) //启动双向控制服务 @@ -750,6 +761,7 @@ class MainViewModel @Inject constructor( ) .show() } + liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE) } } catch (e: IOException) { @@ -773,7 +785,7 @@ class MainViewModel @Inject constructor( ) .show() } - qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE) } is NetResult.Failure<*> -> { @@ -785,7 +797,7 @@ class MainViewModel @Inject constructor( ) .show() } - qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE) } else -> {} @@ -814,6 +826,34 @@ class MainViewModel @Inject constructor( } } + /** + * 显示索引位置 + * @param niLocation 轨迹点 + */ + fun setCurrentIndexNiLocation(niLocation: NiLocation) { + viewModelScope.launch ( Dispatchers.IO ){ + Log.e("qj","开始$currentIndexNiLocation") + currentIndexNiLocation = mapController.markerHandle.getNILocationIndex(niLocation)!! + Log.e("qj","结束$currentIndexNiLocation") + } + } + + /** + * 设置索引位置 + * @param index 索引 + */ + fun setCurrentIndexLoction(index: Int) { + currentIndexNiLocation = index + } + + /** + * + * @return index 索引 + */ + fun getCurrentNiLocationIndex(): Int { + return currentIndexNiLocation + } + /** * 结束自动播放 */ @@ -833,22 +873,32 @@ class MainViewModel @Inject constructor( override fun onIndexing() { //切换为暂停状态 - indoorToolsStatus.postValue(IndoorToolsStatus.PAUSE) + liveIndoorToolsCommand.postValue(IndoorToolsCommand.INDEXING) } override fun onStop() { - TODO("Not yet implemented") + liveIndoorToolsCommand.postValue(IndoorToolsCommand.STOP) } override fun onPlay() { - TODO("Not yet implemented") + liveIndoorToolsCommand.postValue(IndoorToolsCommand.PLAY) } override fun onParseEnd() { - TODO("Not yet implemented") + } override fun onReceiveLocation(mNiLocation: NiLocation?) { - TODO("Not yet implemented") + if (mNiLocation != null) { + setCurrentIndexNiLocation(mNiLocation) + showMarker(mapController.mMapView.context, mNiLocation) + Log.e("qj","反向控制$currentIndexNiLocation") + } else { + BaseToast.makeText( + mapController.mMapView.context, + "没有找到对应轨迹点!", + Toast.LENGTH_SHORT + ).show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt index 1f6cbb10..b2d0a9dd 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt @@ -24,11 +24,25 @@ import java.util.Collections import kotlin.math.abs -enum class IndoorToolsStatus { - PAUSE, +enum class IndoorToolsCommand { PLAY, + SELECT_POINT, + INDEXING, NEXT, - REWIND + REWIND, + STOP +} + +enum class IndoorToolsResp{ + /** + * 信息更新轨迹成功 + */ + QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS, + + /** + * 信息更新轨迹失败 + */ + QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE, } /** @@ -264,6 +278,7 @@ class SocketServer( timeIndex = mTaskList.size - 1 val result = parseResult(mTaskList[timeIndex]) var resultNiLocation: NiLocation? = null + var index: Int = -1 if (result != null) { when (result.type) { 1 -> { @@ -277,6 +292,9 @@ class SocketServer( val currentTimeStr: String = DateTimeUtil.TimePointSSSToTime( result.data ) + + Log.e(TAG, "反向"+result.data) + val startTime = currentTime - traceTimeBuffer val endTme = currentTime + traceTimeBuffer @@ -291,21 +309,23 @@ class SocketServer( endTimeStr ) ) { + Log.e(TAG, "getTraceData开始") - val list: List? = - getTrackList(startTimeStr, endTimeStr, currentTimeStr) + + val list: List? = getTrackList(startTimeStr, endTimeStr, currentTimeStr) + Log.e(TAG, "getTraceData结束") + if (list != null && list.size > 0) { + var disTime: Long = 0 - - //只有一个点不进行判断直接返回结果 if (list.size == 1) { resultNiLocation = list[0] } else { - //遍历集合取最近时间的轨迹点 b@ for (nilocation in list) { + if (!TextUtils.isEmpty(nilocation.time)) { //只获取到秒的常量 @@ -323,15 +343,13 @@ class SocketServer( //第一次不对比,取当前值 if (disTime == 0L) { disTime = disTimeTemp - resultNiLocation = - nilocation + resultNiLocation = nilocation } else { //前一个差值大于当前差值则取当前相对小的值 if (disTime - disTimeTemp > 0) { disTime = disTimeTemp - resultNiLocation = - nilocation + resultNiLocation = nilocation } } } @@ -343,6 +361,9 @@ class SocketServer( val msg1 = Message() msg1.what = 0x11 msg1.obj = resultNiLocation + if (resultNiLocation != null) { + Log.e(TAG, "反向app"+resultNiLocation.time) + } mHandler.sendMessage(msg1) } @@ -373,6 +394,7 @@ class SocketServer( mHandler.sendMessage(msg2) } } + Thread.sleep(10) } catch (e: Exception) { e.printStackTrace() val msg = Message() @@ -407,7 +429,7 @@ class SocketServer( val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - val list: MutableList = traceDataBase.niLocationDao.taskIdAndTimeTofindList(id.toString(),startTime,endTime) + val list: MutableList = traceDataBase.niLocationDao.findToTaskIdAll(id.toString()) if (list.size > 0) return list } @@ -442,6 +464,7 @@ class SocketServer( connectFaild("连接断开") } } + Thread.sleep(10) } catch (e: IOException) { connectFaild(e.toString()) e.printStackTrace() diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt index 566a92aa..f6122749 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt @@ -34,15 +34,6 @@ enum class QrCodeStatus { */ QR_CODE_STATUS_SERVER_INFO_SUCCESS, - /** - * 信息更新轨迹成功 - */ - QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS, - - /** - * 信息更新轨迹失败 - */ - QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE, } @HiltViewModel diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt index 876c1ab6..12706f25 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt @@ -61,12 +61,6 @@ class QrCodeActivity : BaseActivity() { } QrCodeStatus.QR_CODE_STATUS_SERVER_INFO_SUCCESS -> { - } - QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS -> { - - } - QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE -> { - } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index 81eef41b..bf6627a5 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -116,10 +116,10 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? } R.id.personal_center_menu_test -> { viewModel.readRealmData() - //108.91056000267433 34.29635901721207 + //108.90107116103331 34.29568928574205 // 定位到指定位置 niMapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( 34.29635901721207, 108.91056000267433)) + .animateTo(GeoPoint( 34.29568928574205, 108.90107116103331)) } // R.id.personal_center_menu_task_list -> { // findNavController().navigate(R.id.TaskManagerFragment) diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 0b7a0264..0b5e0573 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1707,48 +1707,52 @@ 0 - + + + + + + <!–不应用–> - + <!–无标线无可区分边界–> - + <!–标线–> - + <!–路牙–> - + <!–护栏–> - + <!–墙–> - + <!–道路面铺设边缘–> - + <!–虚拟三角岛–> - + <!–杆状障碍物–> - + --> @@ -1758,9 +1762,9 @@ - + - + @@ -1772,12 +1776,12 @@ - + - + + <!–导流区边线–> - - - - - + --> + + + diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 0c4bb225..5ce2872d 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -766,6 +766,27 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } + fun getNILocationIndex(niLocation: NiLocation):Int?{ + + var list = niLocationItemizedLayer.itemList + + if(niLocation!=null&&list.isNotEmpty()){ + + var index = -1 + + list.forEach{ + + index += 1 + + if(((it as MarkerItem).uid as NiLocation).id.equals(niLocation.id)){ + return index + } + } + } + + return -1 + } + } interface OnQsRecordItemClickListener { From 58f5329a75548fbf28742e7ee34e804b3dfa301a Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Wed, 19 Jul 2023 17:40:44 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=B8=E6=9C=BA?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E9=87=8D=E6=96=B0=E8=BF=9E=E6=8E=A5=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 52 +++++++++++-------- .../omqs/ui/activity/map/MainViewModel.kt | 51 +++++++++++++----- .../navinfo/omqs/ui/dialog/CommonDialog.java | 3 +- 3 files changed, 70 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index 7869f445..c6e81e85 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -247,7 +247,7 @@ class MainActivity : BaseActivity() { userid = Constant.USER_ID, time = "${it.time}:000" ) - viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.SELECT_POINT) + viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.SELECT_POINT) } } @@ -327,17 +327,18 @@ class MainActivity : BaseActivity() { } } - viewModel.liveIndoorToolsResp.observe(this){ - when(it){ - IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS->{ + viewModel.liveIndoorToolsResp.observe(this) { + when (it) { + IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS -> { - if(viewModel.indoorToolsCommand==IndoorToolsCommand.SELECT_POINT){ + if (viewModel.indoorToolsCommand == IndoorToolsCommand.SELECT_POINT) { selectPointFinish(true) } } - IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE->{ - if(viewModel.indoorToolsCommand==IndoorToolsCommand.SELECT_POINT){ + + IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE -> { + if (viewModel.indoorToolsCommand == IndoorToolsCommand.SELECT_POINT) { selectPointFinish(false) } } @@ -350,9 +351,11 @@ class MainActivity : BaseActivity() { IndoorToolsCommand.PLAY -> { setPlayStatus() } + IndoorToolsCommand.INDEXING -> { pausePlayTrace() } + IndoorToolsCommand.SELECT_POINT -> { } @@ -389,8 +392,13 @@ class MainActivity : BaseActivity() { } } - supportFragmentManager.beginTransaction() - .add(R.id.console_fragment_layout, ConsoleFragment()).commit() + //自动连接相机 + if (viewModel.isAutoCamera()) { + viewModel.autoCamera() + } else { + supportFragmentManager.beginTransaction() + .add(R.id.console_fragment_layout, ConsoleFragment()).commit() + } } //根据输入的经纬度跳转坐标 @@ -638,7 +646,8 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun rewindTraceOnclick() { pausePlayTrace() - val item = mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() - 1) + val item = + mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() - 1) if (item != null) { viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex() - 1) viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) @@ -647,7 +656,7 @@ class MainActivity : BaseActivity() { userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000" ) - viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.REWIND) + viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.REWIND) } else { dealNoData() } @@ -679,7 +688,7 @@ class MainActivity : BaseActivity() { viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() val traceVideoBean = TraceVideoBean(command = "playVideo?", userid = Constant.USER_ID) - viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.PLAY) + viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.PLAY) } /** @@ -696,7 +705,7 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun pauseVideo() { val traceVideoBean = TraceVideoBean(command = "pauseVideo?", userid = Constant.USER_ID) - viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.STOP) + viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.STOP) } /** @@ -705,16 +714,17 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun nextTraceOnclick() { pausePlayTrace() - val item = mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() + 1) + val item = + mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() + 1) if (item != null) { - viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex()+1) + viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex() + 1) viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) val traceVideoBean = TraceVideoBean( command = "videotime?", userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000" ) - viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.NEXT) + viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.NEXT) } else { dealNoData() } @@ -755,11 +765,11 @@ class MainActivity : BaseActivity() { } } - private fun setViewEnable(value: Boolean){ - binding.mainActivitySnapshotRewind.isEnabled = value - binding.mainActivitySnapshotNext.isEnabled = value - binding.mainActivitySnapshotPause.isEnabled = value - binding.mainActivitySnapshotFinish.isEnabled = value + private fun setViewEnable(value: Boolean) { + binding.mainActivitySnapshotRewind.isEnabled = value + binding.mainActivitySnapshotNext.isEnabled = value + binding.mainActivitySnapshotPause.isEnabled = value + binding.mainActivitySnapshotFinish.isEnabled = value } diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index f180c729..e7c29ed3 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -24,6 +24,7 @@ import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.* +import com.navinfo.collect.library.garminvirbxe.HostBean import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener import com.navinfo.collect.library.utils.GeometryTools @@ -37,7 +38,6 @@ import com.navinfo.omqs.bean.TraceVideoBean import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetworkService -import com.navinfo.omqs.ui.activity.scan.QrCodeStatus import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.manager.TakePhotoManager import com.navinfo.omqs.ui.other.BaseToast @@ -166,6 +166,8 @@ class MainViewModel @Inject constructor( var indoorToolsCommand: IndoorToolsCommand? = null + private var shareUtil: ShareUtil? = null + init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> when (e) { @@ -190,6 +192,8 @@ class MainViewModel @Inject constructor( } }) + shareUtil = ShareUtil(mapController.mMapView.context, 1) + initLocation() //处理地图点击操作 @@ -280,7 +284,6 @@ class MainViewModel @Inject constructor( @RequiresApi(Build.VERSION_CODES.N) private fun initLocation() { - val shareUtil = ShareUtil(mapController.mMapView.context, 1) //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { //用于定位点捕捉道路 @@ -313,7 +316,7 @@ class MainViewModel @Inject constructor( } val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) location.taskId = id.toString() - if (shareUtil.connectstate) { + if (shareUtil?.connectstate == true) { location.media = 1 } var disance = 0.0 @@ -504,17 +507,8 @@ class MainViewModel @Inject constructor( Log.e("qj", LibVlcUtil.hasCompatibleCPU(context).toString()) - if (mCameraDialog == null) { - mCameraDialog = CommonDialog( - context, - context.resources.getDimension(R.dimen.head_img_width) - .toInt() * 3 + context.resources.getDimension(R.dimen.ten) - .toInt() + context.resources.getDimension(R.dimen.twenty_four).toInt(), - context.resources.getDimension(R.dimen.head_img_width).toInt() + 10, - 1 - ) - mCameraDialog!!.setCancelable(true) - } + initCameraDialog(context) + mCameraDialog!!.openCamear(mCameraDialog!!.getmShareUtil().continusTakePhotoState) mCameraDialog!!.show() mCameraDialog!!.setOnDismissListener(DialogInterface.OnDismissListener { @@ -539,6 +533,20 @@ class MainViewModel @Inject constructor( }) } + private fun initCameraDialog(context:Context){ + if (mCameraDialog == null) { + mCameraDialog = CommonDialog( + context, + context.resources.getDimension(R.dimen.head_img_width) + .toInt() * 3 + context.resources.getDimension(R.dimen.ten) + .toInt() + context.resources.getDimension(R.dimen.twenty_four).toInt(), + context.resources.getDimension(R.dimen.head_img_width).toInt() + 10, + 1 + ) + mCameraDialog!!.setCancelable(true) + } + } + fun startSoundMetter(context: Context, v: View) { //语音识别动画 @@ -901,4 +909,19 @@ class MainViewModel @Inject constructor( ).show() } } + + fun isAutoCamera():Boolean{ + + return shareUtil?.connectstate == true + } + + fun autoCamera(){ + if (shareUtil?.connectstate == true) { + val hostBean1 = HostBean() + hostBean1.ipAddress = shareUtil!!.takeCameraIP + hostBean1.hardwareAddress = shareUtil!!.takeCameraMac + onClickCameraButton(mapController.mMapView.context) + mCameraDialog?.connection(hostBean1) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/dialog/CommonDialog.java b/app/src/main/java/com/navinfo/omqs/ui/dialog/CommonDialog.java index 4cac5dc0..5168b7e0 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/dialog/CommonDialog.java +++ b/app/src/main/java/com/navinfo/omqs/ui/dialog/CommonDialog.java @@ -676,6 +676,7 @@ public class CommonDialog extends Dialog implements SurfaceHolder.Callback, IVid //当前为连接时启动已有的状态 if (connectstate) { + mOneBtConnect.setPressed(true); mOneBtConnect.setBackgroundResource(R.drawable.shape_btn_red_disconnect_bg); @@ -1525,7 +1526,7 @@ public class CommonDialog extends Dialog implements SurfaceHolder.Callback, IVid } //连接 - private void connection(HostBean hostBean) { + public void connection(HostBean hostBean) { if (hostBean != null) { SensorParams params = new SensorParams(); From 392fb91215150a30ff4342076e10d8d7a3b72f6b Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Wed, 19 Jul 2023 17:46:50 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/navinfo/omqs/Constant.kt | 5 +++++ .../navinfo/omqs/ui/activity/map/MainViewModel.kt | 4 ++++ .../personalcenter/PersonalCenterFragment.kt | 7 +++++++ app/src/main/res/menu/personal_center_menu.xml | 12 ++++++++++++ 4 files changed, 28 insertions(+) diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index f67ca0a6..7affaaab 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -59,6 +59,11 @@ class Constant { const val DEBUG = true + /** + * 是否自动定位 + */ + var AUTO_LOCATION = false + var IS_VIDEO_SPEED by kotlin.properties.Delegates.notNull() const val message_status_late = "预约,待发送" diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index e7c29ed3..18e02a77 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -352,6 +352,10 @@ class MainViewModel @Inject constructor( ) ) } + if(Constant.AUTO_LOCATION){ + mapController.mMapView.vtmMap.animator() + .animateTo(GeoPoint( location.longitude, location.latitude)) + } } } //显示轨迹图层 diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index bf6627a5..afedf335 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -17,6 +17,7 @@ import com.github.k1rakishou.fsaf.callback.FSAFActivityCallbacks import com.github.k1rakishou.fsaf.callback.FileChooserCallback import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentPersonalCenterBinding import com.navinfo.omqs.db.ImportOMDBHelper @@ -114,6 +115,12 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? } }) } + R.id.personal_center_menu_open_auto_location -> { + Constant.AUTO_LOCATION = true + } + R.id.personal_center_menu_close_auto_location -> { + Constant.AUTO_LOCATION = false + } R.id.personal_center_menu_test -> { viewModel.readRealmData() //108.90107116103331 34.29568928574205 diff --git a/app/src/main/res/menu/personal_center_menu.xml b/app/src/main/res/menu/personal_center_menu.xml index 50b4e070..e457c118 100644 --- a/app/src/main/res/menu/personal_center_menu.xml +++ b/app/src/main/res/menu/personal_center_menu.xml @@ -56,6 +56,18 @@ + + + + Date: Thu, 20 Jul 2023 10:48:38 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/login/LoginViewModel.kt | 64 +++++++++++++++---- .../omqs/ui/activity/map/MainActivity.kt | 2 +- .../java/com/navinfo/omqs/util/ShareUtil.java | 1 + app/src/main/res/layout/activity_main.xml | 1 + .../src/main/assets/editormarker.xml | 15 ++++- 5 files changed, 65 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt index 095664d1..086a2e19 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt @@ -1,6 +1,7 @@ package com.navinfo.omqs.ui.activity.login import android.content.Context +import android.content.SharedPreferences import android.util.Log import android.view.View import android.widget.Toast @@ -16,11 +17,11 @@ import com.navinfo.omqs.http.DefaultResponse import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetworkService import com.navinfo.omqs.tools.FileManager +import com.navinfo.omqs.util.NetUtils import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import io.realm.RealmConfiguration import kotlinx.coroutines.* -import retrofit2.Response import java.io.File import java.io.IOException import javax.inject.Inject @@ -73,7 +74,9 @@ class LoginViewModel @Inject constructor( //是不是登录成功 val loginStatus: MutableLiveData = MutableLiveData() - var jobLogin: Job? = null; + var jobLogin: Job? = null + + var sharedPreferences: SharedPreferences? = null init { loginUser.value = LoginUserBean(userCode = "haofuyue00213", passWord = "123456") @@ -98,10 +101,26 @@ class LoginViewModel @Inject constructor( if (password.isEmpty()) { Toast.makeText(context, "请输入密码", Toast.LENGTH_SHORT).show() } + sharedPreferences = + context.getSharedPreferences("USER_SHAREDPREFERENCES", Context.MODE_PRIVATE) + val userNameCache = sharedPreferences?.getString("userName", null) + val passwordCache = sharedPreferences?.getString("passWord", null) + val userCodeCache = sharedPreferences?.getString("userCode", null) + //增加缓存记录,不用每次连接网络登录 + if (userNameCache != null && passwordCache != null && userCodeCache != null) { + if (userNameCache == userName && passwordCache == password) { + viewModelScope.launch(Dispatchers.IO) { + createUserFolder(context, userCodeCache) + loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS) + } + return + } + } //不指定IO,会在主线程里运行 jobLogin = viewModelScope.launch(Dispatchers.IO) { loginCheck(context, userName, password) } + } /** @@ -115,25 +134,33 @@ class LoginViewModel @Inject constructor( loginStatus.postValue(LoginStatus.LOGIN_STATUS_NET_LOADING) var userCode = "99999"; //登录访问 - when (val result = networkService.loginUser(LoginUserBean(userName,password))) { - is NetResult.Success<*> ->{ - if (result.data!=null) { + when (val result = networkService.loginUser(LoginUserBean(userName, password))) { + is NetResult.Success<*> -> { + if (result.data != null) { try { val defaultUserResponse = result.data as DefaultResponse - if(defaultUserResponse.success){ - if(defaultUserResponse.obj==null|| defaultUserResponse.obj!!.userCode==null){ + if (defaultUserResponse.success) { + if (defaultUserResponse.obj == null || defaultUserResponse.obj!!.userCode == null) { withContext(Dispatchers.Main) { - Toast.makeText(context, "服务返回用户Code信息错误", Toast.LENGTH_SHORT) + Toast.makeText( + context, + "服务返回用户Code信息错误", + Toast.LENGTH_SHORT + ) .show() } loginStatus.postValue(LoginStatus.LOGIN_STATUS_CANCEL) return - }else{ + } else { userCode = defaultUserResponse.obj?.userCode.toString() } - }else{ + } else { withContext(Dispatchers.Main) { - Toast.makeText(context, "${defaultUserResponse.msg}", Toast.LENGTH_SHORT) + Toast.makeText( + context, + "${defaultUserResponse.msg}", + Toast.LENGTH_SHORT + ) .show() } loginStatus.postValue(LoginStatus.LOGIN_STATUS_CANCEL) @@ -145,7 +172,8 @@ class LoginViewModel @Inject constructor( } } } - is NetResult.Error<*> ->{ + + is NetResult.Error<*> -> { withContext(Dispatchers.Main) { Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT) .show() @@ -153,7 +181,8 @@ class LoginViewModel @Inject constructor( loginStatus.postValue(LoginStatus.LOGIN_STATUS_CANCEL) return } - is NetResult.Failure<*> ->{ + + is NetResult.Failure<*> -> { withContext(Dispatchers.Main) { Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT) .show() @@ -161,12 +190,16 @@ class LoginViewModel @Inject constructor( loginStatus.postValue(LoginStatus.LOGIN_STATUS_CANCEL) return } + else -> {} } //文件夹初始化 try { loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_INIT) + sharedPreferences?.edit()?.putString("userName", userName)?.commit() + sharedPreferences?.edit()?.putString("passWord", password)?.commit() + sharedPreferences?.edit()?.putString("userCode", userCode)?.commit() createUserFolder(context, userCode) } catch (e: IOException) { loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_FAILURE) @@ -185,18 +218,21 @@ class LoginViewModel @Inject constructor( roomAppDatabase.getOfflineMapDao().insertOrUpdate(result.data) } } + is NetResult.Error<*> -> { withContext(Dispatchers.Main) { Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT) .show() } } + is NetResult.Failure<*> -> { withContext(Dispatchers.Main) { Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT) .show() } } + is NetResult.Loading -> {} else -> {} } @@ -234,7 +270,7 @@ class LoginViewModel @Inject constructor( // 拷贝配置文件到用户目录下 val omdbConfigFile = File(userFolder.absolutePath, Constant.OMDB_CONFIG); // if (!omdbConfigFile.exists()) { - ResourceUtils.copyFileFromAssets(Constant.OMDB_CONFIG, omdbConfigFile.absolutePath) + ResourceUtils.copyFileFromAssets(Constant.OMDB_CONFIG, omdbConfigFile.absolutePath) // } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index c6e81e85..60a4d736 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -868,7 +868,7 @@ class MainActivity : BaseActivity() { private fun setIndoorGroupEnable(enable: Boolean) { binding.mainActivitySnapshotFinish.isEnabled = enable binding.mainActivityTraceSnapshotPoints.isEnabled = enable - binding.mainActivitySnapshotMediaFlag.isEnabled = enable + //binding.mainActivitySnapshotMediaFlag.isEnabled = enable binding.mainActivitySnapshotRewind.isEnabled = enable binding.mainActivitySnapshotPause.isEnabled = enable binding.mainActivitySnapshotNext.isEnabled = enable diff --git a/app/src/main/java/com/navinfo/omqs/util/ShareUtil.java b/app/src/main/java/com/navinfo/omqs/util/ShareUtil.java index b3441a8b..cb54cdb2 100644 --- a/app/src/main/java/com/navinfo/omqs/util/ShareUtil.java +++ b/app/src/main/java/com/navinfo/omqs/util/ShareUtil.java @@ -370,4 +370,5 @@ public class ShareUtil { return null; } + } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 774553c2..7833fcfc 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -362,6 +362,7 @@ diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 0b5e0573..6f738290 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1708,9 +1708,13 @@ - + + + + + - + @@ -1815,7 +1820,11 @@ - + + + + + From c83ed1b97e61d49da9996bba56bc7dabc1b59d41 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Thu, 20 Jul 2023 16:01:42 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=AE=A4=E5=86=85?= =?UTF-8?q?=E6=95=B4=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 19 +++--- .../omqs/ui/activity/map/MainViewModel.kt | 60 +++++++++++++++---- app/src/main/res/layout/activity_main.xml | 6 +- .../src/main/assets/editormarker.xml | 9 ++- .../library/map/handler/MarkHandler.kt | 4 +- 5 files changed, 69 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index 60a4d736..5035fe10 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -334,7 +334,10 @@ class MainActivity : BaseActivity() { if (viewModel.indoorToolsCommand == IndoorToolsCommand.SELECT_POINT) { selectPointFinish(true) } - + //启动自动播放 + if (viewModel.indoorToolsCommand == IndoorToolsCommand.PLAY) { + viewModel.startTimer() + } } IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE -> { @@ -627,7 +630,7 @@ class MainActivity : BaseActivity() { viewModel.setSelectPauseTrace(false) binding.mainActivityMenuIndoorGroup.visibility = View.GONE binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() - binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() + //binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() } @@ -636,8 +639,8 @@ class MainActivity : BaseActivity() { */ @RequiresApi(Build.VERSION_CODES.N) fun mediaFlagOnclick() { - viewModel.setMediaFlag(!viewModel.isMediaFlag()) - binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() +/* viewModel.setMediaFlag(!viewModel.isMediaFlag()) + binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag()*/ } /** @@ -650,11 +653,11 @@ class MainActivity : BaseActivity() { mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() - 1) if (item != null) { viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex() - 1) - viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) + viewModel.showMarker(this, item) val traceVideoBean = TraceVideoBean( command = "videotime?", userid = Constant.USER_ID, - time = "${(item.uid as NiLocation).time}:000" + time = "${item.time}:000" ) viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.REWIND) } else { @@ -718,11 +721,11 @@ class MainActivity : BaseActivity() { mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() + 1) if (item != null) { viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex() + 1) - viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) + viewModel.showMarker(this, item) val traceVideoBean = TraceVideoBean( command = "videotime?", userid = Constant.USER_ID, - time = "${(item.uid as NiLocation).time}:000" + time = "${item.time}:000" ) viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.NEXT) } else { diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 18e02a77..7ef3a45d 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -22,6 +22,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils +import com.blankj.utilcode.util.ViewUtils.runOnUiThread import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.* import com.navinfo.collect.library.garminvirbxe.HostBean @@ -56,12 +57,14 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.oscim.core.GeoPoint import org.oscim.core.MapPosition +import org.oscim.layers.marker.MarkerItem import org.oscim.map.Map import org.videolan.libvlc.LibVlcUtil import java.io.File import java.io.IOException import java.util.* import javax.inject.Inject +import kotlin.concurrent.fixedRateTimer /** * 创建Activity全局viewmode @@ -168,6 +171,10 @@ class MainViewModel @Inject constructor( private var shareUtil: ShareUtil? = null + private var timer: Timer? = null + + private var disTime :Long = 1000 + init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> when (e) { @@ -352,9 +359,11 @@ class MainViewModel @Inject constructor( ) ) } - if(Constant.AUTO_LOCATION){ - mapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( location.longitude, location.latitude)) + withContext(Dispatchers.Main){ + if(Constant.AUTO_LOCATION){ + mapController.mMapView.vtmMap.animator() + .animateTo(GeoPoint( location.longitude, location.latitude)) + } } } } @@ -866,13 +875,6 @@ class MainViewModel @Inject constructor( return currentIndexNiLocation } - /** - * 结束自动播放 - */ - fun cancelTrace() { - - } - override fun onConnect(success: Boolean) { if (!success && socketServer != null) { BaseToast.makeText( @@ -928,4 +930,40 @@ class MainViewModel @Inject constructor( mCameraDialog?.connection(hostBean1) } } -} \ No newline at end of file + + fun startTimer() { + if(timer!=null){ + cancelTrace() + } + timer = fixedRateTimer("", false, disTime, disTime) { + if(currentIndexNiLocation + app:constraint_referenced_ids="main_activity_snapshot_finish,main_activity_trace_snapshot_points,main_activity_snapshot_rewind,main_activity_snapshot_pause,main_activity_snapshot_next" /> - + android:src="@drawable/map_trace_mediaflag" />--> - + @@ -1819,12 +1818,12 @@ --> - + - - + + diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 5ce2872d..45071d62 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -758,9 +758,9 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : return niLocationItemizedLayer.itemList.size } - fun getNILocation(index:Int):MarkerInterface?{ + fun getNILocation(index:Int):NiLocation?{ return if(index>-1&&index