我正在开发其中包含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)
}
}
您没有将活动设置为位置监听器。您的活动实现了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}")
}