未触发地图位置更改侦听器

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

我正在开发其中包含Google地图的应用程序。地图可以找到我的位置并在其上标记。但是我写了onLocationChangeListener和。敬酒以显示我的坐标(经度高度)。但这并没有在屏幕上呈现任何敬酒,我也不明白为什么。它应该进行敬酒,以显示我的更改和第一次发现时的坐标。

MapsActivity

class MapsActivity : AppCompatActivity(), OnMapReadyCallback, IOnLoadLocationListener,
     GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    com.google.android.gms.location.LocationListener{

    private var mMap: GoogleMap? = null
    private lateinit var locationRequest: LocationRequest
    private lateinit var locationCallback: LocationCallback
    private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
    private var currentMarker: Marker? = null
    private lateinit var myLocationRef: DatabaseReference
    private lateinit var dangerousArea: MutableList<LatLng>
    private lateinit var listener: IOnLoadLocationListener
    private var photoUrl: String? = null
    private lateinit var myCity: DatabaseReference
    private lateinit var lastLocation: Location
    private var geoQuery: GeoQuery? = null
    private lateinit var geoFire: GeoFire
    private lateinit var locationManager: LocationManager
    private lateinit var latLng: LatLng
    private lateinit var location: Location
    private lateinit var locationListener: LocationListener
    private lateinit var mLocation : Location
    private lateinit var mGoogleApiClient : GoogleApiClient
    private var UPDATE_INTERVAL: Long = 2000
    private var FASTEST_INTERVAL: Long = 5000


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(com.example.huaweichallange.R.layout.activity_maps)

        val personInfo = intent.extras!!.get("extra") as UserInfoModel
        photoUrl = personInfo.personPhoto


        Dexter.withActivity(this)
            .withPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
            .withListener(object : PermissionListener {
                override fun onPermissionGranted(response: PermissionGrantedResponse?) {
                    buildLocationRequest()
                    buildLocationCallBack()
                    fusedLocationProviderClient =
                        LocationServices.getFusedLocationProviderClient(this@MapsActivity)
                    initArea()
                    settingGeoFire()
                }

                override fun onPermissionRationaleShouldBeShown(
                    permission: com.karumi.dexter.listener.PermissionRequest?,
                    token: PermissionToken?
                ) {

                }

                override fun onPermissionDenied(response: PermissionDeniedResponse?) {
                    Toast.makeText(
                        this@MapsActivity,
                        "You must enable this permission",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }).check()



    }

    private fun settingGeoFire() {
        myLocationRef = FirebaseDatabase.getInstance().getReference("MyLocation")
        geoFire = GeoFire(myLocationRef)
    }

    private fun initArea() {
        myCity = FirebaseDatabase.getInstance()
            .getReference("DangerousArea").child("MyCity")

        listener = this

        myCity.addValueEventListener(object : ValueEventListener {
            override fun onCancelled(p0: DatabaseError) {

            }

            override fun onDataChange(dataSnapshot: DataSnapshot) {
                val latLngList = ArrayList<MyLatlng>()
                for (locationSnapShot in dataSnapshot.children) {
                    val latLng = locationSnapShot.getValue(MyLatlng::class.java)
                    latLngList.add(latLng!!)
                }
                listener.onLocationLoadSuccess(latLngList)
            }

        })
    }

    private fun buildLocationCallBack() {
        locationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult?) {
                super.onLocationResult(locationResult)
                if (mMap != null) {
                    lastLocation = locationResult!!.lastLocation
                    addUserMarker()
                }
            }
        }
    }

    private fun addUserMarker() {

        geoFire.setLocation(
            "You",
            GeoLocation(lastLocation.latitude, lastLocation.longitude)
        ) { _, _ ->
            if (currentMarker != null) currentMarker!!.remove()
            currentMarker = mMap!!.addMarker(
                MarkerOptions().position(
                    LatLng(
                        lastLocation.latitude,
                        lastLocation.longitude
                    )
                ).title("You").icon(BitmapDescriptorFactory.fromBitmap(getBitmap(photoUrl)))
            )
            mMap!!.animateCamera(CameraUpdateFactory.newLatLngZoom(currentMarker!!.position, 12.0f))

        }
    }
    fun getBitmap(url : String?) : Bitmap? {
        var bmp : Bitmap ? = null
        Picasso.get().load(url).into(object : com.squareup.picasso.Target {
            override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
                bmp =  bitmap
            }

            override fun onPrepareLoad(placeHolderDrawable: Drawable?) {}

            override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {}
        })
        return bmp
    }

    private fun buildLocationRequest() {
        locationRequest = LocationRequest()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = 500
        locationRequest.fastestInterval = 300
        locationRequest.smallestDisplacement = 5f

    }

    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap

        mMap!!.uiSettings.isZoomControlsEnabled = true


        if (fusedLocationProviderClient != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
                    return
            }
            fusedLocationProviderClient.requestLocationUpdates(
                locationRequest,
                locationCallback,
                Looper.myLooper()

            )
        }
       val pref= [email protected]("darkMode", Context.MODE_PRIVATE)
        val darkMode = pref.getString("darkMode","dark")
        if(darkMode!=null){
            useDarkMode(googleMap)
        }


    }

    private fun useDarkMode(googleMap: GoogleMap?) {
        try {
            val success : Boolean = googleMap!!.setMapStyle(
                MapStyleOptions.
            loadRawResourceStyle(this, com.example.huaweichallange.R.raw.map_style))
        }
        catch (e: Resources.NotFoundException){
            Log.e("MapActivity","Map Style Cannot found")
        }
    }


    override fun onLocationLoadSuccess(latLng: List<MyLatlng>) {
        dangerousArea = ArrayList()
        for (myLatLng in latLng) {
            val convert = LatLng(myLatLng.latitude, myLatLng.longitude)

            dangerousArea.add(convert)
        }
        val mapFragment = supportFragmentManager
            .findFragmentById(com.example.huaweichallange.R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)
        if (mMap != null) {
            mMap!!.clear()

            addUserMarker()

        }

    }


    override fun onLocationLoadFailed(message: String) {
        Toast.makeText(this, "" + message, Toast.LENGTH_SHORT).show()
    }

    override fun onStop() {
        fusedLocationProviderClient.removeLocationUpdates(locationCallback)
        super.onStop()
    }


    override fun onConnected(p0: Bundle?) {

    }

    override fun onConnectionSuspended(p0: Int) {

    }

    override fun onConnectionFailed(p0: ConnectionResult) {

    }

    override fun onLocationChanged(location: Location?) {


        val msg : String = "Updated Location: " + lastLocation!!.longitude+","+ lastLocation!!.latitude
        Toast.makeText(this@MapsActivity, msg.toDouble().toString(), Toast.LENGTH_SHORT).show()


        latLng = LatLng(location!!.latitude, location!!.longitude)

        val mapFragment : SupportMapFragment = supportFragmentManager.findFragmentById(com.example.huaweichallange.R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)

    }

}
java android google-maps bitmap location
1个回答
0
投票

您没有将活动设置为位置监听器。您的活动实现了com.google.android.gms.location.LocationListener接口,但是您正在向locationCallback传递另一个回调(fusedLocationProviderClient):

fusedLocationProviderClient.requestLocationUpdates(
    locationRequest,
    locationCallback, // you should replace this with your activity instance
    Looper.myLooper()
)

至:

fusedLocationProviderClient.requestLocationUpdates(
    locationRequest,
    this, // your activity instance - this
    Looper.myLooper()
)

然后您应该在onLocationChanged回调中拦截位置更改:

override fun onLocationChanged(location: Location?) {
   Log.v("your_tag", "Latitude:${location.latitude}, Longitude:${location.longitude}")
}
© www.soinside.com 2019 - 2024. All rights reserved.