Browse Source

用高德地图替换掉google地图。定位、电子围栏、导航均采用高德地图

songchengcheng 11 months ago
parent
commit
78e59b8cbd

+ 4 - 2
app/build.gradle

@@ -17,10 +17,10 @@ android {
     defaultConfig {
         applicationId "com.sikey.veryfit"
 //        vectorDrawables.useSupportLibrary = true
-        minSdkVersion 27
+        minSdkVersion 26
         targetSdkVersion 34
         versionCode 16
-        versionName "0.6.11"
+        versionName "0.6.12"
         multiDexEnabled true
         //manifestPlaceholders=[UMENG_CHANNEL_VALUE:name]
     }
@@ -136,6 +136,8 @@ dependencies {
     implementation 'androidx.multidex:multidex:2.0.1'
     implementation fileTree(include: ['*.jar'], dir: 'libs')
     implementation(name: 'crop_image', ext: 'aar')
+    //AMAP
+    implementation(name: 'AMap3DMap_10.0.900_AMapSearch_9.7.3_AMapLocation_6.4.7_20240816', ext: 'aar')
     //compile project(':social_sdk_library_project')
 //    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
     implementation 'com.google.android.material:material:1.9.0'

BIN
app/libs/AMap3DMap_10.0.900_AMapSearch_9.7.3_AMapLocation_6.4.7_20240816.aar


+ 3 - 0
app/proguard-rules.pro

@@ -87,6 +87,9 @@
 -dontwarn com.google.**
 -keep class com.google.** { *;}
 
+-dontwarn com.amap.**
+-keep class com.amap.** { *; }
+
 -dontwarn org.apache.**
 -keep class org.apache.** { *;}
 

+ 7 - 2
app/src/main/java/com/sikey/veryfit/k2/ui/main/NavigationDialogFragment.java

@@ -108,12 +108,17 @@ public class NavigationDialogFragment extends DialogFragment {
                 dismiss();
             }
         });
+        view.findViewById(R.id.lyt_amap).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                JumpToGaode();
+                dismiss();
+            }
+        });
         setDarkStatusIcon(true);
         return view;
     }
 
-
-
     private void JumpToGaode() {
         try {
             //"androidamap://viewMap?sourceApplication=kido&lat=40.047669&lon=116.313082&dev=0"

+ 117 - 73
app/src/main/java/com/sikey/veryfit/ui/avtivity/component/fence/FenceSettingActivity.kt

@@ -5,7 +5,9 @@ import android.content.Intent
 import android.content.pm.PackageManager
 import android.graphics.Point
 import android.location.Location
+import android.location.LocationRequest
 import android.os.Bundle
+import android.os.Handler
 import android.os.Looper
 import android.util.Log
 import android.view.LayoutInflater
@@ -21,34 +23,33 @@ import android.widget.Toast
 import androidx.appcompat.widget.Toolbar
 import androidx.core.app.ActivityCompat
 import androidx.core.content.ContextCompat
+import com.amap.api.maps.AMap
+import com.amap.api.maps.CameraUpdateFactory
+import com.amap.api.maps.SupportMapFragment
+import com.amap.api.maps.model.BitmapDescriptorFactory
+import com.amap.api.maps.model.CameraPosition
+import com.amap.api.maps.model.CircleOptions
+import com.amap.api.maps.model.LatLng
+import com.amap.api.maps.model.LatLngBounds
+import com.amap.api.maps.model.MarkerOptions
+import com.amap.api.location.AMapLocation
+import com.amap.api.location.AMapLocationClient
+import com.amap.api.location.AMapLocationClientOption
+import com.amap.api.location.AMapLocationListener
+import com.amap.api.maps.LocationSource
+import com.amap.api.services.core.LatLonPoint
+import com.amap.api.services.geocoder.GeocodeResult
+import com.amap.api.services.geocoder.GeocodeSearch
+import com.amap.api.services.geocoder.RegeocodeQuery
+import com.amap.api.services.geocoder.RegeocodeResult
 import com.android.volley.toolbox.StringRequest
 import com.github.pengrad.mapscaleview.MapScaleView
 import com.google.android.gms.common.ConnectionResult
 import com.google.android.gms.common.api.GoogleApiClient
 import com.google.android.gms.common.api.Status
-import com.google.android.gms.location.FusedLocationProviderClient
 import com.google.android.gms.location.LocationCallback
-import com.google.android.gms.location.LocationRequest
-import com.google.android.gms.location.LocationResult
-import com.google.android.gms.location.LocationServices
-import com.google.android.gms.maps.CameraUpdateFactory
-import com.google.android.gms.maps.GoogleMap
-import com.google.android.gms.maps.GoogleMap.OnCameraChangeListener
-import com.google.android.gms.maps.GoogleMap.OnCameraIdleListener
-import com.google.android.gms.maps.GoogleMap.OnCameraMoveListener
-import com.google.android.gms.maps.OnMapReadyCallback
-import com.google.android.gms.maps.SupportMapFragment
-import com.google.android.gms.maps.model.BitmapDescriptorFactory
-import com.google.android.gms.maps.model.CameraPosition
-import com.google.android.gms.maps.model.CircleOptions
-import com.google.android.gms.maps.model.LatLng
-import com.google.android.gms.maps.model.LatLngBounds
-import com.google.android.gms.maps.model.MarkerOptions
-import com.google.android.libraries.places.api.Places
-import com.google.android.libraries.places.api.model.Place
-import com.google.android.libraries.places.widget.AutocompleteSupportFragment
-import com.google.android.libraries.places.widget.listener.PlaceSelectionListener
 import com.sikey.veryfit.R
+import com.sikey.veryfit.app.DataManager
 import com.sikey.veryfit.app.DataManager.Companion.instance
 import com.sikey.veryfit.component.helper.FenceHelper
 import com.sikey.veryfit.component.log.Logger
@@ -63,6 +64,7 @@ import com.sikey.veryfit.ui.avtivity.base.BaseNoActionBarActivity
 import com.sikey.veryfit.ui.avtivity.component.left.BabyDetailActivity
 import com.sikey.veryfit.ui.custom.layout.DrawFenceRelativeLayout
 import com.sikey.veryfit.ui.custom.layout.DrawFenceRelativeLayout.OnDrawPolygonListener
+import com.sikey.veryfit.ui.fragment.avatar.ChildInfoPageFragment
 import com.sikey.veryfit.utils.PermissionUtils
 import com.sikey.veryfit.utils.ToastUtils
 import com.tbruyelle.rxpermissions2.RxPermissions
@@ -71,9 +73,8 @@ import org.json.JSONException
 import org.json.JSONObject
 
 class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, OnDrawPolygonListener,
-    OnMapReadyCallback, OnCameraMoveListener, OnCameraIdleListener, OnCameraChangeListener,
-    CompoundButton.OnCheckedChangeListener, GoogleApiClient.ConnectionCallbacks,
-    GoogleApiClient.OnConnectionFailedListener {
+    AMap.OnCameraChangeListener,
+    CompoundButton.OnCheckedChangeListener, GeocodeSearch.OnGeocodeSearchListener {
     private var fenceFillColor = 0
     private var latlngTemp: String? = null
     private var mTvArea: TextView? = null
@@ -91,7 +92,7 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
     private var mFenceType: Int = 1
 
     /////////////////locate related/////////////////
-    private var map: GoogleMap? = null
+    private var map: AMap? = null
     var scaleView: MapScaleView? = null
 
     ///////////////////////////////////////////////
@@ -102,20 +103,34 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
     private var mName: TextView? = null
     private var mBack: ImageView? = null
     private var mRightTv: TextView? = null
-    var mGoogleApiClient: GoogleApiClient? = null
+    //var mGoogleApiClient: GoogleApiClient? = null
     var mLastLocation: Location? = null
     private var needLocate = false
-    internal lateinit var mLocationCallback: LocationCallback
+    //internal lateinit var mLocationCallback: LocationCallback
     internal lateinit var mLocationRequest: LocationRequest
-    internal var mFusedLocationClient: FusedLocationProviderClient? = null
+    //internal var mFusedLocationClient: FusedLocationProviderClient? = null
+    private lateinit var geocodeSearch: GeocodeSearch
+
     private fun initMap() {
         val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
-        mapFragment!!.getMapAsync(this)
+/*      mapFragment!!.getMapAsync(this)
         mGoogleApiClient = GoogleApiClient.Builder(this)
             .addConnectionCallbacks(this)
             .addOnConnectionFailedListener(this)
             .addApi(LocationServices.API)
-            .build()
+            .build()*/
+        map = mapFragment?.getMap()
+        map!!.uiSettings.isMyLocationButtonEnabled = false
+        map!!.setOnMapClickListener { latLng ->
+            drawPolygon(latLng, mDotsFenceInfoBean?.circleRadius ?: DEFAULT_RADIUS, mFenceType)
+            getGeoAdress(latLng)
+        }
+        map!!.setOnCameraChangeListener(this)
+        val cameraPosition = map!!.cameraPosition
+        // need to pass zoom and latitude
+        scaleView!!.update(cameraPosition.zoom, cameraPosition.target.latitude)
+        initData()
+        refreshMapZoom()
     }
 
     private fun initView() {
@@ -170,7 +185,7 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
     }
 
     fun initSearchLayout() {
-        if (!Places.isInitialized()) {
+/*        if (!Places.isInitialized()) {
             Places.initialize(applicationContext, getString(R.string.google_maps_key))
         }
         val autocompleteFragment =
@@ -195,7 +210,7 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
             override fun onError(status: Status) {
                 Log.i(TAG, "An error occurred: $status")
             }
-        })
+        })*/
     }
 
     override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) {
@@ -332,7 +347,7 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
         }
 
     private fun updateMap(bounds: LatLngBounds) {
-        map!!.setLatLngBoundsForCameraTarget(bounds)
+        //map!!.setMapStatusLimits(bounds)
     }
 
     private fun getChildLocation(beanList: List<ChildInfo>?): LatLng? {
@@ -358,23 +373,26 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
 
     private fun drawPolygon(center: LatLng?, radiu: Int, fenceType:Int) {
         map!!.clear()
-        mDotsFenceInfoBean?.lat = center?.latitude ?: 200.0
-        mDotsFenceInfoBean?.lng = center?.longitude ?: 200.0
-        val circle = map!!.addCircle(
-            CircleOptions().center(center!!)
-                .radius(radiu.toDouble())
-                .strokeColor(fenceFillColor)
-                .fillColor(fenceFillColor)
-        )
-        val view: View = if (fenceType == 1) {
-            LayoutInflater.from(this).inflate(R.layout.fence_safe_layout, null)
-        } else {
-            LayoutInflater.from(this).inflate(R.layout.fence_danger_layout, null)
-        }
-        val descriptor = BitmapDescriptorFactory.fromBitmap(BitmapUtils.getBitmapFromView(view))
-        val option = MarkerOptions().position(center).icon(descriptor)
-            .zIndex(1f).draggable(false)
-        val marker = map!!.addMarker(option)
+        Handler(Looper.getMainLooper()).postDelayed({
+            mDotsFenceInfoBean?.lat = center?.latitude ?: 200.0
+            mDotsFenceInfoBean?.lng = center?.longitude ?: 200.0
+            val circle = map!!.addCircle(
+                CircleOptions().center(center!!)
+                    .radius(radiu.toDouble())
+                    .strokeColor(fenceFillColor)
+                    .fillColor(fenceFillColor)
+            )
+
+            val view: View = if (fenceType == 1) {
+                LayoutInflater.from(this).inflate(R.layout.fence_safe_layout, null)
+            } else {
+                LayoutInflater.from(this).inflate(R.layout.fence_danger_layout, null)
+            }
+            val descriptor = BitmapDescriptorFactory.fromBitmap(BitmapUtils.getBitmapFromView(view))
+            val option = MarkerOptions().position(center).icon(descriptor)
+                .zIndex(1f).draggable(false)
+            val marker = map!!.addMarker(option)
+        }, 200)
     }
 
     private fun drawPolygon() {
@@ -384,6 +402,7 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
                 mDotsFenceInfoBean!!.lng
             )
             animateMapStatus(tempLatLng)
+            map?.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(mDotsFenceInfoBean!!.lat, mDotsFenceInfoBean!!.lng), 15f))
             drawPolygon(
                 tempLatLng,
                 mDotsFenceInfoBean?.circleRadius ?: DEFAULT_RADIUS,
@@ -447,10 +466,14 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
             drawPolygon(DEFAULT_RADIUS)
         } else {
             needLocate = true
+            val tempLatLng = getChildLocation(instance.childTrackInfos)
+            Logger.d(TAG, "initData latitude:$tempLatLng?.latitude, longitude:$tempLatLng?.longitude")
+            map?.moveCamera(CameraUpdateFactory.newLatLngZoom(tempLatLng, 15f))
+            map?.addMarker(MarkerOptions().position(tempLatLng))
         }
     }
 
-    private fun getGeoAdress(latLng: LatLng) {
+/*    private fun getGeoAdress(latLng: LatLng) {
         val latlngStr = latLng.latitude.toString() + "," + latLng.longitude
         Logger.d(TAG, "getGeoAdress -- $latlngStr")
         if (latlngStr != null && latlngStr == latlngTemp) {
@@ -488,8 +511,40 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
             /* ToastUtils.showLongToast(R.string.network_exception) */
         }
         RequestManager.getInstance(this).addToRequestQueue(request)
+    }*/
+
+    private fun getGeoAdress(latLng: LatLng) {
+        val latlngStr = latLng.latitude.toString() + "," + latLng.longitude
+        Logger.d(TAG, "getAddressFromLocation -- $latlngStr")
+        if (latlngStr != null && latlngStr == latlngTemp) {
+            return
+        }
+        Logger.d(TAG, "getAddressFromLocation")
+        geocodeSearch = GeocodeSearch(applicationContext)
+        geocodeSearch?.setOnGeocodeSearchListener(this)
+        val latLonPoint = latLng.latitude.toString()?.let {
+            latLng.longitude.toString()?.let { it1 ->
+                LatLonPoint(
+                    it.toDouble(), it1.toDouble())
+            }
+        }
+        latlngTemp = latlngStr
+        val query = RegeocodeQuery(latLonPoint, 200f, GeocodeSearch.AMAP)
+        geocodeSearch?.getFromLocationAsyn(query)
+    }
+
+    override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) {
+        Logger.d(TAG, "onRegeocodeSearched")
+        if (rCode == 1000 && result != null) {
+            Logger.d(TAG, "onRegeocodeSearched successfully")
+            val address = result.regeocodeAddress
+            mDotsFenceInfoBean?.fenceLocation = address?.formatAddress
+        }
     }
 
+    override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) {
+        // This method is not used for reverse geocoding
+    }
 
     override fun onDrawPolygon(pointList: List<Point>) {
         Logger.d(TAG, "onDrawPolygon,pointList.size():" + pointList.size)
@@ -500,12 +555,12 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
 
     override fun onStart() {
         //startToLocate();
-        mGoogleApiClient!!.connect()
+        //mGoogleApiClient!!.connect()
         super.onStart()
     }
 
     override fun onStop() {
-        mGoogleApiClient!!.disconnect()
+        //mGoogleApiClient!!.disconnect()
         super.onStop()
     }
 
@@ -520,33 +575,21 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
         scaleView!!.update(cameraPosition.zoom, cameraPosition.target.latitude)
     }
 
-    override fun onCameraIdle() {
-        val cameraPosition = map!!.cameraPosition
+    override fun onCameraChangeFinish(cameraPosition: CameraPosition) {
         scaleView!!.update(cameraPosition.zoom, cameraPosition.target.latitude)
     }
 
-    override fun onCameraMove() {
+/*
+    override fun onCameraIdle() {
         val cameraPosition = map!!.cameraPosition
         scaleView!!.update(cameraPosition.zoom, cameraPosition.target.latitude)
     }
 
-    override fun onMapReady(googleMap: GoogleMap) {
-        map = googleMap
-        //        enableMyLocation();
-        map!!.uiSettings.isMyLocationButtonEnabled = false
-        map!!.setOnMapClickListener { latLng ->
-            drawPolygon(latLng, mDotsFenceInfoBean?.circleRadius ?: DEFAULT_RADIUS, mFenceType)
-            getGeoAdress(latLng)
-        }
-        googleMap.setOnCameraMoveListener(this)
-        googleMap.setOnCameraIdleListener(this)
-        googleMap.setOnCameraChangeListener(this)
+    override fun onCameraMove() {
         val cameraPosition = map!!.cameraPosition
-        // need to pass zoom and latitude
         scaleView!!.update(cameraPosition.zoom, cameraPosition.target.latitude)
-        initData()
-        refreshMapZoom()
     }
+*/
 
     /**
      * Enables the My Location layer if the fine location permission has been granted.
@@ -573,7 +616,7 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
         map!!.animateCamera(CameraUpdateFactory.newCameraPosition(position))
     }
 
-    override fun onConnected(bundle: Bundle?) {
+/*    override fun onConnected(bundle: Bundle?) {
         if (ActivityCompat.checkSelfPermission(
                 this,
                 Manifest.permission.ACCESS_FINE_LOCATION
@@ -611,6 +654,7 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
             Toast.LENGTH_SHORT
         ).show()
     }
+*/
 
     companion object {
         private val TAG = FenceSettingActivity::class.java.simpleName
@@ -623,7 +667,7 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
     }
 
     private fun requestSelfLocation() {
-        mLocationRequest = LocationRequest()
+/*        mLocationRequest = LocationRequest()
         mLocationRequest.interval = 1000
         mLocationRequest.fastestInterval = 1000
         mLocationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
@@ -656,6 +700,6 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
                 mLocationCallback,
                 Looper.myLooper()
             )
-        }
+        }*/
     }
 }

+ 456 - 0
app/src/main/java/com/sikey/veryfit/ui/avtivity/main/AMapFragment.kt

@@ -0,0 +1,456 @@
+package com.sikey.veryfit.ui.avtivity.main
+
+import android.Manifest
+import android.content.pm.PackageManager
+import android.graphics.Bitmap
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.core.app.ActivityCompat
+import androidx.fragment.app.Fragment
+import com.amap.api.location.AMapLocation
+import com.amap.api.location.AMapLocationClient
+import com.amap.api.location.AMapLocationClientOption
+import com.amap.api.location.AMapLocationListener
+import com.amap.api.maps.AMap
+import com.amap.api.maps.MapView
+import com.amap.api.maps.CameraUpdateFactory
+import com.amap.api.maps.CameraUpdateFactory.newLatLngBounds
+import com.amap.api.maps.model.BitmapDescriptorFactory
+import com.amap.api.maps.model.Circle
+import com.amap.api.maps.model.LatLng
+import com.amap.api.maps.model.LatLngBounds
+import com.amap.api.maps.model.Marker
+import com.amap.api.maps.model.MarkerOptions
+import com.nostra13.universalimageloader.core.DisplayImageOptions
+import com.nostra13.universalimageloader.core.assist.ImageScaleType
+import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer
+import com.sikey.veryfit.R
+import com.sikey.veryfit.app.DataManager
+import com.sikey.veryfit.component.designpattern.observerpattern.datamanager.IAvatarObserver
+import com.sikey.veryfit.component.log.Logger
+import com.sikey.veryfit.component.network.http.model.ChildInfo
+import com.sikey.veryfit.component.VersionMatch.VersionMatch
+import com.sikey.veryfit.constant.RoleTypeConstants
+import com.sikey.veryfit.data.DiskCacheControllerImpl
+import com.sikey.veryfit.k2.utils.BitmapUtils
+import com.sikey.veryfit.ui.adapter.ChildInfoAdapter
+import com.sikey.veryfit.ui.custom.menu.satellite.CustomSatelliteMenu
+import com.sikey.veryfit.utils.BitmapTools
+
+class AMapFragment : Fragment(), AMap.OnMarkerClickListener, IAvatarObserver {
+
+    private val TAG = AMapFragment::class.java.simpleName
+    private lateinit var mapView: MapView
+    //private lateinit var locationClient: AMapLocationClient
+    private val mAvatarItems: MutableList<AvatarItem> = ArrayList()
+    private lateinit var map: AMap
+    private val circle: Circle? = null
+    private val mOverlayOptionList: MutableList<MarkerOptions> = ArrayList()
+
+    override fun onCreateView(
+    inflater: LayoutInflater, container: ViewGroup?,
+    savedInstanceState: Bundle?
+    ): View? {
+    val view = inflater.inflate(R.layout.child_track_amap_layout, container, false)
+
+    // Update privacy policy settings before using the SDK
+    AMapLocationClient.updatePrivacyShow(requireContext(), true, true)
+    AMapLocationClient.updatePrivacyAgree(requireContext(), true)
+
+    mapView = view.findViewById(R.id.mapView)
+    mapView.onCreate(savedInstanceState)
+    map = mapView.map
+
+    // Initialize AMap settings and then start
+    initLocation()
+
+    return view
+    }
+
+    private fun initLocation() {
+/*        locationClient = AMapLocationClient(requireContext())
+        val locationOption = AMapLocationClientOption()
+        locationOption.apply {
+            setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy)
+            isNeedAddress = true
+            interval = 2000
+            setOnceLocation(true)
+        }
+        locationClient.setLocationOption(locationOption)
+        locationClient.setLocationListener(this)
+
+        // Request positioning permission
+        if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
+            ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 100)
+        } else {
+            Logger.d(TAG, "Start positioning...")
+            locationClient.startLocation()
+        }*/
+        DataManager.instance.currentChildInfo = DataManager.instance.childTrackInfos?.get(0)
+        animateToChosenChildPos()
+    }
+
+    fun setMap(map: AMap) {
+        this.map = map
+    }
+
+/*    override fun onLocationChanged(location: AMapLocation?) {
+        location?.let {
+            if (it.errorCode == 0) {
+                // Positioning successfully, update map position
+                val latLng = LatLng(it.latitude, it.longitude)
+                //map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f))
+                //map.addMarker(MarkerOptions().position(latLng))
+                Logger.d(TAG, "Positioning successfully: ${it.latitude} ${it.longitude}")
+            } else {
+                // Failed to positioning
+                Logger.e(TAG, "Failed to positioning: ${it.errorInfo}")
+            }
+        }
+    }*/
+
+    override fun onMarkerClick(marker: Marker): Boolean {
+        Logger.d(TAG, "onMarkerClick")
+        val item = clickedAvatarItem(marker)
+        Logger.d(TAG, "clicked an item$item")
+        if (null != item) {
+            Logger.d(TAG, "clicked an marker")
+            //showPopupWindow();
+            DataManager.instance.currentChildInfo = item.info
+            animateToChosenChildPos()
+            return true
+        }
+        return true
+    }
+
+    private fun clickedAvatarItem(marker: Marker): AvatarItem? {
+        var clickedItem: AvatarItem? = null
+        for (item in mAvatarItems) {
+            if (marker == item.marker) {
+                clickedItem = item
+            }
+        }
+        return clickedItem
+    }
+
+    fun setChildTrackInfos(items: List<ChildInfo>?) {
+        Logger.d(TAG, "setChildTrackInfos")
+        //clear first
+        if (map != null) map!!.clear()
+        mAvatarItems.clear()
+        if (null == items || items.isEmpty()) {
+            return
+        }
+        mOverlayOptionList.clear()
+        for (info in items) {
+            if(info.roleType >= RoleTypeConstants.FAMILY) {
+                var lat = info.device.location?.lat ?: "0.0"
+                if (lat.isEmpty()) lat = "0.0"
+                var lng = info.device.location?.lng ?: "0.0"
+                if (lng.isEmpty()) lng = "0.0"
+                val latitude = getCheckedLatitude(lat.toDouble())
+                val longitude = getCheckedLongitude(lng.toDouble())
+                Logger.d(TAG, "latitude = $latitude,longitude = $longitude")
+                val layerIndex: Int = if (info == DataManager.instance.currentChildInfo) {
+                    CustomMapFragment.INIT_LAYER_INDEX + 1
+                } else {
+                    CustomMapFragment.INIT_LAYER_INDEX
+                }
+                addSingleMarker(info, layerIndex)
+            }
+        }
+        addCircle()
+        animateToChosenChildPos()
+    }
+
+    private fun addCircle() {
+        if (map != null) {
+            val (avatar, device, id, name, internationalAreaCode, phoneNumber, roleType) = DataManager.instance.currentChildInfo
+                ?: return
+        }
+    }
+
+    private fun getCheckedLatitude(sourceLatitude: Double): Double {
+        Logger.d(TAG, "source latitude:$sourceLatitude")
+        return if (sourceLatitude > 0 && sourceLatitude < 90) {
+            sourceLatitude
+        } else 0.0
+    }
+
+    private fun getCheckedLongitude(sourceLongitude: Double): Double {
+        Logger.d(TAG, "source longtitude:$sourceLongitude")
+        return if (sourceLongitude > 0 && sourceLongitude < 180) {
+            sourceLongitude
+        } else 0.0
+    }
+
+    private fun refreshzIndexForMarkers() {
+        val (avatar, device, id, name, internationalAreaCode, phoneNumber, roleType) = DataManager.instance.currentChildInfo
+            ?: return
+        for (item in mAvatarItems) {
+            val childTrackView =
+                LayoutInflater.from(context).inflate(R.layout.child_track_layout, null)
+            val status = childTrackView.findViewById<View>(R.id.tv_status) as TextView
+        }
+    }
+
+    //we return the child that user just chosen
+    private val currentChildPos: LatLng?
+        private get() {
+            //we return the child that user just chosen
+            val (_,_, device) = DataManager.instance.currentChildInfo ?: return null
+            var lat = device.location?.lat?:"0.0"
+            if (lat.isEmpty()) lat = "0.0"
+            var lng = device.location?.lng?:"0.0"
+            if (lng.isEmpty()) lng = "0.0"
+            return LatLng(lat.toDouble(), lng.toDouble())
+        }
+
+    fun animateToChosenChildPos() {
+        Logger.d(TAG, "animateToChosenChildPos")
+        if (map == null) {
+            return
+        }
+        val (_,_, device) = DataManager.instance.currentChildInfo ?: return
+        //first,let current child on the higher layer index
+        refreshzIndexForMarkers()
+        //refreshCurrentOverlayOption();
+        //then let the map move to proper position
+        val position = currentChildPos
+        var radius = device.location?.acc?:"0".toInt()
+        if (radius < 61) {
+            radius = 61
+        }
+        if (circle == null) {
+            addCircle()
+        } else {
+            assert(position != null)
+            circle.center = position!!
+            circle.radius = radius.toDouble()
+        }
+        var zoom = 17
+        if (radius > 800) {
+            zoom = 14
+        } else if (radius > 500) {
+            zoom = 15
+        } else if (radius > 100) {
+            zoom = 16
+        }
+        assert(position != null)
+        Logger.d(TAG, "animateToChosenChildPos2")
+        map!!.moveCamera(CameraUpdateFactory.newLatLngZoom(position!!, zoom.toFloat()))
+        map!!.addMarker(MarkerOptions().position(position!!))
+    }
+
+    private fun addSingleMarker(info: ChildInfo, layerIndex: Int) {
+        val childTrackView = LayoutInflater.from(context).inflate(R.layout.child_track_layout, null)
+        val status = childTrackView.findViewById<View>(R.id.tv_status) as TextView
+        val avatarImageView: ImageView
+        if (CustomMapFragment.INIT_LAYER_INDEX != layerIndex) {
+            childTrackView.findViewById<View>(R.id.lyt_select).visibility =
+                View.VISIBLE
+            childTrackView.findViewById<View>(R.id.lyt_unselect).visibility =
+                View.GONE
+            avatarImageView =
+                childTrackView.findViewById<View>(R.id.select_avatarImageView) as ImageView
+        } else {
+            childTrackView.findViewById<View>(R.id.lyt_select).visibility = View.GONE
+            childTrackView.findViewById<View>(R.id.lyt_unselect).visibility = View.VISIBLE
+            avatarImageView = childTrackView.findViewById<View>(R.id.avatarImageView) as ImageView
+        }
+        Logger.d(TAG, "info.getImageUrl()22222=" + info.avatar)
+        if (info.avatar.isNotEmpty()) {
+            Logger.d(TAG, "info.getImageUrl()=" + info.avatar)
+            avatarImageView.apply {
+                val option = DisplayImageOptions.Builder()
+                    .showImageForEmptyUri(R.drawable.default_guardian_avatar)
+                    .showImageOnFail(R.drawable.default_guardian_avatar)
+                    .resetViewBeforeLoading()
+                    .cacheOnDisc()
+                    .imageScaleType(ImageScaleType.EXACTLY)
+                    .bitmapConfig(Bitmap.Config.RGB_565)
+                    .displayer(FadeInBitmapDisplayer(300))
+                    .build()
+                ChildInfoAdapter.fetchDataByImageLoader(
+                    option,
+                    this,
+                    info.avatar,
+                    false
+                )
+            }
+            val avatarCache = DiskCacheControllerImpl.getInstance()[info.avatar]//instance.getAvatar(info.avatar)
+            if (null != avatarCache) {
+                Logger.d(TAG, "use bitmap cache")
+                avatarImageView.setImageBitmap(BitmapTools.toCircleBitmap(avatarCache))
+            }
+        }
+
+        addMarker(childTrackView, toLatLng(info), layerIndex, info)
+    }
+
+    private fun toLatLng(info: ChildInfo): LatLng {
+        return LatLng(
+            getDecodeLat(info.device.location?.lat ?: "0.0"),
+            getDecodeLng(info.device.location?.lng ?: "0.0")
+        )
+
+    }
+
+    private fun getDecodeLat(lat: String): Double {
+//        val str: String = String(Base64.decode(lat, Base64.DEFAULT))
+        return lat.let {
+            if (
+                it.isEmpty()
+            ) 0.0
+            else
+                it.toDouble()
+        }
+    }
+
+    private fun getDecodeLng(lng: String): Double {
+//        val str: String = String(Base64.decode(lng, Base64.DEFAULT))
+        return lng.let {
+            if (
+                it.isEmpty()
+            ) 0.0
+            else
+                it.toDouble()
+        }
+    }
+
+    private fun addMarker(childTrackView: View?, latLng: LatLng, layerIndex: Int, info: ChildInfo) {
+        if (null == childTrackView) {
+            Logger.d(TAG, "childTrackView is null")
+            return
+        }
+        val descriptor =
+            BitmapDescriptorFactory.fromBitmap(BitmapUtils.getBitmapFromView(childTrackView))
+        Logger.d(TAG, "source latlng,lat:" + latLng.latitude + ",lng:" + latLng.longitude)
+        val option = MarkerOptions().position(latLng).icon(descriptor)
+            .zIndex(layerIndex.toFloat()).draggable(false)
+        mOverlayOptionList.add(option)
+        val marker = map?.addMarker(option)
+        ///////////////////////////////////
+        val item = AvatarItem()
+        item.marker = marker
+        item.info = info
+        item.convertedLatLng = latLng
+        item.childInfoView = childTrackView
+        mAvatarItems.add(item)
+        /////////////////////////////////////
+    }
+
+    override fun updateAvatar(imageUrl: String, circleBitmap: Bitmap) {
+        Logger.d(TAG, "updateAvatar,imageUrl=$imageUrl")
+        for (item in mAvatarItems) {
+            val info = item.info
+            info!!.avatar
+            if (info.avatar != imageUrl) {
+                continue
+            } else if (context != null) {
+                val childTrackView =
+                    LayoutInflater.from(context).inflate(R.layout.child_track_layout, null)
+                val status = childTrackView.findViewById<View>(R.id.tv_status) as TextView
+                /*                if(info.getMotionState()==1){
+                    status.setText(R.string.watch_move);
+                }else {
+                    status.setText(R.string.watch_stop);
+                }*/Logger.d(
+                    TAG,
+                    "VersionMatch.checkwalkStatus(item.info)=" + VersionMatch.checkwalkStatus(info) + "==info=" + info
+                )
+                /*                if(VersionMatch.checkwalkStatus(info)&&info.isTraceUploadSwitch()){
+                    status.setVisibility(View.VISIBLE);
+                }else {
+                    status.setVisibility(View.GONE);
+                }*/
+                val avatarImageView =
+                    childTrackView.findViewById<View>(R.id.avatarImageView) as ImageView
+                avatarImageView.setImageBitmap(circleBitmap)
+                item.marker!!.setIcon(
+                    BitmapDescriptorFactory.fromBitmap(
+                        BitmapUtils.getBitmapFromView(
+                            childTrackView
+                        )
+                    )
+                )
+                item.avatarView = avatarImageView
+                break
+            }
+        }
+    }
+
+    fun zoomToSpan() {
+        var minX = 0.0
+        var maxX = 0.0
+        var minY = 0.0
+        var maxY = 0.0
+        for (i in mAvatarItems.indices) {
+            //LatLng latLng=getConvertedLatLng(mAvatarItems.get(i).info.toLatLng());
+            val latLng = mAvatarItems[i].convertedLatLng
+            if (i == 0) {
+                minX = latLng!!.latitude
+                maxX = minX
+                minY = latLng.longitude
+                maxY = minY
+            } else {
+                if (latLng!!.latitude < minX) {
+                    minX = latLng.latitude
+                }
+                if (latLng.latitude > maxX) {
+                    maxX = latLng.latitude
+                }
+                if (latLng.longitude < minY) {
+                    minY = latLng.longitude
+                }
+                if (latLng.longitude > maxY) {
+                    maxY = latLng.longitude
+                }
+            }
+        }
+        val southWest = LatLng(minX, minY)
+        val earthEast = LatLng(maxX, maxY)
+        val bounds = LatLngBounds(southWest, earthEast)
+        //100是LatLngBounds与地图边缘100像素的填充区域
+        map!!.animateCamera(newLatLngBounds(bounds, 100))
+    }
+
+    override fun onDestroyView() {
+        Logger.d(TAG, "AMAP onDestroy")
+        super.onDestroyView()
+        //locationClient.stopLocation()
+        // Release map resources
+        mapView.onDestroy()
+    }
+
+    override fun onResume() {
+        Logger.d(TAG, "AMAP onResume")
+        super.onResume()
+        mapView.onResume()
+    }
+
+    override fun onPause() {
+        Logger.d(TAG, "AMAP onPause")
+        super.onPause()
+        mapView.onPause()
+    }
+
+    override fun onLowMemory() {
+        Logger.d(TAG, "AMAP onLowMemory")
+        super.onLowMemory()
+        mapView.onLowMemory()
+    }
+
+    private class AvatarItem {
+        var marker: Marker? = null
+        var avatarView: ImageView? = null
+        private val customMenu: CustomSatelliteMenu? = null
+        var info: ChildInfo? = null
+        var convertedLatLng: LatLng? = null
+        var childInfoView: View? = null
+    }
+}

+ 41 - 3
app/src/main/java/com/sikey/veryfit/ui/fragment/avatar/ChildInfoPageFragment.kt

@@ -9,6 +9,7 @@ import android.widget.Button
 import android.widget.ImageView
 import android.widget.TextView
 import androidx.fragment.app.Fragment
+import com.amap.api.services.core.LatLonPoint
 import com.android.volley.toolbox.StringRequest
 import com.sikey.veryfit.R
 import com.sikey.veryfit.app.DataManager
@@ -27,10 +28,15 @@ import com.sikey.veryfit.utils.ResUtils
 import org.json.JSONArray
 import org.json.JSONException
 import org.json.JSONObject
+import com.amap.api.services.geocoder.GeocodeSearch
+import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener
+import com.amap.api.services.geocoder.RegeocodeResult
+import com.amap.api.services.geocoder.GeocodeResult
+import com.amap.api.services.geocoder.RegeocodeQuery
 
 /**
  */
-class ChildInfoPageFragment : Fragment() {
+class ChildInfoPageFragment : Fragment(), OnGeocodeSearchListener {
     private var mDirection: TextView? = null
     private var mAdress: TextView? = null
     private var mTime: TextView? = null
@@ -44,6 +50,7 @@ class ChildInfoPageFragment : Fragment() {
     private var mAdressStr: String? = null
     private var mChildTrackInfo: ChildInfo? = null
     private var mLocationType: ImageView? = null
+    private lateinit var geocodeSearch: GeocodeSearch
 
     fun setOnBtnClickListener(listener: OnBtnClickListener?) {
         mOnBtnClickListener = listener
@@ -188,7 +195,7 @@ class ChildInfoPageFragment : Fragment() {
         }
     }
 
-    private fun getGeoAdress(info: ChildInfo?) {
+/*    private fun getGeoAdress(info: ChildInfo?) {
         Logger.d(TAG, "getGeoAdress")
         val latlng = info!!.device.location?.lat + "," + info.device.location?.lng
         Log.d(TAG, "latlng=$latlng==latlngTemp=$latlngTemp")
@@ -234,9 +241,40 @@ class ChildInfoPageFragment : Fragment() {
                 }
             }) { error ->
             Logger.i(TAG, "add err==" + error.message)
-            /* ToastUtils.showLongToast(R.string.network_exception) */
+            *//* ToastUtils.showLongToast(R.string.network_exception) *//*
         }
         RequestManager.getInstance(requireContext().applicationContext).addToRequestQueue(request)
+    }*/
+
+    private fun getGeoAdress(info: ChildInfo?) {
+        Logger.d(TAG, "getAddressFromLocation")
+        geocodeSearch = GeocodeSearch(context)
+        geocodeSearch?.setOnGeocodeSearchListener(this)
+        val latLonPoint = info!!.device.location?.lat?.let {
+            info.device.location?.lng?.let { it1 ->
+                LatLonPoint(
+                    it.toDouble(), it1.toDouble())
+            }
+        }
+        val query = RegeocodeQuery(latLonPoint, 200f, GeocodeSearch.AMAP)
+        geocodeSearch?.getFromLocationAsyn(query)
+
+        setTypeIcon(info)
+    }
+
+    override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) {
+        if (rCode == 1000 && result != null) {
+            val address = result.regeocodeAddress
+            mAdress!!.text = address.formatAddress
+            mDirection!!.text = address.formatAddress
+        } else {
+            mAdress!!.text = "No address found"
+            mDirection!!.text = "No address found"
+        }
+    }
+
+    override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) {
+        // This method is not used for reverse geocoding
     }
 
     interface OnBtnClickListener {

+ 13 - 25
app/src/main/java/com/sikey/veryfit/ui/fragment/main/LocationFragment.kt

@@ -28,13 +28,12 @@ import android.widget.TextView
 import androidx.appcompat.content.res.AppCompatResources
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.lifecycleScope
+import com.amap.api.maps.AMap
+import com.amap.api.maps.model.CameraPosition
 import com.android.volley.Request
 import com.android.volley.Response
 import com.android.volley.toolbox.JsonObjectRequest
 import com.github.pengrad.mapscaleview.MapScaleView
-import com.google.android.gms.maps.GoogleMap
-import com.google.android.gms.maps.OnMapReadyCallback
-import com.google.android.gms.maps.model.CameraPosition
 import com.google.gson.Gson
 import com.sikey.veryfit.R
 import com.sikey.veryfit.app.DataManager
@@ -71,7 +70,7 @@ import com.sikey.veryfit.ui.adapter.ChildInfoPageAdapter
 import com.sikey.veryfit.ui.avtivity.base.BaseNoActionBarActivity
 import com.sikey.veryfit.ui.avtivity.component.right.BabyListActivity
 import com.sikey.veryfit.ui.avtivity.component.right.ScanQRCodeActivity
-import com.sikey.veryfit.ui.avtivity.main.CustomMapFragment
+import com.sikey.veryfit.ui.avtivity.main.AMapFragment
 import com.sikey.veryfit.ui.avtivity.main.DispatchActivity
 import com.sikey.veryfit.ui.custom.widget.viewpager.MultiViewPager
 import com.sikey.veryfit.ui.custom.widget.viewpager.ZoomOutSlideTransformer
@@ -94,17 +93,14 @@ import java.util.Date
  * Created by bruce on 2017/11/22.
  */
 class LocationFragment : Fragment(), ICurrentChildObserver, View.OnClickListener,
-    Listener.LocationListener,
-    OnMapReadyCallback, GoogleMap.OnCameraMoveListener, GoogleMap.OnCameraIdleListener,
-    GoogleMap.OnCameraChangeListener {
-
+    Listener.LocationListener, AMap.OnCameraChangeListener {
 
     private val TAG = LocationFragment::class.java.simpleName
 
-    private var mapFragment: CustomMapFragment? = null
+    private var mapFragment: AMapFragment? = null
     private var mNoMapLayout: FrameLayout? = null
     private var mImgNoMap: ImageView? = null
-    private var mMap: GoogleMap? = null
+    private var mMap: AMap? = null
     internal var scaleView: MapScaleView? = null
     private var mMultiViewPager: MultiViewPager? = null
     private var mAdapter: ChildInfoPageAdapter? = null
@@ -370,8 +366,8 @@ class LocationFragment : Fragment(), ICurrentChildObserver, View.OnClickListener
     ): View {
         Logger.d(TAG, "onCreateView")
         val root = inflater.inflate(R.layout.fragment_location, container, false) as View
-        mapFragment = childFragmentManager.findFragmentById(R.id.map) as CustomMapFragment?
-        mapFragment?.getMapAsync(this)
+        mapFragment = childFragmentManager.findFragmentById(R.id.map) as AMapFragment?
+        //mapFragment?.getMapAsync(this)
 
         mNoMapLayout = root.findViewById(R.id.lyt_no_map)
         mImgNoMap = root.findViewById(R.id.img_no_map)
@@ -1253,28 +1249,20 @@ class LocationFragment : Fragment(), ICurrentChildObserver, View.OnClickListener
         }
     }
 
-    override fun onMapReady(p0: GoogleMap) {
+/*    override fun onMapReady(p0: AMap) {
         mMap = p0
-        p0.setOnCameraMoveListener(this)
-        p0.setOnCameraIdleListener(this)
         p0.setOnCameraChangeListener(this)
         val cameraPosition = mMap?.cameraPosition
         // need to pass zoom and latitude
         scaleView?.update(cameraPosition!!.zoom, cameraPosition.target.latitude)
-        mMap?.setOnMarkerClickListener(mapFragment)
+        mMap?.setOnMarkerClickListener(this)
         mapFragment?.setMap(p0)
         mapFragment?.setChildTrackInfos(DataManager.instance.childTrackInfos)
         mapFragment?.let { DataManager.instance.registerAvatarObserver(it) }
-    }
+    }*/
 
-    override fun onCameraMove() {
-        val cameraPosition = mMap?.cameraPosition
-        scaleView?.update(cameraPosition!!.zoom, cameraPosition.target.latitude)
-    }
-
-    override fun onCameraIdle() {
-        val cameraPosition = mMap?.cameraPosition
-        scaleView?.update(cameraPosition!!.zoom, cameraPosition.target.latitude)
+    override fun onCameraChangeFinish(p0: CameraPosition) {
+        scaleView?.update(p0.zoom, p0.target.latitude)
     }
 
     override fun onCameraChange(p0: CameraPosition) {

+ 1 - 1
app/src/main/res/layout/activity_fence_setting.xml

@@ -43,7 +43,7 @@
             android:id="@+id/map"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            class="com.google.android.gms.maps.SupportMapFragment" />
+            class="com.amap.api.maps.SupportMapFragment" />
 
         <ImageView
             android:id="@+id/showFenceImageView"

+ 11 - 0
app/src/main/res/layout/child_track_amap_layout.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <com.amap.api.maps.MapView
+        android:id="@+id/mapView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</FrameLayout>

+ 6 - 1
app/src/main/res/layout/fragment_location.xml

@@ -20,9 +20,14 @@
 
         <fragment
             android:id="@+id/map"
-            class="com.sikey.veryfit.ui.avtivity.main.CustomMapFragment"
+            class="com.sikey.veryfit.ui.avtivity.main.AMapFragment"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
+<!--        <fragment
+            android:id="@+id/map"
+            class="com.sikey.veryfit.ui.avtivity.main.CustomMapFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />-->
 
         <FrameLayout
             android:id="@+id/lyt_no_map"

+ 19 - 2
app/src/main/res/layout/fragment_navigation_dialog.xml

@@ -8,7 +8,7 @@
     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="56dp"
-        android:layout_above="@+id/lyt_googlemap"
+        android:layout_above="@+id/lyt_amap"
         android:id="@+id/lyt_title">
         <TextView
             android:layout_width="match_parent"
@@ -28,7 +28,8 @@
         android:layout_height="48dp"
         android:layout_alignParentBottom="true"
         android:background="?android:attr/selectableItemBackground"
-        android:id="@+id/lyt_googlemap">
+        android:id="@+id/lyt_googlemap"
+        android:visibility="gone">
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
@@ -40,5 +41,21 @@
 
     </RelativeLayout>
 
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="48dp"
+        android:layout_alignParentBottom="true"
+        android:background="?android:attr/selectableItemBackground"
+        android:id="@+id/lyt_amap">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="16dp"
+            android:layout_centerVertical="true"
+            android:textSize="@dimen/text_size_medium"
+            android:textColor="@color/gray_60"
+            android:text="@string/map_amap"/>
+
+    </RelativeLayout>
 
 </RelativeLayout>

+ 2 - 1
app/src/main/res/values-de/strings.xml

@@ -442,7 +442,8 @@
     <string name="wake_up_content">Steige auf und scheine</string>
     <string name="sleep_content">Zeit fürs Bett</string>
     <string name="navigate_to_child">Navigieren Sie zur Position des Kindes.</string>
-    <string name="map_googlemap">Google Maps</string>
+    <string name="map_googlemap">AutoNavi-Karte</string>
+    <string name="map_amap">AutoNavi Map</string>
     <string name="map_baidu_err">Keine Baidu-App installiert</string>
     <string name="map_gaode_err">Keine AutoNavi-App installiert</string>
     <string name="map_google_err">Keine Google Maps App installiert</string>

+ 1 - 0
app/src/main/res/values-es/strings.xml

@@ -443,6 +443,7 @@
     <string name="sleep_content">Tempo enlitiĝi</string>
     <string name="navigate_to_child">Navigu al la pozicio de infano.</string>
     <string name="map_googlemap">Google mapoj</string>
+    <string name="map_amap">Mapa de AutoNavi</string>
     <string name="map_baidu_err">Neniu Baidu-apliko instalita</string>
     <string name="map_gaode_err">Neniu AutoNavi App instalita</string>
     <string name="map_google_err">Neniu Google Maps App instalita</string>

+ 1 - 0
app/src/main/res/values-fr/strings.xml

@@ -433,6 +433,7 @@
     <string name="sleep_content">L\'heure de dormir</string>
     <string name="navigate_to_child">Accédez à la position de l\'enfant.</string>
     <string name="map_googlemap">Google Maps</string>
+    <string name="map_amap">Carte AutoNavi</string>
     <string name="map_baidu_err">Aucune application Baidu installée</string>
     <string name="map_gaode_err">Aucune application AutoNavi installée</string>
     <string name="map_google_err">Aucune application Google Maps installée</string>

+ 1 - 0
app/src/main/res/values-it/strings.xml

@@ -487,6 +487,7 @@
     <string name="sleep_content">È ora di andare a letto</string>
     <string name="navigate_to_child">Passare alla posizione del bambino.</string>
     <string name="map_googlemap">Google Maps</string>
+    <string name="map_amap">Mappa AutoNavi</string>
     <string name="map_baidu_err">Nessuna app Baidu installata</string>
     <string name="map_gaode_err">Nessuna app AutoNavi installata</string>
     <string name="map_google_err">Nessuna app Google Maps installata</string>

+ 2 - 1
app/src/main/res/values-zh-rCN/strings.xml

@@ -685,6 +685,7 @@
     <string name="sleep_content">睡觉啦</string>
     <string name="navigate_to_child">导航到宝宝所在的位置</string>
     <string name="map_googlemap">谷歌地图</string>
+    <string name="map_amap">高德地图</string>
     <string name="map_baidu_err">未安装百度地图该功能不可用</string>
     <string name="map_gaode_err">未安装高德地图该功能不可用</string>
     <string name="map_google_err">未安装谷歌地图该功能不可用</string>
@@ -758,7 +759,7 @@
     <string name="message_list">"短信记录"</string>
     <string name="location">"定位"</string>
     <string name="watch_func">"手表功能"</string>
-    <string name="mine">"我的"</string>
+    <string name="mine">"我的测试3"</string>
 
     <string name="call_phone">"拨号"</string>
     <string name="send_msg">"发消息"</string>

+ 1 - 0
app/src/main/res/values-zh-rHK/strings.xml

@@ -686,6 +686,7 @@
     <string name="sleep_content">睡觉啦</string>
     <string name="navigate_to_child">导航到宝宝所在的位置</string>
     <string name="map_googlemap">谷歌地图</string>
+    <string name="map_amap">高德地图</string>
     <string name="map_baidu_err">未安装百度地图该功能不可用</string>
     <string name="map_gaode_err">未安装高德地图该功能不可用</string>
     <string name="map_google_err">未安装谷歌地图该功能不可用</string>

+ 2 - 1
app/src/main/res/values-zh-rTW/strings.xml

@@ -684,6 +684,7 @@
     <string name="sleep_content">睡觉啦</string>
     <string name="navigate_to_child">导航到宝宝所在的位置</string>
     <string name="map_googlemap">谷歌地图</string>
+    <string name="map_amap">高德地图</string>
     <string name="map_baidu_err">未安装百度地图该功能不可用</string>
     <string name="map_gaode_err">未安装高德地图该功能不可用</string>
     <string name="map_google_err">未安装谷歌地图该功能不可用</string>
@@ -889,7 +890,7 @@
     <string name="vpn_mmsc">mmsc</string>
     <string name="vpn_server">server</string>
 
-    
+
     <string name="vpn_setting_hint">未设置</string>
     <string name="vpn_setting_title_of_Fragment">请输入内容</string>
     <string name="vpn_setting_tip_of_apn">请先设置APN</string>

+ 2 - 1
app/src/main/res/values/strings.xml

@@ -717,6 +717,7 @@
     <string name="sleep_content">Time to bed</string>
     <string name="navigate_to_child">Navigate to child\'s position.</string>
     <string name="map_googlemap">Google Maps</string>
+    <string name="map_amap">AutoNavi Map</string>
     <string name="map_baidu_err">No Baidu App installed</string>
     <string name="map_gaode_err">No AutoNavi App installed</string>
     <string name="map_google_err">No Google Maps App installed</string>
@@ -1063,7 +1064,7 @@
     <string name="network_status_3">Fair</string>
     <string name="network_status_4">Good</string>
     <string name="network_status_5">Very good</string>
-    
+
     <string name="at_least_one">Please select at least one item</string>
     <string name="qr_format_error">QR code format error</string>
     <string name="unbind_tips">Please unbind the watches first.</string>