Ver código fonte

高德地图替换为百度地图

songchengcheng 2 semanas atrás
pai
commit
2ceb358411
30 arquivos alterados com 656 adições e 615 exclusões
  1. 5 5
      app/build.gradle
  2. BIN
      app/libs/AMap3DMap_10.0.900_AMapSearch_9.7.3_AMapLocation_6.4.7_20240816.aar
  3. BIN
      app/libs/BaiduLBS_Android_V7.6.5.aar
  4. BIN
      app/libs/arm64-v8a/libBaiduMapSDK_base_v7_6_5.so
  5. BIN
      app/libs/arm64-v8a/libBaiduMapSDK_map_v7_6_5.so
  6. BIN
      app/libs/arm64-v8a/libc++_shared.so
  7. BIN
      app/libs/arm64-v8a/liblocSDK8b.so
  8. BIN
      app/libs/arm64-v8a/libtiny_magic.so
  9. BIN
      app/libs/armeabi-v7a/libBaiduMapSDK_base_v7_6_5.so
  10. BIN
      app/libs/armeabi-v7a/libBaiduMapSDK_map_v7_6_5.so
  11. BIN
      app/libs/armeabi-v7a/libc++_shared.so
  12. BIN
      app/libs/armeabi-v7a/liblocSDK8b.so
  13. BIN
      app/libs/armeabi-v7a/libtiny_magic.so
  14. 4 4
      app/src/main/AndroidManifest.xml
  15. 19 0
      app/src/main/java/com/sikey/interconnect/app/startup/RingApplication.kt
  16. 17 9
      app/src/main/java/com/sikey/interconnect/k2/ui/main/NavigationDialogFragment.java
  17. 263 325
      app/src/main/java/com/sikey/interconnect/ui/avtivity/component/fence/FenceSettingActivity.kt
  18. 119 77
      app/src/main/java/com/sikey/interconnect/ui/avtivity/component/path/MDPathHistoryActivity.kt
  19. 110 110
      app/src/main/java/com/sikey/interconnect/ui/avtivity/main/BaiduMapFragment.kt
  20. 41 33
      app/src/main/java/com/sikey/interconnect/ui/fragment/avatar/ChildInfoPageFragment.kt
  21. 63 34
      app/src/main/java/com/sikey/interconnect/ui/fragment/main/LocationFragment.kt
  22. 3 10
      app/src/main/res/layout/activity_fence_setting.xml
  23. 4 5
      app/src/main/res/layout/activity_mdpath_history.xml
  24. 1 1
      app/src/main/res/layout/baidumap_layout.xml
  25. 1 1
      app/src/main/res/layout/fragment_location.xml
  26. 1 1
      app/src/main/res/layout/fragment_navigation_dialog.xml
  27. 1 0
      app/src/main/res/values-zh-rCN/strings.xml
  28. 1 0
      app/src/main/res/values-zh-rHK/strings.xml
  29. 1 0
      app/src/main/res/values-zh-rTW/strings.xml
  30. 2 0
      app/src/main/res/values/strings.xml

+ 5 - 5
app/build.gradle

@@ -26,7 +26,7 @@ android {
         minSdkVersion 26
         targetSdkVersion 34
         versionCode 1
-        versionName "1.1.28.9"
+        versionName "1.1.28.10"
         multiDexEnabled true
     }
     packagingOptions {
@@ -60,7 +60,7 @@ android {
             //show log
             buildConfigField "boolean", "LOG_DEBUG", "true"
             buildConfigField "String", "VIDEO_CALL_VENDOR", "\"agora\""
-            buildConfigField "boolean", "APP_EXIT_WEBSOCKET_PERSIST", "true"
+            buildConfigField "boolean", "APP_EXIT_WEBSOCKET_PERSIST", "false"
 
             versionNameSuffix ""
             minifyEnabled false
@@ -79,7 +79,7 @@ android {
             //do not show log
             buildConfigField "boolean", "LOG_DEBUG", "false"
             buildConfigField "String", "VIDEO_CALL_VENDOR", "\"agora\""
-            buildConfigField "boolean", "APP_EXIT_WEBSOCKET_PERSIST", "true"
+            buildConfigField "boolean", "APP_EXIT_WEBSOCKET_PERSIST", "false"
             //zipalign optimize
             zipAlignEnabled true
             //remove unused resource files
@@ -155,8 +155,6 @@ 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'
@@ -237,4 +235,6 @@ dependencies {
 
     implementation 'com.github.bumptech.glide:glide:4.16.0'
     implementation 'com.arthenica:mobile-ffmpeg-audio:4.4'
+    // Baidu Map
+    implementation (name: 'BaiduLBS_Android_V7.6.5', ext: 'aar')
 }

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


BIN
app/libs/BaiduLBS_Android_V7.6.5.aar


BIN
app/libs/arm64-v8a/libBaiduMapSDK_base_v7_6_5.so


BIN
app/libs/arm64-v8a/libBaiduMapSDK_map_v7_6_5.so


BIN
app/libs/arm64-v8a/libc++_shared.so


BIN
app/libs/arm64-v8a/liblocSDK8b.so


BIN
app/libs/arm64-v8a/libtiny_magic.so


BIN
app/libs/armeabi-v7a/libBaiduMapSDK_base_v7_6_5.so


BIN
app/libs/armeabi-v7a/libBaiduMapSDK_map_v7_6_5.so


BIN
app/libs/armeabi-v7a/libc++_shared.so


BIN
app/libs/armeabi-v7a/liblocSDK8b.so


BIN
app/libs/armeabi-v7a/libtiny_magic.so


+ 4 - 4
app/src/main/AndroidManifest.xml

@@ -715,10 +715,6 @@ See README(https://goo.gl/l4GJaQ) for more.
             android:screenOrientation="portrait"
             android:theme="@style/TranslucentTheme" />
 
-        <meta-data
-            android:name="com.amap.api.v2.apikey"
-            android:value="9a728066a42e7b346da38b4239af558f" />
-
         <activity
             android:name=".ui.fragment.signup.HtmlActivity"
             android:screenOrientation="portrait"
@@ -800,6 +796,10 @@ See README(https://goo.gl/l4GJaQ) for more.
                 <action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE"/>
             </intent-filter>
         </service>
+
+        <meta-data
+            android:name="com.baidu.lbsapi.API_KEY"
+            android:value="@string/baidu_api_key" />
     </application>
 
 </manifest>

+ 19 - 0
app/src/main/java/com/sikey/interconnect/app/startup/RingApplication.kt

@@ -5,6 +5,7 @@ import android.app.Activity
 import android.app.Application
 import android.app.NotificationChannel
 import android.app.NotificationManager
+import android.content.Context
 import android.content.Intent
 import android.media.AudioAttributes
 import android.net.Uri
@@ -13,6 +14,9 @@ import android.os.Bundle
 import android.os.Process
 import android.provider.Settings
 import android.util.Log
+import com.baidu.mapapi.CoordType
+import com.baidu.mapapi.SDKInitializer
+import com.baidu.mapapi.common.BaiduMapSDKException
 import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator
 import com.nostra13.universalimageloader.core.ImageLoader
 import com.nostra13.universalimageloader.core.ImageLoaderConfiguration
@@ -79,6 +83,9 @@ class RingApplication : Application(), OnTerminateListener {
 //        }
 //        FirebaseApp.initializeApp(this)
 
+        // 初始化百度地图
+        initializeBaiduMap(this, true)
+
         if (BuildConfig.VIDEO_CALL_VENDOR == "juphoon") {
             JCManager.getInstance().initialize(this)
         } else if (BuildConfig.VIDEO_CALL_VENDOR == "agora") {
@@ -122,6 +129,18 @@ class RingApplication : Application(), OnTerminateListener {
         }
     }
 
+    private fun initializeBaiduMap(context: Context, agreePrivacy: Boolean) {
+        try {
+            SDKInitializer.setAgreePrivacy(context, agreePrivacy)
+            if (agreePrivacy) {
+                SDKInitializer.initialize(context)
+                SDKInitializer.setCoordType(CoordType.GCJ02)
+            }
+        } catch (e: BaiduMapSDKException) {
+            e.printStackTrace()
+        }
+    }
+
     fun isInBackground(): Boolean {
         return mActivityCont == 0
     }

+ 17 - 9
app/src/main/java/com/sikey/interconnect/k2/ui/main/NavigationDialogFragment.java

@@ -113,7 +113,7 @@ public class NavigationDialogFragment extends DialogFragment {
         view.findViewById(R.id.lyt_amap).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                JumpToGaode();
+                JumpToBaidu();
                 dismiss();
             }
         });
@@ -153,14 +153,22 @@ public class NavigationDialogFragment extends DialogFragment {
 
     private void JumpToBaidu() {
         try {
-            String action = String.format("intent://map/direction?origin=latlng:%f,%f|name:我的位置&destination=latlng:%f,%f|name:终点&mode=driving#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end",mPoint.latitude,mPoint.longitude,mPoint.latitude,mPoint.longitude);
-            Intent intent = Intent.getIntent(action);
-            if(isAppInstalled(this.getActivity(), "com.baidu.BaiduMap")){
-                startActivity(intent); //启动调用
-            }else{
-                ToastUtils.showLongToast(R.string.map_baidu_err);
-            }
-        } catch (URISyntaxException e) {
+            String uriString = String.format(
+                    "baidumap://map/direction?" +
+                            "origin=latlng:%f,%f|name:我的位置" +
+                            "&destination=latlng:%f,%f|name:终点" +
+                            "&mode=driving" +
+                            "&coord_type=gcj02" +
+                            "&src=com.sikey.veryfit",
+                    mPoint.latitude, mPoint.longitude,
+                    mPoint.latitude, mPoint.longitude
+            );
+
+            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uriString));
+            intent.setPackage("com.baidu.BaiduMap");
+            startActivity(intent);
+        } catch (Exception e){
+            ToastUtils.showLongToast(R.string.map_baidu_err);
             e.printStackTrace();
         }
     }

+ 263 - 325
app/src/main/java/com/sikey/interconnect/ui/avtivity/component/fence/FenceSettingActivity.kt

@@ -8,8 +8,6 @@ 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.text.Editable
 import android.text.TextWatcher
 import android.view.LayoutInflater
@@ -17,40 +15,47 @@ import android.view.Menu
 import android.view.View
 import android.view.inputmethod.InputMethodManager
 import android.widget.ArrayAdapter
-import android.widget.AutoCompleteTextView
 import android.widget.CheckBox
 import android.widget.CompoundButton
 import android.widget.ImageView
 import android.widget.SeekBar
 import android.widget.SeekBar.OnSeekBarChangeListener
 import android.widget.TextView
+import androidx.appcompat.widget.AppCompatAutoCompleteTextView
 import androidx.appcompat.widget.Toolbar
 import androidx.core.content.ContextCompat
-import com.amap.api.location.AMapLocationClient
-import com.amap.api.location.AMapLocationClientOption
-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.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.amap.api.services.help.Inputtips
-import com.amap.api.services.help.InputtipsQuery
-import com.amap.api.services.help.Tip
+import com.baidu.location.BDAbstractLocationListener
+import com.baidu.location.BDLocation
+import com.baidu.location.LocationClient
+import com.baidu.location.LocationClientOption
+import com.baidu.mapapi.map.BaiduMap
+import com.baidu.mapapi.map.BitmapDescriptorFactory
+import com.baidu.mapapi.map.CircleOptions
+import com.baidu.mapapi.map.MapPoi
+import com.baidu.mapapi.map.MapStatus
+import com.baidu.mapapi.map.MapStatusUpdateFactory
+import com.baidu.mapapi.map.MapView
+import com.baidu.mapapi.map.MarkerOptions
+import com.baidu.mapapi.map.Stroke
+import com.baidu.mapapi.model.LatLng
+import com.baidu.mapapi.model.LatLngBounds
+import com.baidu.mapapi.search.core.SearchResult
+import com.baidu.mapapi.search.geocode.GeoCodeResult
+import com.baidu.mapapi.search.geocode.GeoCoder
+import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener
+import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption
+import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult
+import com.baidu.mapapi.search.sug.OnGetSuggestionResultListener
+import com.baidu.mapapi.search.sug.SuggestionResult
+import com.baidu.mapapi.search.sug.SuggestionSearch
+import com.baidu.mapapi.search.sug.SuggestionSearchOption
 import com.github.pengrad.mapscaleview.MapScaleView
 import com.sikey.interconnect.R
 import com.sikey.interconnect.app.DataManager.Companion.instance
 import com.sikey.interconnect.component.helper.FenceHelper
 import com.sikey.interconnect.component.log.Logger
 import com.sikey.interconnect.component.network.http.model.ChildInfo
+import com.sikey.interconnect.constant.Constant
 import com.sikey.interconnect.constant.FenceCategoryConstants
 import com.sikey.interconnect.data.bean.FenceInfoBean
 import com.sikey.interconnect.k2.utils.BitmapUtils
@@ -60,12 +65,12 @@ import com.sikey.interconnect.ui.avtivity.component.left.BabyDetailActivity
 import com.sikey.interconnect.ui.custom.layout.DrawFenceRelativeLayout
 import com.sikey.interconnect.ui.custom.layout.DrawFenceRelativeLayout.OnDrawPolygonListener
 import com.sikey.interconnect.utils.PermissionUtils
+import com.sikey.interconnect.utils.SharedPreferenceUtil
 import com.sikey.interconnect.utils.ToastUtils
 import com.tbruyelle.rxpermissions2.RxPermissions
 
 class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, OnDrawPolygonListener,
-    AMap.OnCameraChangeListener,
-    CompoundButton.OnCheckedChangeListener, GeocodeSearch.OnGeocodeSearchListener {
+    BaiduMap.OnMapStatusChangeListener, CompoundButton.OnCheckedChangeListener {
     private var fenceFillColor = 0
     private var latlngTemp: String? = null
     private var mTvArea: TextView? = null
@@ -83,7 +88,13 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
     private var mFenceType: Int = 1
 
     /////////////////locate related/////////////////
-    private var map: AMap? = null
+    private var mMapView: MapView? = null
+    private var map: BaiduMap? = null
+    private lateinit var locationClient: LocationClient
+    private lateinit var autoCompleteTextView: AppCompatAutoCompleteTextView
+    private lateinit var adapter: ArrayAdapter<String>
+    private lateinit var suggestionSearch: SuggestionSearch
+    private val suggestions = mutableListOf<SuggestionResult.SuggestionInfo>()
     var scaleView: MapScaleView? = null
 
     ///////////////////////////////////////////////
@@ -94,73 +105,37 @@ 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 mLastLocation: Location? = null
     private var needLocate = false
     //internal lateinit var mLocationCallback: LocationCallback
     internal lateinit var mLocationRequest: LocationRequest
     //internal var mFusedLocationClient: FusedLocationProviderClient? = null
-    private lateinit var geocodeSearch: GeocodeSearch
-    private lateinit var locationClient: AMapLocationClient
-    private lateinit var autoCompleteTextView: AutoCompleteTextView
-    private val suggestions = mutableListOf<Tip>()
-    private lateinit var adapter: ArrayAdapter<String>
     private var radiusReserved: Int = 100
-
     private fun initMap() {
-        val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
-/*      mapFragment!!.getMapAsync(this)
-        mGoogleApiClient = GoogleApiClient.Builder(this)
-            .addConnectionCallbacks(this)
-            .addOnConnectionFailedListener(this)
-            .addApi(LocationServices.API)
-            .build()*/
-        map = mapFragment?.getMap()
-        map!!.uiSettings.isMyLocationButtonEnabled = false
-
-        map!!.setOnPOIClickListener {
-            map!!.moveCamera(CameraUpdateFactory.newLatLngZoom(it.coordinate, 15f))
-            drawPolygon(it.coordinate, mDotsFenceInfoBean?.circleRadius ?: DEFAULT_RADIUS, mFenceType)
-            getGeoAdress(it.coordinate)
-        }
-
-        map!!.setOnMapClickListener { latLng ->
-            map!!.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f))
-            drawPolygon(latLng, mDotsFenceInfoBean?.circleRadius ?: DEFAULT_RADIUS, mFenceType)
-            getGeoAdress(latLng)
-        }
-        map!!.setOnCameraChangeListener(this)
-        val cameraPosition = map!!.cameraPosition
+        mMapView =  findViewById(R.id.bmapView)
+        map = mMapView?.map
+        map?.uiSettings?.isRotateGesturesEnabled = false
+        setMapClickListener(map, mDotsFenceInfoBean, mFenceType)
+        map?.setOnMapStatusChangeListener(this)
+        val cameraPosition = map!!.mapStatus
         // need to pass zoom and latitude
         scaleView!!.update(cameraPosition.zoom, cameraPosition.target.latitude)
         initData()
         refreshMapZoom()
     }
 
-    private fun initLocation() {
-        locationClient = AMapLocationClient(this)
-        val locationOption = AMapLocationClientOption()
-        locationOption.apply {
-            setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy)
-            isNeedAddress = true
-            interval = 2000
-            isOnceLocation = true
-        }
-        locationClient.setLocationOption(locationOption)
-        locationClient.setLocationListener { location ->
-            location?.let {
-                if (it.errorCode == 0) {
-                    // Positioning successfully, update map position
-                    val latLng = LatLng(it.latitude, it.longitude)
-                    map?.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f))
-                    Logger.d(TAG, "Positioning successfully: ${it.latitude} ${it.longitude}")
-                } else {
-                    // Failed to positioning
-                    Logger.e(TAG, "Failed to positioning: ${it.errorInfo}")
-                }
+    private fun setMapClickListener(map: BaiduMap?, fenceInfoBean: FenceInfoBean?, fenceType: Int) {
+        map?.setOnMapClickListener(object : BaiduMap.OnMapClickListener {
+            override fun onMapClick(latLng: LatLng) {
+                drawPolygon(latLng, fenceInfoBean?.circleRadius ?: DEFAULT_RADIUS, fenceType)
+                getGeoAdress(latLng)
             }
-        }
-        locationClient.startLocation()
+
+            override fun onMapPoiClick(poi: MapPoi) {
+                drawPolygon(poi.position, fenceInfoBean?.circleRadius ?: DEFAULT_RADIUS, fenceType)
+                getGeoAdress(poi.position)
+            }
+        })
     }
 
     private fun initView() {
@@ -216,41 +191,43 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
     }
 
     fun initSearchLayout() {
-/*        if (!Places.isInitialized()) {
-            Places.initialize(applicationContext, getString(R.string.google_maps_key))
-        }
-        val autocompleteFragment =
-            supportFragmentManager.findFragmentById(R.id.autocomplete_fragment) as AutocompleteSupportFragment?
-        autocompleteFragment!!.setPlaceFields(mutableListOf(Place.Field.NAME, Place.Field.LAT_LNG))
-        autocompleteFragment.setOnPlaceSelectedListener(object : PlaceSelectionListener {
-            override fun onPlaceSelected(place: Place) {
-                place.latLng?.let { positon ->
-                    drawPolygon(
-                        positon,
-                        mDotsFenceInfoBean?.circleRadius ?: DEFAULT_RADIUS,
-                        mFenceType
-                    )
-                    mDotsFenceInfoBean?.lat = positon.latitude
-                    mDotsFenceInfoBean?.lng = positon.longitude
-                    getGeoAdress(positon)
-                    animateMapStatus(positon)
-                }
-                mDotsFenceInfoBean?.fenceLocation = place.address
-            }
-
-            override fun onError(status: Status) {
-                Log.i(TAG, "An error occurred: $status")
-            }
-        })*/
         autoCompleteTextView = findViewById(R.id.autocomplete_input)
-        adapter = ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, mutableListOf())
+        adapter = ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, mutableListOf<String>())
         autoCompleteTextView.setAdapter(adapter)
 
+        suggestionSearch = SuggestionSearch.newInstance()
+        suggestionSearch.setOnGetSuggestionResultListener(object : OnGetSuggestionResultListener {
+            override fun onGetSuggestionResult(result: SuggestionResult?) {
+                if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
+                    Logger.e(TAG, "搜索建议失败: ${result?.error}")
+                    adapter.clear()
+                    adapter.notifyDataSetChanged()
+                    return
+                }
+                // 更新建议列表
+                suggestions.clear()
+                suggestions.addAll(result.allSuggestions?.filter { it.pt != null } ?: emptyList())
+                /*                adapter.clear()
+                                adapter.addAll(suggestions.map { "${it.key} (${it.city}${it.district})" })
+                                adapter.notifyDataSetChanged()
+                                autoCompleteTextView.showDropDown()*/
+
+                val suggestionNames = suggestions.map { "${it.key} (${it.city}${it.district})" }
+                adapter = ArrayAdapter(this@FenceSettingActivity, android.R.layout.simple_dropdown_item_1line, suggestionNames)
+                autoCompleteTextView.setAdapter(adapter)
+                adapter.notifyDataSetChanged()
+            }
+        })
+
         // 监听输入变化
         autoCompleteTextView.addTextChangedListener(object : TextWatcher {
             override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
             override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
-                if (s.isNullOrEmpty()) return
+                if (s.isNullOrEmpty()) {
+                    adapter.clear()
+                    adapter.notifyDataSetChanged()
+                    return
+                }
                 fetchSuggestions(s.toString())
             }
             override fun afterTextChanged(s: Editable?) {}
@@ -267,37 +244,21 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
         }
     }
 
-    private fun fetchSuggestions(keyword: String) {
-        // 配置 Inputtips 查询
-        val query = InputtipsQuery(keyword, null) // 第二个参数为城市,可设为具体城市或 null
-        query.cityLimit = false // 是否限制在指定城市
-        val inputTips = Inputtips(this, query)
-
-        // 设置监听器
-        inputTips.setInputtipsListener { tipList, rCode ->
-            if (rCode == 1000 && tipList != null) { // 1000 表示成功
-                suggestions.clear()
-                tipList.removeIf { tip -> tip == null || tip.point == null }
-                suggestions.addAll(tipList)
-                val suggestionNames = tipList.map { it.name }
-                adapter.clear()
-                adapter = ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, suggestionNames)
-                autoCompleteTextView.setAdapter(adapter)
-                adapter.notifyDataSetChanged()
-            }
-        }
-
-        // 异步执行查询
-        inputTips.requestInputtipsAsyn()
+    private fun fetchSuggestions(query: String) {
+        val option = SuggestionSearchOption()
+            .keyword(query)
+            .city("全国")
+        suggestionSearch.requestSuggestion(option)
     }
 
-    private fun onPlaceSelected(tip: Tip) {
-        // 获取选择的地点信息
-        val latLonPoint = tip.point
-        val latLng = LatLng(latLonPoint.latitude, latLonPoint.longitude)
-        map?.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f))
-        drawPolygon(latLng, mDotsFenceInfoBean?.circleRadius ?: DEFAULT_RADIUS, mFenceType)
-        getGeoAdress(latLng)
+    private fun onPlaceSelected(suggestion: SuggestionResult.SuggestionInfo) {
+        // 处理选择的地点,例如更新地图中心
+        suggestion.pt?.let { latLng ->
+            animateMapStatus(latLng)
+            drawPolygon(latLng, mDotsFenceInfoBean?.circleRadius ?: DEFAULT_RADIUS, mFenceType)
+            getGeoAdress(latLng)
+        }
+        Logger.d(TAG, "Selected place: ${suggestion.key}, ${suggestion.pt}")
     }
 
     override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) {
@@ -383,7 +344,8 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
         val southWest = LatLng(minX, minY)
         val earthEast = LatLng(maxX, maxY)
         val bounds = LatLngBounds.Builder().include(southWest).include(earthEast).build()
-        updateMap(bounds)
+        val mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(bounds, 500, 500)
+        map?.animateMapStatus(mapStatusUpdate)
     }
 
     private val boundsPoint: ArrayList<*>
@@ -433,10 +395,6 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
             return arrayList
         }
 
-    private fun updateMap(bounds: LatLngBounds) {
-        //map!!.setMapStatusLimits(bounds)
-    }
-
     private fun getChildLocation(beanList: List<ChildInfo>?): LatLng? {
         if (null == beanList || beanList.size < 1) {
             Logger.d(TAG, "beanList is empty")
@@ -460,26 +418,25 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
 
     private fun drawPolygon(center: LatLng?, radiu: Int, fenceType:Int) {
         map!!.clear()
-        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)
+        mDotsFenceInfoBean?.lat = center?.latitude ?: 200.0
+        mDotsFenceInfoBean?.lng = center?.longitude ?: 200.0
+
+        val circleOptions = CircleOptions()
+            .center(center)
+            .radius(radiu) // 百度地图的 radius 是 Int 类型
+            .stroke(Stroke(5, fenceFillColor)) // 描边宽度 5 像素
+            .fillColor(fenceFillColor)
+        val circle = map?.addOverlay(circleOptions)
+
+        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(1).draggable(false)
+        val marker = map!!.addOverlay(option)
     }
 
     private fun drawPolygon() {
@@ -489,7 +446,6 @@ 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,
@@ -572,83 +528,77 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
             if (tempLatLng?.latitude == 0.0 && tempLatLng.longitude == 0.0) {
                 initLocation()
             } else {
-                map?.moveCamera(CameraUpdateFactory.newLatLngZoom(tempLatLng, 15f))
-                map?.addMarker(MarkerOptions().position(tempLatLng))
+                if (tempLatLng != null) {
+                    animateMapStatus(tempLatLng)
+                }
             }
         }
     }
 
-/*    private fun getGeoAdress(latLng: LatLng) {
-        val latlngStr = latLng.latitude.toString() + "," + latLng.longitude
-        Logger.d(TAG, "getGeoAdress -- $latlngStr")
-        if (latlngStr != null && latlngStr == latlngTemp) {
-            return
+    private fun initLocation() {
+        LocationClient.setAgreePrivacy(true)
+        locationClient = LocationClient(this)
+        val locationOption = LocationClientOption()
+        locationOption.apply {
+            setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy)
+            setIsNeedAddress(true)
+            scanSpan = 2000
+            isOnceLocation = true
         }
-        //         UrlConstants.initTrustSSL();
-        val request = StringRequest(
-            UrlConstants.GOOGLE_GEO_ADRESS + "?latlng=" + latlngStr + getString(R.string.param_google_maps_key),
-            { response ->
-                try {
-                    val jsonObject = JSONObject(response)
-                    val status = jsonObject.getString("status")
-                    if ("OK" == status) {
-                        latlngTemp = latlngStr
-                        val results = jsonObject.getString("results")
-                        val jsonArray = JSONArray(results)
-                        val length = jsonArray.length()
-                        Logger.d(TAG, "getGeoAdress -- jsonArray.length(): $length")
-                        for (i in 0 until length) {
-                            val jsonObject2 = jsonArray.getJSONObject(i)
-                            Logger.d(TAG, "jsonObject2 - $i : $jsonObject2")
-                            val formatted_address = jsonObject2.getString("formatted_address")
-                            Logger.i(TAG, "getGeoAdress -- formatted_address: $formatted_address")
-                            if (i == 0) {
-                                mDotsFenceInfoBean?.fenceLocation = formatted_address
-                                break
-                            }
-                        }
-                    }
-                } catch (e: JSONException) {
-                    e.printStackTrace()
+        locationClient.locOption = locationOption
+        locationClient.registerLocationListener(object : BDAbstractLocationListener() {
+            override fun onReceiveLocation(location: BDLocation?) {
+                location?.let {
+                    // Positioning successfully, update map position
+                    Logger.d(TAG, "Positioning successfully, ${it.latitude}, ${it.longitude}")
+                    val latLng = LatLng(it.latitude, it.longitude)
+                    animateMapStatus(latLng)
+                    SharedPreferenceUtil.setFloatDataIntoSP(Constant.PACKAGE_NAME, Constant.KEY_LOCATION_LAT, it.latitude.toFloat())
+                    SharedPreferenceUtil.setFloatDataIntoSP(Constant.PACKAGE_NAME, Constant.KEY_LOCATION_LNG, it.longitude.toFloat())
+                }?: run {
+                    // Failed to positioning
+                    Logger.e(TAG, "Failed to positioning")
                 }
-            }) { error ->
-            Logger.i(TAG, "add err==" + error.message)
-            /* 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())
+        val geoCoder = GeoCoder.newInstance()
+        geoCoder.setOnGetGeoCodeResultListener(object : OnGetGeoCoderResultListener {
+            override fun onGetGeoCodeResult(result: GeoCodeResult?) {
+                if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
+                    Logger.d(TAG, "地理编码失败: ${result?.error}")
+                    return
+                }
+                val latLng = result.location
+                val address = result.address
+                Logger.d(TAG, "地理编码结果: 地址=$address, 经纬度=$latLng")
             }
-        }
-        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 onGetReverseGeoCodeResult(result: ReverseGeoCodeResult?) {
+                if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
+                    Logger.e(TAG, "逆地理编码失败: ${result?.error}")
+                    return
+                }
+                // 获取逆地理编码结果
+                val address = result.address
+                val poiList = result.poiList
+                Logger.d(TAG, "逆地理编码结果: 地址=$address, 格式化地址=${result.formattedPoiAddress}, 附近POI=$poiList")
+                if (result.error == SearchResult.ERRORNO.NO_ERROR) {
+                    mDotsFenceInfoBean?.fenceLocation = result.formattedPoiAddress
+                }
+            }
+        })
 
-    override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) {
-        // This method is not used for reverse geocoding
+        // 发起逆地理编码请求
+        latLng?.let {
+            val reverseGeoCodeOption = ReverseGeoCodeOption()
+                .location(it)
+                .radius(200)
+                .newVersion(1)
+            geoCoder.reverseGeoCode(reverseGeoCodeOption)
+        } ?: Logger.e(TAG, "无效的经纬度数据")
     }
 
     override fun onDrawPolygon(pointList: List<Point>) {
@@ -658,17 +608,6 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
         mDrawFenceLayout!!.setShouldIntercept(false)
     }
 
-    override fun onStart() {
-        //startToLocate();
-        //mGoogleApiClient!!.connect()
-        super.onStart()
-    }
-
-    override fun onStop() {
-        //mGoogleApiClient!!.disconnect()
-        super.onStop()
-    }
-
     override fun onCreateOptionsMenu(menu: Menu): Boolean {
         // Inflate the menu; this adds items to the action bar if it is present.
         //getMenuInflater().inflate(R.menu.menu_fence_setting, menu);
@@ -676,25 +615,25 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
         return false
     }
 
-    override fun onCameraChange(cameraPosition: CameraPosition) {
-        scaleView!!.update(cameraPosition.zoom, cameraPosition.target.latitude)
+    override fun onMapStatusChangeStart(p0: MapStatus?) {
+        Logger.d(TAG, "onMapStatusChangeStart latitude:${p0!!.target.latitude}")
+        scaleView?.update(p0!!.zoom, p0.target.latitude)
     }
 
-    override fun onCameraChangeFinish(cameraPosition: CameraPosition) {
-        scaleView!!.update(cameraPosition.zoom, cameraPosition.target.latitude)
+    override fun onMapStatusChangeStart(p0: MapStatus?, p1: Int) {
+        Logger.d(TAG, "onMapStatusChangeStart(p0: MapStatus?, p1: Int) latitude:${p0!!.target.latitude}")
+        scaleView?.update(p0!!.zoom, p0.target.latitude)
     }
 
-/*
-    override fun onCameraIdle() {
-        val cameraPosition = map!!.cameraPosition
-        scaleView!!.update(cameraPosition.zoom, cameraPosition.target.latitude)
+    override fun onMapStatusChange(p0: MapStatus?) {
+        Logger.d(TAG, "onMapStatusChange latitude:${p0!!.target.latitude}")
+        scaleView?.update(p0!!.zoom, p0.target.latitude)
     }
 
-    override fun onCameraMove() {
-        val cameraPosition = map!!.cameraPosition
-        scaleView!!.update(cameraPosition.zoom, cameraPosition.target.latitude)
+    override fun onMapStatusChangeFinish(p0: MapStatus?) {
+        Logger.d(TAG, "onMapStatusChangeFinish latitude:${p0!!.target.latitude}")
+        scaleView?.update(p0!!.zoom, p0.target.latitude)
     }
-*/
 
     /**
      * Enables the My Location layer if the fine location permission has been granted.
@@ -716,50 +655,49 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
 
     private fun animateMapStatus(latLng: LatLng) {
         Logger.d(TAG, "animateMapStatus")
-        val position = CameraPosition.Builder()
-            .target(latLng).zoom(15.0f).bearing(0f).tilt(0f).build()
-        map!!.animateCamera(CameraUpdateFactory.newCameraPosition(position))
-    }
-
-/*    override fun onConnected(bundle: Bundle?) {
-        if (ActivityCompat.checkSelfPermission(
-                this,
-                Manifest.permission.ACCESS_FINE_LOCATION
-            ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
-                this,
-                Manifest.permission.ACCESS_COARSE_LOCATION
-            ) != PackageManager.PERMISSION_GRANTED
-        ) {
-            // TODO: Consider calling
-            //    ActivityCompat#requestPermissions
-            // here to request the missing permissions, and then overriding
-            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
-            //                                          int[] grantResults)
-            // to handle the case where the user grants the permission. See the documentation
-            // for ActivityCompat#requestPermissions for more details.
-            return
-        }
-        LocationServices.getFusedLocationProviderClient(this).lastLocation.addOnSuccessListener {
-            mLastLocation = it
-            if (needLocate) {
-                startToLocate()
+        val update = MapStatusUpdateFactory.newLatLngZoom(latLng, 15f)
+        map?.setMapStatus(update)
+        map?.animateMapStatus(update)
+    }
+
+    /*    override fun onConnected(bundle: Bundle?) {
+            if (ActivityCompat.checkSelfPermission(
+                    this,
+                    Manifest.permission.ACCESS_FINE_LOCATION
+                ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
+                    this,
+                    Manifest.permission.ACCESS_COARSE_LOCATION
+                ) != PackageManager.PERMISSION_GRANTED
+            ) {
+                // TODO: Consider calling
+                //    ActivityCompat#requestPermissions
+                // here to request the missing permissions, and then overriding
+                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
+                //                                          int[] grantResults)
+                // to handle the case where the user grants the permission. See the documentation
+                // for ActivityCompat#requestPermissions for more details.
+                return
+            }
+            LocationServices.getFusedLocationProviderClient(this).lastLocation.addOnSuccessListener {
+                mLastLocation = it
+                if (needLocate) {
+                    startToLocate()
+                }
             }
         }
-    }
 
-    override fun onConnectionSuspended(i: Int) {}
-    override fun onConnectionFailed(connectionResult: ConnectionResult) {
-        Logger.e(
-            TAG, "onConnectionFailed: ConnectionResult.getErrorCode() = "
-                    + connectionResult.errorCode
-        )
-        Toast.makeText(
-            this,
-            "Could not connect to Google API Client: Error " + connectionResult.errorCode,
-            Toast.LENGTH_SHORT
-        ).show()
-    }
-*/
+        override fun onConnectionSuspended(i: Int) {}
+        override fun onConnectionFailed(connectionResult: ConnectionResult) {
+            Logger.e(
+                TAG, "onConnectionFailed: ConnectionResult.getErrorCode() = "
+                        + connectionResult.errorCode
+            )
+            Toast.makeText(
+                this,
+                "Could not connect to Google API Client: Error " + connectionResult.errorCode,
+                Toast.LENGTH_SHORT
+            ).show()
+        }*/
 
     companion object {
         private val TAG = FenceSettingActivity::class.java.simpleName
@@ -772,39 +710,39 @@ class FenceSettingActivity : BaseNoActionBarActivity(), View.OnClickListener, On
     }
 
     private fun requestSelfLocation() {
-/*        mLocationRequest = LocationRequest()
-        mLocationRequest.interval = 1000
-        mLocationRequest.fastestInterval = 1000
-        mLocationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
-        if (ContextCompat.checkSelfPermission(
-                this,
-                Manifest.permission.ACCESS_FINE_LOCATION
-            ) == PackageManager.PERMISSION_GRANTED
-        ) {
-            mLocationCallback = object : LocationCallback() {
-                override fun onLocationResult(result: LocationResult) {
-                    super.onLocationResult(result)
-                    val place = result.lastLocation ?: return
-                    val positon = LatLng(place.latitude, place.longitude)
-                    mDotsFenceInfoBean?.circleRadius = DEFAULT_RADIUS
-                    mSeekbar?.progress = DEFAULT_RADIUS / SEEKBAR_STEP
-                    mTvArea?.text = DEFAULT_RADIUS.toString()
-                    drawPolygon(positon, DEFAULT_RADIUS, mFenceType)
-                    mDotsFenceInfoBean?.lat = positon.latitude
-                    mDotsFenceInfoBean?.lng = positon.longitude
-                    getGeoAdress(positon)
-                    animateMapStatus(positon)
-                    if (mGoogleApiClient != null) {
-                        mFusedLocationClient?.removeLocationUpdates(mLocationCallback)
+        /*        mLocationRequest = LocationRequest()
+                mLocationRequest.interval = 1000
+                mLocationRequest.fastestInterval = 1000
+                mLocationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
+                if (ContextCompat.checkSelfPermission(
+                        this,
+                        Manifest.permission.ACCESS_FINE_LOCATION
+                    ) == PackageManager.PERMISSION_GRANTED
+                ) {
+                    mLocationCallback = object : LocationCallback() {
+                        override fun onLocationResult(result: LocationResult) {
+                            super.onLocationResult(result)
+                            val place = result.lastLocation ?: return
+                            val positon = LatLng(place.latitude, place.longitude)
+                            mDotsFenceInfoBean?.circleRadius = DEFAULT_RADIUS
+                            mSeekbar?.progress = DEFAULT_RADIUS / SEEKBAR_STEP
+                            mTvArea?.text = DEFAULT_RADIUS.toString()
+                            drawPolygon(positon, DEFAULT_RADIUS, mFenceType)
+                            mDotsFenceInfoBean?.lat = positon.latitude
+                            mDotsFenceInfoBean?.lng = positon.longitude
+                            getGeoAdress(positon)
+                            animateMapStatus(positon)
+                            if (mGoogleApiClient != null) {
+                                mFusedLocationClient?.removeLocationUpdates(mLocationCallback)
+                            }
+                        }
                     }
-                }
-            }
-            mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
-            mFusedLocationClient?.requestLocationUpdates(
-                mLocationRequest,
-                mLocationCallback,
-                Looper.myLooper()
-            )
-        }*/
+                    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
+                    mFusedLocationClient?.requestLocationUpdates(
+                        mLocationRequest,
+                        mLocationCallback,
+                        Looper.myLooper()
+                    )
+                }*/
     }
-}
+}

+ 119 - 77
app/src/main/java/com/sikey/interconnect/ui/avtivity/component/path/MDPathHistoryActivity.kt

@@ -4,6 +4,7 @@ import android.app.Activity
 import android.content.Intent
 import android.os.Bundle
 import android.os.Message
+import android.util.Log
 import android.view.Menu
 import android.view.MenuItem
 import android.view.View
@@ -16,37 +17,36 @@ import androidx.fragment.app.FragmentTransaction
 import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
-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.LatLng
-import com.amap.api.maps.model.LatLngBounds
-import com.amap.api.maps.model.Marker
-import com.amap.api.maps.model.MarkerOptions
-import com.amap.api.maps.model.Polyline
-import com.amap.api.maps.model.PolylineOptions
-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.baidu.mapapi.map.BaiduMap
+import com.baidu.mapapi.map.BitmapDescriptorFactory
+import com.baidu.mapapi.map.MapStatus
+import com.baidu.mapapi.map.MapStatusUpdateFactory
+import com.baidu.mapapi.map.MapView
+import com.baidu.mapapi.map.MarkerOptions
+import com.baidu.mapapi.map.Overlay
+import com.baidu.mapapi.map.Polyline
+import com.baidu.mapapi.map.PolylineOptions
+import com.baidu.mapapi.model.LatLng
+import com.baidu.mapapi.model.LatLngBounds
 import com.sikey.interconnect.R
 import com.sikey.interconnect.app.DataManager
 import com.sikey.interconnect.app.DataManager.Companion.checkLoginResponseAndCurrentChildInfo
 import com.sikey.interconnect.component.VersionMatch.VersionMatch
 import com.sikey.interconnect.component.handler.WeakReferenceHandler
 import com.sikey.interconnect.component.log.Logger
+import com.sikey.interconnect.component.network.RequestManager
 import com.sikey.interconnect.component.network.http.HttpServiceExecutor
 import com.sikey.interconnect.component.network.http.LocationService
 import com.sikey.interconnect.component.network.http.RetrofitFactory
 import com.sikey.interconnect.component.network.http.model.HistoryLocationRepo
 import com.sikey.interconnect.component.network.http.model.Location
+import com.sikey.interconnect.constant.UrlConstants
 import com.sikey.interconnect.data.bean.PathTraceBean
 import com.sikey.interconnect.k2.entity.DateBean
 import com.sikey.interconnect.k2.ui.settings.LocationSettingActivity
 import com.sikey.interconnect.k2.utils.FormatUtils
+import com.sikey.interconnect.k2.utils.TextUtils
 import com.sikey.interconnect.ui.adapter.DateAdapter
 import com.sikey.interconnect.ui.avtivity.base.BaseNoActionBarActivity
 import com.sikey.interconnect.ui.fragment.path.TrackSeekBarFragment
@@ -55,6 +55,9 @@ import com.sikey.interconnect.utils.ToastUtils
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
+import org.json.JSONArray
+import org.json.JSONException
+import org.json.JSONObject
 import java.text.SimpleDateFormat
 import java.util.Calendar
 import java.util.Date
@@ -62,12 +65,12 @@ import java.util.Locale
 import java.util.TimeZone
 
 class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
-    DateAdapter.DateItemClickListener, GeocodeSearch.OnGeocodeSearchListener {
+    DateAdapter.DateItemClickListener {
     private val NEW_COUNT = 10
     private val calendar = Calendar.getInstance()
-    private var map: AMap? = null
+    private var mMapView: MapView? = null
+    private var map: BaiduMap? = null
     private var mMutablePolyline: Polyline? = null
-    private lateinit var geocodeSearch: GeocodeSearch
 
     private enum class PointGravity {
         top, center, bottom
@@ -88,7 +91,7 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
     private var mFragmentTransaction: FragmentTransaction? = null
     private var mTrackSeekBarFrag: TrackSeekBarFragment? = null
     private var isSeekFragShow = false
-    private var mCurrentMarker: Marker? = null
+    private var mCurrentMarker: Overlay? = null
     private var mCurrentProgress = 0
     private var mToolbar: Toolbar? = null
     private var mName: TextView? = null
@@ -98,8 +101,15 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
     var mDateAdapter: DateAdapter? = null
     private var dateData: ArrayList<DateBean>? = null
     private fun initView() {
-        val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
-        map = mapFragment?.getMap()
+        //val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
+        mMapView =  findViewById(R.id.bmapView)
+        map = mMapView?.map
+        setMapLoadFinishFlag(true)
+        map?.mapType = BaiduMap.MAP_TYPE_NORMAL
+        map?.uiSettings?.isRotateGesturesEnabled = false
+        val mapStatus = MapStatus.Builder().zoom(16f).build()
+        val update = MapStatusUpdateFactory.newMapStatus(mapStatus)
+        map?.setMapStatus(update)
         mToolbar = findViewById<View>(R.id.toolbar) as Toolbar
         mName = mToolbar!!.findViewById<View>(R.id.title) as TextView
         mBack = mToolbar!!.findViewById<View>(R.id.ic_back) as ImageView
@@ -290,6 +300,17 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
                             view.setVisibility(View.GONE);
                         }*/
         }
+        mMapView?.onResume()
+    }
+
+    override fun onPause() {
+        super.onPause()
+        mMapView?.onPause()
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        mMapView?.onDestroy()
     }
 
     private fun setMapLoadFinishFlag(flag: Boolean) {
@@ -313,11 +334,6 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
         } else super.onOptionsItemSelected(item)
     }
 
-    /*    HistoryLocationReq(
-        cid = DataManager.instance.currentChildInfo?.childId?.trim() ?: "",
-        startDate = startTime,
-        endDate = endTime
-        )*/
     private fun submitRequest(startTime: Long, endTime: Long) {
         if (!checkLoginResponseAndCurrentChildInfo()) {
             return
@@ -351,7 +367,7 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
                             list.sortWith(compareBy { location -> location.date })
                             mCurrentBeanList = list
                             if (list.size == 0) {
-                                map!!.clear()
+                                map?.clear()
                                 hideTrackSeekFrag()
                                 ToastUtils.showShortToast(R.string.no_path_history_tip)
                                 if (mTrackSeekBarFrag != null) {
@@ -420,8 +436,7 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
             return
         }
         for (i in points.indices) {
-            //LatLng latLng=getConvertedLatLng(mAvatarItems.get(i).info.toLatLng());
-            val latLng = points[i]
+            val latLng= points[i]
             if (i == 0) {
                 minX = latLng.latitude
                 maxX = minX
@@ -442,12 +457,15 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
                 }
             }
         }
+
         val southWest = LatLng(minX, minY)
-        val earthEast = LatLng(maxX, maxY)
-        val bounds = LatLngBounds(southWest, earthEast)
-        //map!!.setMapStatusLimits(bounds)
-        // 100是LatLngBounds与地图边缘100像素的填充区域
-        map!!.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100))
+        val northEast = LatLng(maxX, maxY)
+        val bounds = LatLngBounds.Builder()
+            .include(southWest)
+            .include(northEast)
+            .build()
+        val mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(bounds, 500, 500)
+        map?.animateMapStatus(mapStatusUpdate)
     }
 
     private fun startToWaitOrDrawPath() {
@@ -464,7 +482,7 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
         if (null == map || null == beanList || beanList.isEmpty()) {
             return
         }
-        map!!.clear()
+        map?.clear()
         val points = generatePoints(beanList)
         addAllMarkers(points)
         drawAllLines(points)
@@ -486,17 +504,22 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
         }
     }
 
-    private fun drawSingleLine(tempPoints: List<LatLng>, timeInterval: Long) {
-        val polyLine: PolylineOptions
+    fun drawSingleLine(tempPoints: List<LatLng>, timeInterval: Long) {
+        val polylineOptions: PolylineOptions
         if (timeInterval < HALF_HOUR_SECONDS) {
-            polyLine = PolylineOptions().width(POLYLINE_WIDTH.toFloat()).color(COLOR_GREEN)
-                .addAll(tempPoints)
-            mMutablePolyline = map!!.addPolyline(polyLine)
+            polylineOptions = PolylineOptions()
+                .width(POLYLINE_WIDTH)
+                .color(COLOR_GREEN)
+                .points(tempPoints)
+            mMutablePolyline = map?.addOverlay(polylineOptions) as Polyline
         } else {
-            polyLine = PolylineOptions().width(DOT_LINE_WIDTH.toFloat()).color(COLOR_BLUE)
-                .addAll(tempPoints)
-            mMutablePolyline = map!!.addPolyline(polyLine)
-            mMutablePolyline!!.setDottedLine(true)
+            polylineOptions = PolylineOptions()
+                .width(DOT_LINE_WIDTH)
+                .color(COLOR_BLUE)
+                .points(tempPoints)
+                .dottedLine(true) // 启用虚线
+            mMutablePolyline = map?.addOverlay(polylineOptions) as Polyline
+            mMutablePolyline!!.isDottedLine = true
         }
     }
 
@@ -508,14 +531,14 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
     ) {
         val descriptor = BitmapDescriptorFactory.fromResource(drawId)
         val options = MarkerOptions().position(latLng).icon(descriptor)
-            .zIndex(customIndex.toFloat()).draggable(false)
+            .zIndex(customIndex).draggable(false)
         when (gravity) {
             PointGravity.top -> options.anchor(0.5f, 0f)
             PointGravity.center -> options.anchor(0.5f, 0.5f)
             PointGravity.bottom -> options.anchor(0.5f, 1f)
         }
         mOverlayOptionList.add(options)
-        map!!.addMarker(options)
+        map?.addOverlay(options)
     }
 
     private fun generatePoints(beanList: ArrayList<Location>): List<LatLng> {
@@ -570,21 +593,23 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
         val latLng = getConvertedLatLng(bean)
         val descriptor = BitmapDescriptorFactory.fromResource(R.drawable.point_selected)
         val options = MarkerOptions().position(latLng).icon(descriptor)
-            .zIndex((NORMAL_Z_INDEX + 1).toFloat()).draggable(false).anchor(0.5f, 0.5f)
+            .zIndex((NORMAL_Z_INDEX + 1)).draggable(false).anchor(0.5f, 0.5f)
         mOverlayOptionList.add(options)
-        mCurrentMarker = map!!.addMarker(options)
+        mCurrentMarker = map?.addOverlay(options)
         animateMapStatus(latLng)
     }
 
     private fun animateMapStatus(latLng: LatLng) {
-        val currentPos = map!!.cameraPosition
-        val position = CameraPosition.Builder()
-            .target(latLng).zoom(currentPos.zoom).bearing(currentPos.bearing).tilt(currentPos.tilt).build()
-        map!!.animateCamera(CameraUpdateFactory.newCameraPosition(position))
+        val mapStatus = MapStatus.Builder()
+            .target(latLng) // 设置目标中心点
+            .zoom(map!!.mapStatus.zoom) // 设置缩放级别
+            .build()
+        val mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus)
+        map?.animateMapStatus(mapStatusUpdate, 500)
     }
 
     private fun getGeoAdress() {
-        Logger.d(TAG, "getAddressFromLocation")
+        Logger.d(TAG, "getGeoAdress")
         if (mCurrentBeanList == null || mCurrentBeanList!!.isEmpty() || mCurrentBeanList!!.size < mCurrentProgress || mCurrentProgress < 1) {
             return
         }
@@ -592,30 +617,47 @@ class MDPathHistoryActivity : BaseNoActionBarActivity(), View.OnClickListener,
             //mCurrentMarker!!.remove()
         }
         val bean = mCurrentBeanList!![mCurrentProgress - 1]
-        geocodeSearch = GeocodeSearch(applicationContext)
-        geocodeSearch?.setOnGeocodeSearchListener(this)
-        val latLonPoint = bean.lat.toString()?.let {
-            bean.lng.toString()?.let { it1 ->
-                LatLonPoint(
-                    it.toDouble(), it1.toDouble())
-            }
-        }
-        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
-            address?.formatAddress?.let { mTrackSeekBarFrag?.setAddress(it) }
-            setMapLoadFinishFlag(true)
+        val latlng = bean.lat + "," + bean.lng
+        Log.d(
+            TAG,
+            "url = " + UrlConstants.GOOGLE_GEO_ADRESS + "?latlng=" + latlng + getString(R.string.param_google_maps_key)
+        )
+        val request = StringRequest(
+            UrlConstants.GOOGLE_GEO_ADRESS + "?latlng=" + latlng + getString(R.string.param_google_maps_key),
+            { response ->
+                try {
+//                    Log.d(TAG, "response=$response")
+                    val jsonObject = JSONObject(response)
+                    val status = jsonObject.getString("status")
+                    Log.d(TAG, "status=$status")
+                    if ("OK" == status) {
+                        val results = jsonObject.getString("results")
+                        val jsonArray = JSONArray(results)
+                        val length = jsonArray.length()
+                        Logger.d(TAG, "jsonArray.length(): " + jsonArray.length())
+                        for (i in 0 until length) {
+                            val jsonObject2 = jsonArray.getJSONObject(i)
+                            val formatted_address = jsonObject2.getString("formatted_address")
+                            Logger.i(TAG, "formatted_address: $formatted_address")
+                            if (i == 0) {
+
+                                var mAddressStr = formatted_address
+                                if (TextUtils.isEmpty(mAddressStr)) {
+                                    mAddressStr = resources.getString(R.string.locating_tip)
+                                }
+                                mTrackSeekBarFrag?.setAddress(mAddressStr)
+                                break
+                            }
+                        }
+                    }
+                } catch (e: JSONException) {
+                    e.printStackTrace()
+                }
+            }) { error ->
+            Logger.i(TAG, "add err==" + error.message)
+            /* ToastUtils.showLongToast(R.string.network_exception) */
         }
-    }
-
-    override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) {
-        // This method is not used for reverse geocoding
+        RequestManager.getInstance(this).addToRequestQueue(request)
     }
 
     private var inited = false

+ 110 - 110
app/src/main/java/com/sikey/interconnect/ui/avtivity/main/AMapFragment.kt → app/src/main/java/com/sikey/interconnect/ui/avtivity/main/BaiduMapFragment.kt

@@ -9,30 +9,33 @@ import android.widget.ImageView
 import android.widget.TextView
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.lifecycleScope
-import com.amap.api.location.AMapLocationClient
-import com.amap.api.location.AMapLocationClientOption
-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.baidu.location.BDAbstractLocationListener
+import com.baidu.location.BDLocation
+import com.baidu.location.LocationClient
+import com.baidu.location.LocationClientOption
+import com.baidu.mapapi.map.BaiduMap
+import com.baidu.mapapi.map.BitmapDescriptorFactory
+import com.baidu.mapapi.map.Circle
+import com.baidu.mapapi.map.MapStatusUpdateFactory
+import com.baidu.mapapi.map.MapView
+import com.baidu.mapapi.map.Marker
+import com.baidu.mapapi.map.MarkerOptions
+import com.baidu.mapapi.map.Overlay
+import com.baidu.mapapi.model.LatLng
+import com.baidu.mapapi.model.LatLngBounds
 import com.nostra13.universalimageloader.core.DisplayImageOptions
 import com.nostra13.universalimageloader.core.assist.ImageScaleType
 import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer
+import com.sikey.interconnect.component.designpattern.observerpattern.datamanager.IAvatarObserver
 import com.sikey.interconnect.R
 import com.sikey.interconnect.app.DataManager
 import com.sikey.interconnect.app.DataManager.Companion.instance
-import com.sikey.interconnect.component.designpattern.observerpattern.datamanager.IAvatarObserver
 import com.sikey.interconnect.component.log.Logger
 import com.sikey.interconnect.component.network.http.model.ChildInfo
 import com.sikey.interconnect.component.VersionMatch.VersionMatch
 import com.sikey.interconnect.constant.Constant
 import com.sikey.interconnect.constant.RoleTypeConstants
+import com.sikey.interconnect.data.AccountManager
 import com.sikey.interconnect.k2.utils.BitmapUtils
 import com.sikey.interconnect.ui.adapter.ChildInfoAdapter
 import com.sikey.interconnect.ui.custom.menu.satellite.CustomSatelliteMenu
@@ -41,87 +44,61 @@ import com.sikey.interconnect.utils.SharedPreferenceUtil
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 
-class AMapFragment : Fragment(), AMap.OnMarkerClickListener, IAvatarObserver {
+class BaiduMapFragment : Fragment(), BaiduMap.OnMarkerClickListener, IAvatarObserver {
 
-    private val TAG = AMapFragment::class.java.simpleName
+    private val TAG = BaiduMapFragment::class.java.simpleName
     private lateinit var mapView: MapView
-    private lateinit var locationClient: AMapLocationClient
+    private lateinit var locationClient: LocationClient
     private val mAvatarItems: MutableList<AvatarItem> = ArrayList()
-    private lateinit var map: AMap
+    private lateinit var map: BaiduMap
     private val circle: Circle? = null
     private val mOverlayOptionList: MutableList<MarkerOptions> = ArrayList()
 
     override fun onCreateView(
-    inflater: LayoutInflater, container: ViewGroup?,
-    savedInstanceState: Bundle?
+        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
-    map.let {
-        val uiSettings = it.uiSettings
-        uiSettings.isZoomControlsEnabled = false
-    }
+        val view = inflater.inflate(R.layout.baidumap_layout, container, false)
+
+        mapView = view.findViewById(R.id.mapView)
+        mapView.onCreate(activity, savedInstanceState)
+        mapView.showZoomControls(false)
+        map = mapView.map
+        map.uiSettings.isRotateGesturesEnabled = false
 
-    // Initialize AMap settings and then start
-    initLocation()
+        initLocation()
 
-    return view
+        return view
     }
 
     private fun initLocation() {
-        locationClient = AMapLocationClient(requireContext())
-        val locationOption = AMapLocationClientOption()
+        LocationClient.setAgreePrivacy(true)
+        locationClient = LocationClient(requireContext())
+        val locationOption = LocationClientOption()
         locationOption.apply {
-            setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy)
-            isNeedAddress = true
-            interval = 2000
+            setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy)
+            setIsNeedAddress(true)
+            scanSpan = 2000
             isOnceLocation = true
         }
-        locationClient.setLocationOption(locationOption)
-        locationClient.setLocationListener { location ->
-            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}")
-                    SharedPreferenceUtil.setFloatDataIntoSP(Constant.PACKAGE_NAME, Constant.KEY_LOCATION_LAT, it.latitude.toFloat())
-                    SharedPreferenceUtil.setFloatDataIntoSP(Constant.PACKAGE_NAME, Constant.KEY_LOCATION_LNG, it.longitude.toFloat())
-                } else {
+        locationClient.locOption = locationOption
+        locationClient.registerLocationListener(object : BDAbstractLocationListener() {
+            override fun onReceiveLocation(location: BDLocation?) {
+                location?.let {
+                        // Positioning successfully, update map position
+                        Logger.d(TAG, "Positioning successfully, ${it.latitude}, ${it.longitude}")
+                        val latLng = LatLng(it.latitude, it.longitude)
+                        animateMapStatus(latLng)
+                        SharedPreferenceUtil.setFloatDataIntoSP(Constant.PACKAGE_NAME, Constant.KEY_LOCATION_LAT, it.latitude.toFloat())
+                        SharedPreferenceUtil.setFloatDataIntoSP(Constant.PACKAGE_NAME, Constant.KEY_LOCATION_LNG, it.longitude.toFloat())
+                    }?: run {
                     // Failed to positioning
-                    Logger.e(TAG, "Failed to positioning: ${it.errorInfo}")
+                    Logger.e(TAG, "Failed to positioning")
                 }
             }
-        }
-    }
-
-    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)
@@ -158,7 +135,7 @@ class AMapFragment : Fragment(), AMap.OnMarkerClickListener, IAvatarObserver {
         lifecycleScope.launch {
             delay(500)
             for (info in items) {
-                if (info.roleType <= RoleTypeConstants.FAMILY) {
+                if (info.roleType >= RoleTypeConstants.FAMILY) {
                     var lat = info.lastLocation?.lat ?: "0.0"
                     if (lat.isEmpty()) lat = "0.0"
                     var lng = info.lastLocation?.lng ?: "0.0"
@@ -167,9 +144,9 @@ class AMapFragment : Fragment(), AMap.OnMarkerClickListener, IAvatarObserver {
                     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
+                        INIT_LAYER_INDEX + 1
                     } else {
-                        CustomMapFragment.INIT_LAYER_INDEX
+                        INIT_LAYER_INDEX
                     }
                     addSingleMarker(info, layerIndex)
                 }
@@ -242,7 +219,7 @@ class AMapFragment : Fragment(), AMap.OnMarkerClickListener, IAvatarObserver {
         } else {
             assert(position != null)
             circle.center = position!!
-            circle.radius = radius.toDouble()
+            circle.radius = radius
         }
         var zoom = 17
         if (radius > 800) {
@@ -255,15 +232,21 @@ class AMapFragment : Fragment(), AMap.OnMarkerClickListener, IAvatarObserver {
         assert(position != null)
         Logger.d(TAG, "animateToChosenChildPos2")
         if (lastLocation != null) {
-            map!!.moveCamera(CameraUpdateFactory.newLatLngZoom(position!!, zoom.toFloat()))
-            map!!.addMarker(MarkerOptions().position(position!!))
+            val latLng = LatLng(position!!.latitude, position.longitude)
+            animateMapStatus(latLng)
         } else {
             val lat = SharedPreferenceUtil.getFloatValueFromSP(Constant.PACKAGE_NAME, Constant.KEY_LOCATION_LAT, 0f)
             val lng = SharedPreferenceUtil.getFloatValueFromSP(Constant.PACKAGE_NAME, Constant.KEY_LOCATION_LNG, 0f)
             val latLng = LatLng(lat.toDouble(), lng.toDouble())
-            map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f))
+            animateMapStatus(latLng)
         }
-        map!!.stopAnimation()
+    }
+
+    private fun animateMapStatus(latLng: LatLng) {
+        Logger.d(TAG, "animateMapStatus")
+        val update = MapStatusUpdateFactory.newLatLngZoom(latLng, 15f)
+        map.setMapStatus(update)
+        map.animateMapStatus(update)
     }
 
     private fun addSingleMarker(info: ChildInfo, layerIndex: Int) {
@@ -351,9 +334,9 @@ class AMapFragment : Fragment(), AMap.OnMarkerClickListener, IAvatarObserver {
             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)
+            .zIndex(layerIndex).draggable(false)
         mOverlayOptionList.add(option)
-        val marker = map?.addMarker(option)
+        val marker = map.addOverlay(option)
         ///////////////////////////////////
         val item = AvatarItem()
         item.marker = marker
@@ -391,13 +374,15 @@ class AMapFragment : Fragment(), AMap.OnMarkerClickListener, IAvatarObserver {
                 val avatarImageView =
                     childTrackView.findViewById<View>(R.id.avatarImageView) as ImageView
                 avatarImageView.setImageBitmap(circleBitmap)
-                item.marker!!.setIcon(
-                    BitmapDescriptorFactory.fromBitmap(
-                        BitmapUtils.getBitmapFromView(
-                            childTrackView
-                        )
+
+                val icon = BitmapDescriptorFactory.fromBitmap(
+                    BitmapUtils.getBitmapFromView(
+                        childTrackView
                     )
                 )
+                val markerOptions = MarkerOptions()
+                    .icon(icon)
+                item.marker = map.addOverlay(markerOptions) as Marker
                 item.avatarView = avatarImageView
                 break
             }
@@ -409,10 +394,10 @@ class AMapFragment : Fragment(), AMap.OnMarkerClickListener, IAvatarObserver {
         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) {
+
+        mAvatarItems.forEachIndexed { index, item ->
+            val latLng = mAvatarItems[index].convertedLatLng
+            if (index == 0) {
                 minX = latLng!!.latitude
                 maxX = minX
                 minY = latLng.longitude
@@ -432,49 +417,64 @@ class AMapFragment : Fragment(), AMap.OnMarkerClickListener, IAvatarObserver {
                 }
             }
         }
-        val southWest = LatLng(minX, minY)
-        val earthEast = LatLng(maxX, maxY)
-        val bounds = LatLngBounds(southWest, earthEast)
-        //100是LatLngBounds与地图边缘100像素的填充区域
-        map!!.animateCamera(newLatLngBounds(bounds, 100))
+
+        if (mAvatarItems.isNotEmpty()) {
+            val southWest = LatLng(minX, minY)
+            val northEast = LatLng(maxX, maxY)
+            val bounds = LatLngBounds.Builder()
+                .include(southWest)
+                .include(northEast)
+                .build()
+
+            val update = MapStatusUpdateFactory.newLatLngBounds(bounds, 500, 500)
+            map.animateMapStatus(update)
+        } else {
+            Logger.e(TAG, "mAvatarItems is empty")
+        }
     }
 
     override fun onDestroyView() {
-        Logger.d(TAG, "AMAP onDestroy")
+        Logger.d(TAG, "BaiduMap onDestroy")
         super.onDestroyView()
-        //locationClient.stopLocation()
+        locationClient.stop()
         // Release map resources
         mapView.onDestroy()
     }
 
     override fun onResume() {
-        Logger.d(TAG, "AMAP onResume")
+        Logger.d(TAG, "BaiduMap onResume")
         super.onResume()
         mapView.onResume()
-        Logger.d(TAG, "Start positioning...")
-        locationClient.startLocation()
+        var isNeedLocate = true
+        instance.childTrackInfos?.onEach {
+            if(it.device != null && it.lastLocation != null) {
+                isNeedLocate = false
+            }
+        }
+        if (isNeedLocate) {
+            Logger.d(TAG, "Start positioning...")
+            locationClient.start()
+        }
         map.isMyLocationEnabled = false
         animateToChosenChildPos()
     }
 
     override fun onPause() {
-        Logger.d(TAG, "AMAP onPause")
+        Logger.d(TAG, "BaiduMap 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 marker: Overlay? = null
         var avatarView: ImageView? = null
         private val customMenu: CustomSatelliteMenu? = null
         var info: ChildInfo? = null
         var convertedLatLng: LatLng? = null
         var childInfoView: View? = null
     }
+
+    companion object {
+        const val INIT_LAYER_INDEX = 0
+    }
 }

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

@@ -5,40 +5,32 @@ import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import android.widget.Button
 import android.widget.ImageButton
 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.baidu.mapapi.model.LatLng
+import com.baidu.mapapi.search.core.SearchResult
+import com.baidu.mapapi.search.geocode.GeoCodeResult
+import com.baidu.mapapi.search.geocode.GeoCoder
 import com.sikey.interconnect.R
 import com.sikey.interconnect.app.DataManager
 import com.sikey.interconnect.component.helper.MainHelper
 import com.sikey.interconnect.component.log.Logger
-import com.sikey.interconnect.component.network.RequestManager
 import com.sikey.interconnect.component.network.http.model.ChildInfo
 import com.sikey.interconnect.component.network.http.model.LocationType.TYPE_CELL
 import com.sikey.interconnect.component.network.http.model.LocationType.TYPE_GPS
 import com.sikey.interconnect.component.network.http.model.LocationType.TYPE_WIFI
-import com.sikey.interconnect.constant.RoleTypeConstants.ADMIN
 import com.sikey.interconnect.constant.RoleTypeConstants.FAMILY
 import com.sikey.interconnect.constant.RoleTypeConstants.OTHER
-import com.sikey.interconnect.constant.UrlConstants
-import com.sikey.interconnect.k2.utils.TextUtils
 import com.sikey.interconnect.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
+import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener
+import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption
+import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult
 
 /**
  */
-class ChildInfoPageFragment : Fragment(), OnGeocodeSearchListener {
+class ChildInfoPageFragment : Fragment(), OnGetGeoCoderResultListener {
     private var mDirection: TextView? = null
     private var mAdress: TextView? = null
     private var mTime: TextView? = null
@@ -52,7 +44,7 @@ class ChildInfoPageFragment : Fragment(), OnGeocodeSearchListener {
     private var mAdressStr: String? = null
     private var mChildTrackInfo: ChildInfo? = null
     private var mLocationType: ImageView? = null
-    private lateinit var geocodeSearch: GeocodeSearch
+    private lateinit var geocodeSearch: GeoCoder
 
     fun setOnBtnClickListener(listener: OnBtnClickListener?) {
         mOnBtnClickListener = listener
@@ -253,33 +245,49 @@ class ChildInfoPageFragment : Fragment(), OnGeocodeSearchListener {
 
     private fun getGeoAdress(info: ChildInfo?) {
         Logger.d(TAG, "getAddressFromLocation")
-        geocodeSearch = GeocodeSearch(context)
-        geocodeSearch?.setOnGeocodeSearchListener(this)
-        val latLonPoint = info!!.lastLocation?.lat?.let {
+        geocodeSearch = GeoCoder.newInstance()
+        geocodeSearch?.setOnGetGeoCodeResultListener(this)
+        val latLng = info!!.lastLocation?.lat?.let {
             info.lastLocation?.lng?.let { it1 ->
-                LatLonPoint(
+                LatLng(
                     it.toDouble(), it1.toDouble())
             }
         }
-        val query = RegeocodeQuery(latLonPoint, 200f, GeocodeSearch.AMAP)
-        geocodeSearch?.getFromLocationAsyn(query)
+        latLng?.let {
+            val reverseGeoCodeOption = ReverseGeoCodeOption()
+                .location(it)
+                .radius(200)
+                .newVersion(1)
+            geocodeSearch.reverseGeoCode(reverseGeoCodeOption)
+        } ?: Logger.e(TAG, "无效的经纬度数据")
 
         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 onGetGeoCodeResult(result: GeoCodeResult?) {
+        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
+            Logger.d(TAG, "地理编码失败: ${result?.error}")
+            return
         }
+        val latLng = result.location
+        val address = result.address
+        Logger.d(TAG, "地理编码结果: 地址=$address, 经纬度=$latLng")
     }
 
-    override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) {
-        // This method is not used for reverse geocoding
+    override fun onGetReverseGeoCodeResult(result: ReverseGeoCodeResult?) {
+        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
+            Logger.e(TAG, "逆地理编码失败: ${result?.error}")
+            return
+        }
+        // 获取逆地理编码结果
+        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
+            mAdress!!.text = "No address found"
+            mDirection!!.text = "No address found"
+        } else {
+            Logger.d(TAG, "逆地理编码结果: 地址=${result.address}, 格式化地址=${result.formattedPoiAddress}")
+            mAdress!!.text = result.formattedPoiAddress
+            mDirection!!.text = result.formattedPoiAddress
+        }
     }
 
     interface OnBtnClickListener {

+ 63 - 34
app/src/main/java/com/sikey/interconnect/ui/fragment/main/LocationFragment.kt

@@ -30,17 +30,18 @@ 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.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.GeocodeSearch.OnGeocodeSearchListener
-import com.amap.api.services.geocoder.RegeocodeQuery
-import com.amap.api.services.geocoder.RegeocodeResult
 import com.android.volley.Request
 import com.android.volley.Response
 import com.android.volley.toolbox.JsonObjectRequest
+import com.baidu.mapapi.map.BaiduMap
+import com.baidu.mapapi.map.MapStatus
+import com.baidu.mapapi.model.LatLng
+import com.baidu.mapapi.search.core.SearchResult
+import com.baidu.mapapi.search.geocode.GeoCodeResult
+import com.baidu.mapapi.search.geocode.GeoCoder
+import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener
+import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption
+import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult
 import com.github.pengrad.mapscaleview.MapScaleView
 import com.google.gson.Gson
 import com.sikey.interconnect.R
@@ -83,7 +84,7 @@ import com.sikey.interconnect.ui.adapter.ChildInfoPageAdapter
 import com.sikey.interconnect.ui.avtivity.base.BaseNoActionBarActivity
 import com.sikey.interconnect.ui.avtivity.component.right.BabyListActivity
 import com.sikey.interconnect.ui.avtivity.component.right.ScanQRCodeActivity
-import com.sikey.interconnect.ui.avtivity.main.AMapFragment
+import com.sikey.interconnect.ui.avtivity.main.BaiduMapFragment
 import com.sikey.interconnect.ui.avtivity.main.DispatchActivity
 import com.sikey.interconnect.ui.fragment.avatar.ChildInfoPageFragment.OnBtnClickListener
 import com.sikey.interconnect.update.VersionUpdate
@@ -107,15 +108,15 @@ import java.util.UUID
  * Created by bruce on 2017/11/22.
  */
 class LocationFragment : Fragment(), ICurrentChildObserver, View.OnClickListener,
-    Listener.LocationListener, AMap.OnCameraChangeListener, OnGeocodeSearchListener {
+    Listener.LocationListener, BaiduMap.OnMapStatusChangeListener, OnGetGeoCoderResultListener {
 
 
     private val TAG = LocationFragment::class.java.simpleName
 
-    private var mapFragment: AMapFragment? = null
+    private var mapFragment: BaiduMapFragment? = null
     private var mNoMapLayout: FrameLayout? = null
     private var mImgNoMap: ImageView? = null
-    private var mMap: AMap? = null
+    private var mMap: BaiduMap? = null
     internal var scaleView: MapScaleView? = null
     //private var mMultiViewPager: MultiViewPager? = null
     private var mAdapter: ChildInfoPageAdapter? = null
@@ -182,7 +183,7 @@ class LocationFragment : Fragment(), ICurrentChildObserver, View.OnClickListener
     private var mNavigation: ImageButton? = null
     private var mIndex = 0
     private var mLocationType: ImageView? = null
-    private lateinit var geocodeSearch: GeocodeSearch
+    private lateinit var geocodeSearch: GeoCoder
     private var mVgCover: View? = null
     private var mUnbind: View? = null
     private var mNoPermission: View? = null
@@ -398,7 +399,7 @@ 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 AMapFragment?
+        mapFragment = childFragmentManager.findFragmentById(R.id.map) as BaiduMapFragment?
         //mapFragment?.getMapAsync(this)
 
         mNoMapLayout = root.findViewById(R.id.lyt_no_map)
@@ -564,33 +565,50 @@ class LocationFragment : Fragment(), ICurrentChildObserver, View.OnClickListener
 
     private fun getGeoAdress(info: ChildInfo?) {
         Logger.d(TAG, "getAddressFromLocation")
-        geocodeSearch = GeocodeSearch(context)
-        geocodeSearch?.setOnGeocodeSearchListener(this)
-        val latLonPoint = info!!.lastLocation?.lat?.let {
+        geocodeSearch = GeoCoder.newInstance()
+        geocodeSearch.setOnGetGeoCodeResultListener(this)
+        val latLng = info!!.lastLocation?.lat?.let {
             info.lastLocation?.lng?.let { it1 ->
-                LatLonPoint(
+                LatLng(
                     it.toDouble(), it1.toDouble())
             }
         }
-        val query = RegeocodeQuery(latLonPoint, 200f, GeocodeSearch.AMAP)
-        geocodeSearch?.getFromLocationAsyn(query)
+
+        latLng?.let {
+            val reverseGeoCodeOption = ReverseGeoCodeOption()
+                .location(it)
+                .radius(200)
+                .newVersion(1)
+            geocodeSearch.reverseGeoCode(reverseGeoCodeOption)
+        } ?: Logger.e(TAG, "无效的经纬度数据")
 
         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 onGetGeoCodeResult(result: GeoCodeResult?) {
+        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
+            Logger.d(TAG, "地理编码失败: ${result?.error}")
+            return
         }
+        val latLng = result.location
+        val address = result.address
+        Logger.d(TAG, "地理编码结果: 地址=$address, 经纬度=$latLng")
     }
 
-    override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) {
-        // This method is not used for reverse geocoding
+    override fun onGetReverseGeoCodeResult(result: ReverseGeoCodeResult?) {
+        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
+            Logger.e(TAG, "逆地理编码失败: ${result?.error}")
+            return
+        }
+        // 获取逆地理编码结果
+        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
+            mAdress!!.text = "No address found"
+            mDirection!!.text = "No address found"
+        } else {
+            Logger.d(TAG, "逆地理编码结果: 地址=${result.address}, 格式化地址=${result.formattedPoiAddress}")
+            mAdress!!.text = result.formattedPoiAddress
+            mDirection!!.text = result.formattedPoiAddress
+        }
     }
 
     override fun onDetach() {
@@ -1456,14 +1474,25 @@ class LocationFragment : Fragment(), ICurrentChildObserver, View.OnClickListener
             mapFragment?.let { DataManager.instance.registerAvatarObserver(it) }
         }*/
 
-    override fun onCameraChangeFinish(p0: CameraPosition) {
-        scaleView?.update(p0.zoom, p0.target.latitude)
+    override fun onMapStatusChangeStart(p0: MapStatus?) {
+        Logger.d(TAG, "onMapStatusChangeStart latitude:${p0!!.target.latitude}")
+        scaleView?.update(p0!!.zoom, p0.target.latitude)
     }
 
-    override fun onCameraChange(p0: CameraPosition) {
-        scaleView?.update(p0.zoom, p0.target.latitude)
+    override fun onMapStatusChangeStart(p0: MapStatus?, p1: Int) {
+        Logger.d(TAG, "onMapStatusChangeStart(p0: MapStatus?, p1: Int) latitude:${p0!!.target.latitude}")
+        scaleView?.update(p0!!.zoom, p0.target.latitude)
     }
 
+    override fun onMapStatusChange(p0: MapStatus?) {
+        Logger.d(TAG, "onMapStatusChange latitude:${p0!!.target.latitude}")
+        scaleView?.update(p0!!.zoom, p0.target.latitude)
+    }
+
+    override fun onMapStatusChangeFinish(p0: MapStatus?) {
+        Logger.d(TAG, "onMapStatusChangeFinish latitude:${p0!!.target.latitude}")
+        scaleView?.update(p0!!.zoom, p0.target.latitude)
+    }
 
     internal inner class MyCountDownTimer
     /**

+ 3 - 10
app/src/main/res/layout/activity_fence_setting.xml

@@ -6,7 +6,6 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-
     <RelativeLayout
         android:id="@+id/toolBarLayout"
         android:layout_width="match_parent"
@@ -40,13 +39,11 @@
         android:layout_above="@+id/seekbarLyt"
         tools:context="com.sikey.interconnect.ui.avtivity.component.fence.FenceSettingActivity">
 
-
-
-        <fragment xmlns:android="http://schemas.android.com/apk/res/android"
-            android:id="@+id/map"
+        <com.baidu.mapapi.map.MapView
+            android:id="@+id/bmapView"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            class="com.amap.api.maps.SupportMapFragment" />
+            android:clickable="true" />
 
         <ImageView
             android:id="@+id/showFenceImageView"
@@ -55,9 +52,6 @@
             android:src="@drawable/transparent_rect"
             />
 
-
-
-
         <ImageView
             android:id="@+id/locateImageView"
             android:src="@drawable/k2_app_leftmenu_location_normal"
@@ -70,7 +64,6 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content" />
 
-
     </com.sikey.interconnect.ui.custom.layout.DrawFenceRelativeLayout>
 
     <CheckBox

+ 4 - 5
app/src/main/res/layout/activity_mdpath_history.xml

@@ -28,14 +28,13 @@
         android:background="@color/white"
         android:scrollbars="none"/>
 
-
-    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/map"
+    <com.baidu.mapapi.map.MapView
+        android:id="@+id/bmapView"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_below="@id/day_list"
-        android:layout_above="@+id/seekBarContainer"
-        class="com.amap.api.maps.SupportMapFragment" />
+        android:layout_above="@id/seekBarContainer"
+        android:clickable="true" />
 
     <RelativeLayout
         android:id="@+id/lyt_location_setting"

+ 1 - 1
app/src/main/res/layout/child_track_amap_layout.xml → app/src/main/res/layout/baidumap_layout.xml

@@ -3,7 +3,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <com.amap.api.maps.MapView
+    <com.baidu.mapapi.map.MapView
         android:id="@+id/mapView"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />

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

@@ -20,7 +20,7 @@
 
         <fragment
             android:id="@+id/map"
-            class="com.sikey.interconnect.ui.avtivity.main.AMapFragment"
+            class="com.sikey.interconnect.ui.avtivity.main.BaiduMapFragment"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
 

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

@@ -54,7 +54,7 @@
             android:layout_centerVertical="true"
             android:textSize="@dimen/text_size_medium"
             android:textColor="@color/gray_60"
-            android:text="@string/map_amap"/>
+            android:text="@string/map_baidumap"/>
 
     </RelativeLayout>
 

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

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

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

@@ -691,6 +691,7 @@
     <string name="navigate_to_child">導航到寶寶所在的位置</string>
     <string name="map_googlemap">穀歌地圖</string>
     <string name="map_amap">高德地图</string>
+    <string name="map_baidumap">百度地圖</string>
     <string name="map_baidu_err">未安裝百度地圖該功能不可用</string>
     <string name="map_gaode_err">未安裝高德地圖該功能不可用</string>
     <string name="map_google_err">未安裝穀歌地圖該功能不可用</string>

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

@@ -689,6 +689,7 @@
     <string name="navigate_to_child">導航到寶寶所在的位置</string>
     <string name="map_googlemap">穀歌地圖</string>
     <string name="map_amap">高德地图</string>
+    <string name="map_baidumap">百度地圖</string>
     <string name="map_baidu_err">未安裝百度地圖該功能不可用</string>
     <string name="map_gaode_err">未安裝高德地圖該功能不可用</string>
     <string name="map_google_err">未安裝穀歌地圖該功能不可用</string>

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

@@ -1,6 +1,7 @@
 <resources>
     <string name="title_activity_base">BaseActivity</string>
     <string name="title_activity_signup">Sign up</string>
+    <string name="baidu_api_key">X1IznawNOLmqiPY9xEgmFx5kHoWNne7k</string>
 
     <!--strings of left Menu-->
 
@@ -760,6 +761,7 @@
     <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_baidumap">Baidu 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>