diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d106ce1..8cb72ff 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -62,6 +62,7 @@ + + (flag) +// navigatePageTo(flag) + //TODO 审计版本 + navigatePageTo() } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d106ce1..8cb72ff 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -62,6 +62,7 @@ + (flag) +// navigatePageTo(flag) + //TODO 审计版本 + navigatePageTo() } } diff --git a/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt new file mode 100644 index 0000000..2867377 --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt @@ -0,0 +1,238 @@ +package com.casic.detector.common.view + +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager +import android.media.AudioAttributes +import android.media.SoundPool +import android.os.Bundle +import android.os.IBinder +import android.util.Log +import androidx.lifecycle.lifecycleScope +import com.amap.api.location.AMapLocation +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.LatLng +import com.casic.detector.common.R +import com.casic.detector.common.callback.OnGetLocationListener +import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.databinding.ActivitySearchMarkerAuditBinding +import com.casic.detector.common.extensions.handleSignalStrength +import com.casic.detector.common.extensions.hexToString +import com.casic.detector.common.model.MarkerDistanceData +import com.casic.detector.common.service.SerialPortService +import com.casic.detector.common.utils.DataBaseManager +import com.casic.detector.common.utils.LocaleConstant +import com.casic.detector.common.utils.LocationTool +import com.casic.detector.common.widgets.RadarScanView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.getSystemService +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.OutputStream +import kotlin.math.atan2 + +class SearchMarkerAuditActivity : KotlinBaseActivity(), + SensorEventListener { + + private val kTag = "SearchMarkerActivity" + private val locationTool by lazy { LocationTool(this) } + private val markerPoints by lazy { ArrayList() } + private val sensorManager by lazy { getSystemService() } + private val attr = AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build() + private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build() + private val rotationMatrix = FloatArray(9)//旋转矩阵缓存 + private val valueArray = FloatArray(3)//方位角数值 + private var slowSoundResourceId = 0 + private var fastSoundResourceId = 0 + private var nearestMarkerId = ""//探测不到标识器的时候计算出来的最近的标识器ID + private var gravity: FloatArray? = null + private var geomagnetic: FloatArray? = null + private var serialPortService: SerialPortService? = null + + private val serviceConnection = object : ServiceConnection { + override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) { + if (iBinder is SerialPortService.ServiceBinder) { + serialPortService = iBinder.getSerialPortService() + Log.d(kTag, "onServiceConnected: 服务已绑定") + serialPortService?.openSerialPort(object : OnSerialPortDataListener { + override fun write(outStream: OutputStream) { + outStream.write('6'.code) + outStream.flush() + } + + override fun onDataReceived(buffer: ByteArray) { + if (buffer.first() == 78.toByte()) { + val energy = buffer.handleSignalStrength().take(10).hexToString() + val signalEnergy = energy.substring(1).toInt() + if (signalEnergy >= 3000) { + soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f) + } else { + soundPool.play(slowSoundResourceId, 1f, 1f, 0, 0, 1f) + } + } + } + }) + } + } + + override fun onServiceDisconnected(name: ComponentName?) { + + } + } + + + private fun stopSearchMarker() { + soundPool.autoPause() + serialPortService?.closeSerialPort() + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + //绑定串口通信服务 + Intent(this, SerialPortService::class.java).also { + bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) + } + + slowSoundResourceId = soundPool.load(this, R.raw.ring4, 1) + fastSoundResourceId = soundPool.load(this, R.raw.ring2, 1) + + //点位渲染,每次定位都计算当前位置与符合条件的点距离 + locationTool.getCurrentLocation(false, object : OnGetLocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + location?.apply { + renderDataPoint(this) + } + } + }) + } + + override fun initEvent() { + binding.markerInfoButton.setOnClickListener { + //查库 + val result = DataBaseManager.get.queryMarkerById(nearestMarkerId) + if (result.isNotEmpty()) { + navigatePageTo(result.first().toJson()) + } else { + navigatePageTo(nearestMarkerId) + } + } + } + + /** + * 计算并渲染数据点。点太多采用协程计算,不然会有点卡顿。默认2s计算一次 + * @param location 定位点(RTK获取) + * */ + private fun renderDataPoint(location: AMapLocation) { + val longitude = location.longitude + val latitude = location.latitude + lifecycleScope.launch(Dispatchers.IO) { + val dataPoints = ArrayList() + DataBaseManager.get.loadMarkers().forEach { + val distance = AMapUtils.calculateLineDistance( + LatLng(it.lat.toDouble(), it.lng.toDouble()), LatLng(latitude, longitude) + ) + val formatDistance = "%.2f".format(distance).toFloat() + markerPoints.add(MarkerDistanceData(it.markerId, formatDistance)) + + if (formatDistance <= LocaleConstant.MAX_DISTANCE) { + val angle = atan2( + (it.lat.toDouble() - latitude), (it.lng.toDouble() - longitude) + ) + Math.PI + val formatAngle = "%.2f".format(angle).toDouble() + + dataPoints.add(RadarScanView.DataPoint(formatAngle, formatDistance)) + } + } + withContext(Dispatchers.Main) { + binding.radarScanView.renderPointData(dataPoints, + object : RadarScanView.OnGetNearestPointCallback { + override fun getNearestPoint(point: RadarScanView.DataPoint?) { + if (point == null) { + binding.distanceValueView.text = "大于5.5m" + binding.distancePgBar.progress = 100 + } else { + binding.distanceValueView.text = "${point.distance}m" + val progress = if (point.distance > LocaleConstant.MAX_DISTANCE) { + 100 + } else { + (point.distance / LocaleConstant.MAX_DISTANCE) * 100 + } + binding.distancePgBar.progress = progress.toInt() + } + } + } + ) + } + } + } + + override fun initViewBinding(): ActivitySearchMarkerAuditBinding { + return ActivitySearchMarkerAuditBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun onResume() { + super.onResume() + //注册加速度传感器监听 + val accelerometer = sensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) + sensorManager?.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL) + + //注册磁场传感器监听 + val magnetic = sensorManager?.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) + sensorManager?.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_NORMAL) + } + + override fun onPause() { + super.onPause() + sensorManager?.unregisterListener(this) + } + + override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { + //精度发生变化时触发 + } + + override fun onSensorChanged(event: SensorEvent?) { + //值发生变化时触发 + val type = event?.sensor?.type + + if (type == Sensor.TYPE_ACCELEROMETER) { + gravity = event.values + } else if (type == Sensor.TYPE_MAGNETIC_FIELD) { + geomagnetic = event.values + } + + if (gravity == null || geomagnetic == null) { + return + } + + if (SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomagnetic)) { + SensorManager.getOrientation(rotationMatrix, valueArray) + + val degree = ((360f + valueArray[0] * 180f / Math.PI) % 360).toInt() + //更新罗盘角度 + binding.radarScanView.setDegreeValue(degree) + } + } + + override fun onDestroy() { + super.onDestroy() + stopSearchMarker() + locationTool.stopLocation() + unbindService(serviceConnection) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d106ce1..8cb72ff 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -62,6 +62,7 @@ + (flag) +// navigatePageTo(flag) + //TODO 审计版本 + navigatePageTo() } } diff --git a/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt new file mode 100644 index 0000000..2867377 --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt @@ -0,0 +1,238 @@ +package com.casic.detector.common.view + +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager +import android.media.AudioAttributes +import android.media.SoundPool +import android.os.Bundle +import android.os.IBinder +import android.util.Log +import androidx.lifecycle.lifecycleScope +import com.amap.api.location.AMapLocation +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.LatLng +import com.casic.detector.common.R +import com.casic.detector.common.callback.OnGetLocationListener +import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.databinding.ActivitySearchMarkerAuditBinding +import com.casic.detector.common.extensions.handleSignalStrength +import com.casic.detector.common.extensions.hexToString +import com.casic.detector.common.model.MarkerDistanceData +import com.casic.detector.common.service.SerialPortService +import com.casic.detector.common.utils.DataBaseManager +import com.casic.detector.common.utils.LocaleConstant +import com.casic.detector.common.utils.LocationTool +import com.casic.detector.common.widgets.RadarScanView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.getSystemService +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.OutputStream +import kotlin.math.atan2 + +class SearchMarkerAuditActivity : KotlinBaseActivity(), + SensorEventListener { + + private val kTag = "SearchMarkerActivity" + private val locationTool by lazy { LocationTool(this) } + private val markerPoints by lazy { ArrayList() } + private val sensorManager by lazy { getSystemService() } + private val attr = AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build() + private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build() + private val rotationMatrix = FloatArray(9)//旋转矩阵缓存 + private val valueArray = FloatArray(3)//方位角数值 + private var slowSoundResourceId = 0 + private var fastSoundResourceId = 0 + private var nearestMarkerId = ""//探测不到标识器的时候计算出来的最近的标识器ID + private var gravity: FloatArray? = null + private var geomagnetic: FloatArray? = null + private var serialPortService: SerialPortService? = null + + private val serviceConnection = object : ServiceConnection { + override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) { + if (iBinder is SerialPortService.ServiceBinder) { + serialPortService = iBinder.getSerialPortService() + Log.d(kTag, "onServiceConnected: 服务已绑定") + serialPortService?.openSerialPort(object : OnSerialPortDataListener { + override fun write(outStream: OutputStream) { + outStream.write('6'.code) + outStream.flush() + } + + override fun onDataReceived(buffer: ByteArray) { + if (buffer.first() == 78.toByte()) { + val energy = buffer.handleSignalStrength().take(10).hexToString() + val signalEnergy = energy.substring(1).toInt() + if (signalEnergy >= 3000) { + soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f) + } else { + soundPool.play(slowSoundResourceId, 1f, 1f, 0, 0, 1f) + } + } + } + }) + } + } + + override fun onServiceDisconnected(name: ComponentName?) { + + } + } + + + private fun stopSearchMarker() { + soundPool.autoPause() + serialPortService?.closeSerialPort() + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + //绑定串口通信服务 + Intent(this, SerialPortService::class.java).also { + bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) + } + + slowSoundResourceId = soundPool.load(this, R.raw.ring4, 1) + fastSoundResourceId = soundPool.load(this, R.raw.ring2, 1) + + //点位渲染,每次定位都计算当前位置与符合条件的点距离 + locationTool.getCurrentLocation(false, object : OnGetLocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + location?.apply { + renderDataPoint(this) + } + } + }) + } + + override fun initEvent() { + binding.markerInfoButton.setOnClickListener { + //查库 + val result = DataBaseManager.get.queryMarkerById(nearestMarkerId) + if (result.isNotEmpty()) { + navigatePageTo(result.first().toJson()) + } else { + navigatePageTo(nearestMarkerId) + } + } + } + + /** + * 计算并渲染数据点。点太多采用协程计算,不然会有点卡顿。默认2s计算一次 + * @param location 定位点(RTK获取) + * */ + private fun renderDataPoint(location: AMapLocation) { + val longitude = location.longitude + val latitude = location.latitude + lifecycleScope.launch(Dispatchers.IO) { + val dataPoints = ArrayList() + DataBaseManager.get.loadMarkers().forEach { + val distance = AMapUtils.calculateLineDistance( + LatLng(it.lat.toDouble(), it.lng.toDouble()), LatLng(latitude, longitude) + ) + val formatDistance = "%.2f".format(distance).toFloat() + markerPoints.add(MarkerDistanceData(it.markerId, formatDistance)) + + if (formatDistance <= LocaleConstant.MAX_DISTANCE) { + val angle = atan2( + (it.lat.toDouble() - latitude), (it.lng.toDouble() - longitude) + ) + Math.PI + val formatAngle = "%.2f".format(angle).toDouble() + + dataPoints.add(RadarScanView.DataPoint(formatAngle, formatDistance)) + } + } + withContext(Dispatchers.Main) { + binding.radarScanView.renderPointData(dataPoints, + object : RadarScanView.OnGetNearestPointCallback { + override fun getNearestPoint(point: RadarScanView.DataPoint?) { + if (point == null) { + binding.distanceValueView.text = "大于5.5m" + binding.distancePgBar.progress = 100 + } else { + binding.distanceValueView.text = "${point.distance}m" + val progress = if (point.distance > LocaleConstant.MAX_DISTANCE) { + 100 + } else { + (point.distance / LocaleConstant.MAX_DISTANCE) * 100 + } + binding.distancePgBar.progress = progress.toInt() + } + } + } + ) + } + } + } + + override fun initViewBinding(): ActivitySearchMarkerAuditBinding { + return ActivitySearchMarkerAuditBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun onResume() { + super.onResume() + //注册加速度传感器监听 + val accelerometer = sensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) + sensorManager?.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL) + + //注册磁场传感器监听 + val magnetic = sensorManager?.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) + sensorManager?.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_NORMAL) + } + + override fun onPause() { + super.onPause() + sensorManager?.unregisterListener(this) + } + + override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { + //精度发生变化时触发 + } + + override fun onSensorChanged(event: SensorEvent?) { + //值发生变化时触发 + val type = event?.sensor?.type + + if (type == Sensor.TYPE_ACCELEROMETER) { + gravity = event.values + } else if (type == Sensor.TYPE_MAGNETIC_FIELD) { + geomagnetic = event.values + } + + if (gravity == null || geomagnetic == null) { + return + } + + if (SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomagnetic)) { + SensorManager.getOrientation(rotationMatrix, valueArray) + + val degree = ((360f + valueArray[0] * 180f / Math.PI) % 360).toInt() + //更新罗盘角度 + binding.radarScanView.setDegreeValue(degree) + } + } + + override fun onDestroy() { + super.onDestroy() + stopSearchMarker() + locationTool.stopLocation() + unbindService(serviceConnection) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_new_object_detail.xml b/app/src/main/res/layout/activity_new_object_detail.xml index 1a8415f..1df39e3 100644 --- a/app/src/main/res/layout/activity_new_object_detail.xml +++ b/app/src/main/res/layout/activity_new_object_detail.xml @@ -60,7 +60,7 @@ + android:text="未登记" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d106ce1..8cb72ff 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -62,6 +62,7 @@ + (flag) +// navigatePageTo(flag) + //TODO 审计版本 + navigatePageTo() } } diff --git a/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt new file mode 100644 index 0000000..2867377 --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt @@ -0,0 +1,238 @@ +package com.casic.detector.common.view + +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager +import android.media.AudioAttributes +import android.media.SoundPool +import android.os.Bundle +import android.os.IBinder +import android.util.Log +import androidx.lifecycle.lifecycleScope +import com.amap.api.location.AMapLocation +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.LatLng +import com.casic.detector.common.R +import com.casic.detector.common.callback.OnGetLocationListener +import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.databinding.ActivitySearchMarkerAuditBinding +import com.casic.detector.common.extensions.handleSignalStrength +import com.casic.detector.common.extensions.hexToString +import com.casic.detector.common.model.MarkerDistanceData +import com.casic.detector.common.service.SerialPortService +import com.casic.detector.common.utils.DataBaseManager +import com.casic.detector.common.utils.LocaleConstant +import com.casic.detector.common.utils.LocationTool +import com.casic.detector.common.widgets.RadarScanView +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.getSystemService +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.OutputStream +import kotlin.math.atan2 + +class SearchMarkerAuditActivity : KotlinBaseActivity(), + SensorEventListener { + + private val kTag = "SearchMarkerActivity" + private val locationTool by lazy { LocationTool(this) } + private val markerPoints by lazy { ArrayList() } + private val sensorManager by lazy { getSystemService() } + private val attr = AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build() + private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build() + private val rotationMatrix = FloatArray(9)//旋转矩阵缓存 + private val valueArray = FloatArray(3)//方位角数值 + private var slowSoundResourceId = 0 + private var fastSoundResourceId = 0 + private var nearestMarkerId = ""//探测不到标识器的时候计算出来的最近的标识器ID + private var gravity: FloatArray? = null + private var geomagnetic: FloatArray? = null + private var serialPortService: SerialPortService? = null + + private val serviceConnection = object : ServiceConnection { + override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) { + if (iBinder is SerialPortService.ServiceBinder) { + serialPortService = iBinder.getSerialPortService() + Log.d(kTag, "onServiceConnected: 服务已绑定") + serialPortService?.openSerialPort(object : OnSerialPortDataListener { + override fun write(outStream: OutputStream) { + outStream.write('6'.code) + outStream.flush() + } + + override fun onDataReceived(buffer: ByteArray) { + if (buffer.first() == 78.toByte()) { + val energy = buffer.handleSignalStrength().take(10).hexToString() + val signalEnergy = energy.substring(1).toInt() + if (signalEnergy >= 3000) { + soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f) + } else { + soundPool.play(slowSoundResourceId, 1f, 1f, 0, 0, 1f) + } + } + } + }) + } + } + + override fun onServiceDisconnected(name: ComponentName?) { + + } + } + + + private fun stopSearchMarker() { + soundPool.autoPause() + serialPortService?.closeSerialPort() + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + //绑定串口通信服务 + Intent(this, SerialPortService::class.java).also { + bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) + } + + slowSoundResourceId = soundPool.load(this, R.raw.ring4, 1) + fastSoundResourceId = soundPool.load(this, R.raw.ring2, 1) + + //点位渲染,每次定位都计算当前位置与符合条件的点距离 + locationTool.getCurrentLocation(false, object : OnGetLocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + location?.apply { + renderDataPoint(this) + } + } + }) + } + + override fun initEvent() { + binding.markerInfoButton.setOnClickListener { + //查库 + val result = DataBaseManager.get.queryMarkerById(nearestMarkerId) + if (result.isNotEmpty()) { + navigatePageTo(result.first().toJson()) + } else { + navigatePageTo(nearestMarkerId) + } + } + } + + /** + * 计算并渲染数据点。点太多采用协程计算,不然会有点卡顿。默认2s计算一次 + * @param location 定位点(RTK获取) + * */ + private fun renderDataPoint(location: AMapLocation) { + val longitude = location.longitude + val latitude = location.latitude + lifecycleScope.launch(Dispatchers.IO) { + val dataPoints = ArrayList() + DataBaseManager.get.loadMarkers().forEach { + val distance = AMapUtils.calculateLineDistance( + LatLng(it.lat.toDouble(), it.lng.toDouble()), LatLng(latitude, longitude) + ) + val formatDistance = "%.2f".format(distance).toFloat() + markerPoints.add(MarkerDistanceData(it.markerId, formatDistance)) + + if (formatDistance <= LocaleConstant.MAX_DISTANCE) { + val angle = atan2( + (it.lat.toDouble() - latitude), (it.lng.toDouble() - longitude) + ) + Math.PI + val formatAngle = "%.2f".format(angle).toDouble() + + dataPoints.add(RadarScanView.DataPoint(formatAngle, formatDistance)) + } + } + withContext(Dispatchers.Main) { + binding.radarScanView.renderPointData(dataPoints, + object : RadarScanView.OnGetNearestPointCallback { + override fun getNearestPoint(point: RadarScanView.DataPoint?) { + if (point == null) { + binding.distanceValueView.text = "大于5.5m" + binding.distancePgBar.progress = 100 + } else { + binding.distanceValueView.text = "${point.distance}m" + val progress = if (point.distance > LocaleConstant.MAX_DISTANCE) { + 100 + } else { + (point.distance / LocaleConstant.MAX_DISTANCE) * 100 + } + binding.distancePgBar.progress = progress.toInt() + } + } + } + ) + } + } + } + + override fun initViewBinding(): ActivitySearchMarkerAuditBinding { + return ActivitySearchMarkerAuditBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun onResume() { + super.onResume() + //注册加速度传感器监听 + val accelerometer = sensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) + sensorManager?.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL) + + //注册磁场传感器监听 + val magnetic = sensorManager?.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) + sensorManager?.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_NORMAL) + } + + override fun onPause() { + super.onPause() + sensorManager?.unregisterListener(this) + } + + override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { + //精度发生变化时触发 + } + + override fun onSensorChanged(event: SensorEvent?) { + //值发生变化时触发 + val type = event?.sensor?.type + + if (type == Sensor.TYPE_ACCELEROMETER) { + gravity = event.values + } else if (type == Sensor.TYPE_MAGNETIC_FIELD) { + geomagnetic = event.values + } + + if (gravity == null || geomagnetic == null) { + return + } + + if (SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomagnetic)) { + SensorManager.getOrientation(rotationMatrix, valueArray) + + val degree = ((360f + valueArray[0] * 180f / Math.PI) % 360).toInt() + //更新罗盘角度 + binding.radarScanView.setDegreeValue(degree) + } + } + + override fun onDestroy() { + super.onDestroy() + stopSearchMarker() + locationTool.stopLocation() + unbindService(serviceConnection) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_new_object_detail.xml b/app/src/main/res/layout/activity_new_object_detail.xml index 1a8415f..1df39e3 100644 --- a/app/src/main/res/layout/activity_new_object_detail.xml +++ b/app/src/main/res/layout/activity_new_object_detail.xml @@ -60,7 +60,7 @@ + android:text="未登记" /> diff --git a/app/src/main/res/layout/activity_search_marker_audit.xml b/app/src/main/res/layout/activity_search_marker_audit.xml new file mode 100644 index 0000000..ff93885 --- /dev/null +++ b/app/src/main/res/layout/activity_search_marker_audit.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + +