diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt new file mode 100644 index 0000000..1287e57 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt @@ -0,0 +1,44 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import java.text.DecimalFormat +import java.util.LinkedList + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun LinkedList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.latitude, last.longitude) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.latitude, it.longitude)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt new file mode 100644 index 0000000..1287e57 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt @@ -0,0 +1,44 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import java.text.DecimalFormat +import java.util.LinkedList + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun LinkedList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.latitude, last.longitude) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.latitude, it.longitude)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt new file mode 100644 index 0000000..89574ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt @@ -0,0 +1,90 @@ +package com.casic.birmm.inspect.service + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Binder +import android.os.Build +import android.os.IBinder +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationListener +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.LocationHub +import com.pengxh.kt.lite.extensions.getSystemService + +/** + * 后台定位服务 + * */ +class LocationService : Service() { + + private val kTag = "LocationService" + + override fun onBind(intent: Intent?): IBinder { + return ServiceBinder() + } + + inner class ServiceBinder : Binder() { + fun getLocationService(): LocationService { + return this@LocationService + } + } + + /** + * 开始定位 + * */ + fun startLocation(listener: LocationHub.ILocationListener) { + //开启通知,并申请成为前台服务 + createForegroundNotification() + + LocationHub.get.getLocationByAMap(this, object : AMapLocationListener { + override fun onLocationChanged(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + listener.onAMapLocationError() + return + } + + listener.onAMapLocationGet(aMapLocation) + } + }) + } + + /** + * 停止定位 + * */ + fun stopLocation() { + LocationHub.get.stopLocation() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + stopForeground(STOP_FOREGROUND_REMOVE) + } + } + + private fun createForegroundNotification() { + val notificationManager = getSystemService() + val builder: Notification.Builder + val name = resources.getString(R.string.app_name) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //创建渠道 + val id = "${kTag}Channel" + val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH) + channel.setShowBadge(true) + channel.enableVibration(false) + channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC //设置锁屏可见 + notificationManager?.createNotificationChannel(channel) + builder = Notification.Builder(this, id) + } else { + builder = Notification.Builder(this).setPriority(Notification.PRIORITY_HIGH) + } + val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher) + builder.setContentTitle(name) + .setContentText("${name}巡检任务定位中") + .setWhen(System.currentTimeMillis()) + .setSmallIcon(R.mipmap.ic_launcher) + .setLargeIcon(bitmap) + val notification = builder.build() + notification.flags = Notification.FLAG_NO_CLEAR + startForeground(Int.MAX_VALUE, notification) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt new file mode 100644 index 0000000..1287e57 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt @@ -0,0 +1,44 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import java.text.DecimalFormat +import java.util.LinkedList + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun LinkedList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.latitude, last.longitude) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.latitude, it.longitude)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt new file mode 100644 index 0000000..89574ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt @@ -0,0 +1,90 @@ +package com.casic.birmm.inspect.service + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Binder +import android.os.Build +import android.os.IBinder +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationListener +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.LocationHub +import com.pengxh.kt.lite.extensions.getSystemService + +/** + * 后台定位服务 + * */ +class LocationService : Service() { + + private val kTag = "LocationService" + + override fun onBind(intent: Intent?): IBinder { + return ServiceBinder() + } + + inner class ServiceBinder : Binder() { + fun getLocationService(): LocationService { + return this@LocationService + } + } + + /** + * 开始定位 + * */ + fun startLocation(listener: LocationHub.ILocationListener) { + //开启通知,并申请成为前台服务 + createForegroundNotification() + + LocationHub.get.getLocationByAMap(this, object : AMapLocationListener { + override fun onLocationChanged(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + listener.onAMapLocationError() + return + } + + listener.onAMapLocationGet(aMapLocation) + } + }) + } + + /** + * 停止定位 + * */ + fun stopLocation() { + LocationHub.get.stopLocation() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + stopForeground(STOP_FOREGROUND_REMOVE) + } + } + + private fun createForegroundNotification() { + val notificationManager = getSystemService() + val builder: Notification.Builder + val name = resources.getString(R.string.app_name) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //创建渠道 + val id = "${kTag}Channel" + val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH) + channel.setShowBadge(true) + channel.enableVibration(false) + channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC //设置锁屏可见 + notificationManager?.createNotificationChannel(channel) + builder = Notification.Builder(this, id) + } else { + builder = Notification.Builder(this).setPriority(Notification.PRIORITY_HIGH) + } + val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher) + builder.setContentTitle(name) + .setContentText("${name}巡检任务定位中") + .setWhen(System.currentTimeMillis()) + .setSmallIcon(R.mipmap.ic_launcher) + .setLargeIcon(bitmap) + val notification = builder.build() + notification.flags = Notification.FLAG_NO_CLEAR + startForeground(Int.MAX_VALUE, notification) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_inspection_route.xml b/app/src/main/res/layout/activity_inspection_route.xml index d06a207..0d07153 100644 --- a/app/src/main/res/layout/activity_inspection_route.xml +++ b/app/src/main/res/layout/activity_inspection_route.xml @@ -82,7 +82,7 @@ + android:background="@drawable/ic_dot_red"> .calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.latitude, last.longitude) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.latitude, it.longitude)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt new file mode 100644 index 0000000..89574ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt @@ -0,0 +1,90 @@ +package com.casic.birmm.inspect.service + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Binder +import android.os.Build +import android.os.IBinder +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationListener +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.LocationHub +import com.pengxh.kt.lite.extensions.getSystemService + +/** + * 后台定位服务 + * */ +class LocationService : Service() { + + private val kTag = "LocationService" + + override fun onBind(intent: Intent?): IBinder { + return ServiceBinder() + } + + inner class ServiceBinder : Binder() { + fun getLocationService(): LocationService { + return this@LocationService + } + } + + /** + * 开始定位 + * */ + fun startLocation(listener: LocationHub.ILocationListener) { + //开启通知,并申请成为前台服务 + createForegroundNotification() + + LocationHub.get.getLocationByAMap(this, object : AMapLocationListener { + override fun onLocationChanged(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + listener.onAMapLocationError() + return + } + + listener.onAMapLocationGet(aMapLocation) + } + }) + } + + /** + * 停止定位 + * */ + fun stopLocation() { + LocationHub.get.stopLocation() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + stopForeground(STOP_FOREGROUND_REMOVE) + } + } + + private fun createForegroundNotification() { + val notificationManager = getSystemService() + val builder: Notification.Builder + val name = resources.getString(R.string.app_name) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //创建渠道 + val id = "${kTag}Channel" + val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH) + channel.setShowBadge(true) + channel.enableVibration(false) + channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC //设置锁屏可见 + notificationManager?.createNotificationChannel(channel) + builder = Notification.Builder(this, id) + } else { + builder = Notification.Builder(this).setPriority(Notification.PRIORITY_HIGH) + } + val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher) + builder.setContentTitle(name) + .setContentText("${name}巡检任务定位中") + .setWhen(System.currentTimeMillis()) + .setSmallIcon(R.mipmap.ic_launcher) + .setLargeIcon(bitmap) + val notification = builder.build() + notification.flags = Notification.FLAG_NO_CLEAR + startForeground(Int.MAX_VALUE, notification) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_inspection_route.xml b/app/src/main/res/layout/activity_inspection_route.xml index d06a207..0d07153 100644 --- a/app/src/main/res/layout/activity_inspection_route.xml +++ b/app/src/main/res/layout/activity_inspection_route.xml @@ -82,7 +82,7 @@ + android:background="@drawable/ic_dot_red"> diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt new file mode 100644 index 0000000..1287e57 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt @@ -0,0 +1,44 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import java.text.DecimalFormat +import java.util.LinkedList + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun LinkedList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.latitude, last.longitude) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.latitude, it.longitude)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt new file mode 100644 index 0000000..89574ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt @@ -0,0 +1,90 @@ +package com.casic.birmm.inspect.service + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Binder +import android.os.Build +import android.os.IBinder +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationListener +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.LocationHub +import com.pengxh.kt.lite.extensions.getSystemService + +/** + * 后台定位服务 + * */ +class LocationService : Service() { + + private val kTag = "LocationService" + + override fun onBind(intent: Intent?): IBinder { + return ServiceBinder() + } + + inner class ServiceBinder : Binder() { + fun getLocationService(): LocationService { + return this@LocationService + } + } + + /** + * 开始定位 + * */ + fun startLocation(listener: LocationHub.ILocationListener) { + //开启通知,并申请成为前台服务 + createForegroundNotification() + + LocationHub.get.getLocationByAMap(this, object : AMapLocationListener { + override fun onLocationChanged(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + listener.onAMapLocationError() + return + } + + listener.onAMapLocationGet(aMapLocation) + } + }) + } + + /** + * 停止定位 + * */ + fun stopLocation() { + LocationHub.get.stopLocation() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + stopForeground(STOP_FOREGROUND_REMOVE) + } + } + + private fun createForegroundNotification() { + val notificationManager = getSystemService() + val builder: Notification.Builder + val name = resources.getString(R.string.app_name) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //创建渠道 + val id = "${kTag}Channel" + val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH) + channel.setShowBadge(true) + channel.enableVibration(false) + channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC //设置锁屏可见 + notificationManager?.createNotificationChannel(channel) + builder = Notification.Builder(this, id) + } else { + builder = Notification.Builder(this).setPriority(Notification.PRIORITY_HIGH) + } + val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher) + builder.setContentTitle(name) + .setContentText("${name}巡检任务定位中") + .setWhen(System.currentTimeMillis()) + .setSmallIcon(R.mipmap.ic_launcher) + .setLargeIcon(bitmap) + val notification = builder.build() + notification.flags = Notification.FLAG_NO_CLEAR + startForeground(Int.MAX_VALUE, notification) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_inspection_route.xml b/app/src/main/res/layout/activity_inspection_route.xml index d06a207..0d07153 100644 --- a/app/src/main/res/layout/activity_inspection_route.xml +++ b/app/src/main/res/layout/activity_inspection_route.xml @@ -82,7 +82,7 @@ + android:background="@drawable/ic_dot_red"> diff --git a/app/src/main/res/layout/item_inspect_rv_l.xml b/app/src/main/res/layout/item_inspect_rv_l.xml index 1592e1b..3236fed 100644 --- a/app/src/main/res/layout/item_inspect_rv_l.xml +++ b/app/src/main/res/layout/item_inspect_rv_l.xml @@ -18,6 +18,7 @@ android:id="@+id/v" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_centerVertical="true" android:layout_marginStart="@dimen/dp_7" android:singleLine="true" android:text="设备编号:" diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt new file mode 100644 index 0000000..1287e57 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt @@ -0,0 +1,44 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import java.text.DecimalFormat +import java.util.LinkedList + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun LinkedList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.latitude, last.longitude) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.latitude, it.longitude)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt new file mode 100644 index 0000000..89574ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt @@ -0,0 +1,90 @@ +package com.casic.birmm.inspect.service + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Binder +import android.os.Build +import android.os.IBinder +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationListener +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.LocationHub +import com.pengxh.kt.lite.extensions.getSystemService + +/** + * 后台定位服务 + * */ +class LocationService : Service() { + + private val kTag = "LocationService" + + override fun onBind(intent: Intent?): IBinder { + return ServiceBinder() + } + + inner class ServiceBinder : Binder() { + fun getLocationService(): LocationService { + return this@LocationService + } + } + + /** + * 开始定位 + * */ + fun startLocation(listener: LocationHub.ILocationListener) { + //开启通知,并申请成为前台服务 + createForegroundNotification() + + LocationHub.get.getLocationByAMap(this, object : AMapLocationListener { + override fun onLocationChanged(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + listener.onAMapLocationError() + return + } + + listener.onAMapLocationGet(aMapLocation) + } + }) + } + + /** + * 停止定位 + * */ + fun stopLocation() { + LocationHub.get.stopLocation() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + stopForeground(STOP_FOREGROUND_REMOVE) + } + } + + private fun createForegroundNotification() { + val notificationManager = getSystemService() + val builder: Notification.Builder + val name = resources.getString(R.string.app_name) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //创建渠道 + val id = "${kTag}Channel" + val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH) + channel.setShowBadge(true) + channel.enableVibration(false) + channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC //设置锁屏可见 + notificationManager?.createNotificationChannel(channel) + builder = Notification.Builder(this, id) + } else { + builder = Notification.Builder(this).setPriority(Notification.PRIORITY_HIGH) + } + val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher) + builder.setContentTitle(name) + .setContentText("${name}巡检任务定位中") + .setWhen(System.currentTimeMillis()) + .setSmallIcon(R.mipmap.ic_launcher) + .setLargeIcon(bitmap) + val notification = builder.build() + notification.flags = Notification.FLAG_NO_CLEAR + startForeground(Int.MAX_VALUE, notification) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_inspection_route.xml b/app/src/main/res/layout/activity_inspection_route.xml index d06a207..0d07153 100644 --- a/app/src/main/res/layout/activity_inspection_route.xml +++ b/app/src/main/res/layout/activity_inspection_route.xml @@ -82,7 +82,7 @@ + android:background="@drawable/ic_dot_red"> diff --git a/app/src/main/res/layout/item_inspect_rv_l.xml b/app/src/main/res/layout/item_inspect_rv_l.xml index 1592e1b..3236fed 100644 --- a/app/src/main/res/layout/item_inspect_rv_l.xml +++ b/app/src/main/res/layout/item_inspect_rv_l.xml @@ -18,6 +18,7 @@ android:id="@+id/v" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_centerVertical="true" android:layout_marginStart="@dimen/dp_7" android:singleLine="true" android:text="设备编号:" diff --git a/app/src/main/res/layout/single_activity_inspection_route.xml b/app/src/main/res/layout/single_activity_inspection_route.xml index d06a207..0d07153 100644 --- a/app/src/main/res/layout/single_activity_inspection_route.xml +++ b/app/src/main/res/layout/single_activity_inspection_route.xml @@ -82,7 +82,7 @@ + android:background="@drawable/ic_dot_red"> .calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.latitude, last.longitude) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.latitude, it.longitude)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt new file mode 100644 index 0000000..89574ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt @@ -0,0 +1,90 @@ +package com.casic.birmm.inspect.service + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Binder +import android.os.Build +import android.os.IBinder +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationListener +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.LocationHub +import com.pengxh.kt.lite.extensions.getSystemService + +/** + * 后台定位服务 + * */ +class LocationService : Service() { + + private val kTag = "LocationService" + + override fun onBind(intent: Intent?): IBinder { + return ServiceBinder() + } + + inner class ServiceBinder : Binder() { + fun getLocationService(): LocationService { + return this@LocationService + } + } + + /** + * 开始定位 + * */ + fun startLocation(listener: LocationHub.ILocationListener) { + //开启通知,并申请成为前台服务 + createForegroundNotification() + + LocationHub.get.getLocationByAMap(this, object : AMapLocationListener { + override fun onLocationChanged(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + listener.onAMapLocationError() + return + } + + listener.onAMapLocationGet(aMapLocation) + } + }) + } + + /** + * 停止定位 + * */ + fun stopLocation() { + LocationHub.get.stopLocation() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + stopForeground(STOP_FOREGROUND_REMOVE) + } + } + + private fun createForegroundNotification() { + val notificationManager = getSystemService() + val builder: Notification.Builder + val name = resources.getString(R.string.app_name) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //创建渠道 + val id = "${kTag}Channel" + val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH) + channel.setShowBadge(true) + channel.enableVibration(false) + channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC //设置锁屏可见 + notificationManager?.createNotificationChannel(channel) + builder = Notification.Builder(this, id) + } else { + builder = Notification.Builder(this).setPriority(Notification.PRIORITY_HIGH) + } + val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher) + builder.setContentTitle(name) + .setContentText("${name}巡检任务定位中") + .setWhen(System.currentTimeMillis()) + .setSmallIcon(R.mipmap.ic_launcher) + .setLargeIcon(bitmap) + val notification = builder.build() + notification.flags = Notification.FLAG_NO_CLEAR + startForeground(Int.MAX_VALUE, notification) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_inspection_route.xml b/app/src/main/res/layout/activity_inspection_route.xml index d06a207..0d07153 100644 --- a/app/src/main/res/layout/activity_inspection_route.xml +++ b/app/src/main/res/layout/activity_inspection_route.xml @@ -82,7 +82,7 @@ + android:background="@drawable/ic_dot_red"> diff --git a/app/src/main/res/layout/item_inspect_rv_l.xml b/app/src/main/res/layout/item_inspect_rv_l.xml index 1592e1b..3236fed 100644 --- a/app/src/main/res/layout/item_inspect_rv_l.xml +++ b/app/src/main/res/layout/item_inspect_rv_l.xml @@ -18,6 +18,7 @@ android:id="@+id/v" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_centerVertical="true" android:layout_marginStart="@dimen/dp_7" android:singleLine="true" android:text="设备编号:" diff --git a/app/src/main/res/layout/single_activity_inspection_route.xml b/app/src/main/res/layout/single_activity_inspection_route.xml index d06a207..0d07153 100644 --- a/app/src/main/res/layout/single_activity_inspection_route.xml +++ b/app/src/main/res/layout/single_activity_inspection_route.xml @@ -82,7 +82,7 @@ + android:background="@drawable/ic_dot_red"> diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt new file mode 100644 index 0000000..1287e57 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LinkedList.kt @@ -0,0 +1,44 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import java.text.DecimalFormat +import java.util.LinkedList + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun LinkedList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.latitude, last.longitude) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.latitude, it.longitude)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt new file mode 100644 index 0000000..89574ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/service/LocationService.kt @@ -0,0 +1,90 @@ +package com.casic.birmm.inspect.service + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Binder +import android.os.Build +import android.os.IBinder +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationListener +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.LocationHub +import com.pengxh.kt.lite.extensions.getSystemService + +/** + * 后台定位服务 + * */ +class LocationService : Service() { + + private val kTag = "LocationService" + + override fun onBind(intent: Intent?): IBinder { + return ServiceBinder() + } + + inner class ServiceBinder : Binder() { + fun getLocationService(): LocationService { + return this@LocationService + } + } + + /** + * 开始定位 + * */ + fun startLocation(listener: LocationHub.ILocationListener) { + //开启通知,并申请成为前台服务 + createForegroundNotification() + + LocationHub.get.getLocationByAMap(this, object : AMapLocationListener { + override fun onLocationChanged(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + listener.onAMapLocationError() + return + } + + listener.onAMapLocationGet(aMapLocation) + } + }) + } + + /** + * 停止定位 + * */ + fun stopLocation() { + LocationHub.get.stopLocation() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + stopForeground(STOP_FOREGROUND_REMOVE) + } + } + + private fun createForegroundNotification() { + val notificationManager = getSystemService() + val builder: Notification.Builder + val name = resources.getString(R.string.app_name) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //创建渠道 + val id = "${kTag}Channel" + val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH) + channel.setShowBadge(true) + channel.enableVibration(false) + channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC //设置锁屏可见 + notificationManager?.createNotificationChannel(channel) + builder = Notification.Builder(this, id) + } else { + builder = Notification.Builder(this).setPriority(Notification.PRIORITY_HIGH) + } + val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher) + builder.setContentTitle(name) + .setContentText("${name}巡检任务定位中") + .setWhen(System.currentTimeMillis()) + .setSmallIcon(R.mipmap.ic_launcher) + .setLargeIcon(bitmap) + val notification = builder.build() + notification.flags = Notification.FLAG_NO_CLEAR + startForeground(Int.MAX_VALUE, notification) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_inspection_route.xml b/app/src/main/res/layout/activity_inspection_route.xml index d06a207..0d07153 100644 --- a/app/src/main/res/layout/activity_inspection_route.xml +++ b/app/src/main/res/layout/activity_inspection_route.xml @@ -82,7 +82,7 @@ + android:background="@drawable/ic_dot_red"> diff --git a/app/src/main/res/layout/item_inspect_rv_l.xml b/app/src/main/res/layout/item_inspect_rv_l.xml index 1592e1b..3236fed 100644 --- a/app/src/main/res/layout/item_inspect_rv_l.xml +++ b/app/src/main/res/layout/item_inspect_rv_l.xml @@ -18,6 +18,7 @@ android:id="@+id/v" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_centerVertical="true" android:layout_marginStart="@dimen/dp_7" android:singleLine="true" android:text="设备编号:" diff --git a/app/src/main/res/layout/single_activity_inspection_route.xml b/app/src/main/res/layout/single_activity_inspection_route.xml index d06a207..0d07153 100644 --- a/app/src/main/res/layout/single_activity_inspection_route.xml +++ b/app/src/main/res/layout/single_activity_inspection_route.xml @@ -82,7 +82,7 @@ + android:background="@drawable/ic_dot_red"> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f023b2a..67dbc4e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -58,15 +58,6 @@ true - -