FusedLocations在map.isMyLocationEnabled = false时不发送位置更新。奇怪的行为

问题描述 投票:0回答:1

我想添加自定义图像作为我的位置指示器。隐藏蓝点的唯一方法是setIsMyLocationEnabled = false。这样做也会从FusedLocation禁用更新。我想知道这是故意的还是一个错误?

等级-

implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.google.android.gms:play-services-location:17.0.0'

活动(删除了不必要的代码)-

class MapsActivity : AppCompatActivity(), OnMapReadyCallback {

    private lateinit var mMap: GoogleMap
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_maps)

        val mapFragment = supportFragmentManager
            .findFragmentById(R.id.map) as SupportMapFragment
        startLocationUpdate()
        mapFragment.getMapAsync(this)
    }

    private var marker: Marker? = null
    private var lastLocation: Location? = null

    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap
        val sydney = LatLng(-34.0, 151.0)
        val icon = BitmapDescriptorFactory.fromResource(R.drawable.ic_location_indicator)
        val location = lastLocation?.let { LatLng(it.latitude, it.longitude) } ?: sydney
        val markerOpts = MarkerOptions().position(location).flat(true).anchor(0.5f, 0.5f)
            .icon(icon)
        marker = mMap.addMarker(markerOpts)
        val cameraPosition = CameraPosition.builder().zoom(17f).target(location).build()
        mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
        mMap.isMyLocationEnabled = false // disabling MyLocation here stops FusedLocation updates
        mMap.uiSettings.isMyLocationButtonEnabled = true
    }


    fun startLocationUpdate() {
        val fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
        fusedLocationClient.lastLocation
            .addOnSuccessListener { location: Location? ->
                lastLocation = location
            }

        val locationRequest = LocationRequest()
        locationRequest.fastestInterval = 1000
        locationRequest.smallestDisplacement = 0f
        fusedLocationClient.requestLocationUpdates(locationRequest, object :
            LocationCallback() {
            override fun onLocationResult(p0: LocationResult?) {
                // Never gets called when mMap.isMyLocationEnabled = false but works properly
                // if mMap.isMyLocationEnabled = true. 
                marker?.position = LatLng(p0.lastLocation.latitude, p0.lastLocation.longitude)
                val cameraPosition = CameraPosition.builder().target(latlng).zoom(17f).build()
                mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
            }
        }, Looper.getMainLooper())

    }
}

布局-

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.temp.MapsActivity" />
android google-maps fusedlocationproviderapi android-fusedlocation
1个回答
0
投票

问题出在位置请求中。默认情况下,LocationRequest的优先级较低,因此它不会经常更新。

设置为mMap.isMyLocationEnabled = false时,它的默认优先级较低。仅添加两行即可解决问题。

  1. locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
  2. locationRequest.interval = 5000
© www.soinside.com 2019 - 2024. All rights reserved.