问题描述
大家好,
我已经从类似于以下内容的教程中构建了代码。但是,使用新的Kotlin更新,它将不允许您运行 fusedLocationProviderClient.requestLocationUpdates( parameters ),而无需进行权限检查,我不确定该如何实施。不过应该很简单。
我的问题是,在下面的 getNewLocation()函数中,处理器未运行到 fusedLocationProviderClient !!。requestLocationUpdates (参数)以及与其关联的回调(没有错误显示,或者没有打印声明也没有指示)。这是一个主要问题,因为这意味着如果初始请求返回NULL,我将无法访问用户位置。
我真的希望在那里遇到同样的问题,以便我能帮助您解决这个令人沮丧的漏洞。
代码如下:
class MainActivity : AppCompatActivity() {
lateinit var fusedLocationProviderClient: FusedLocationProviderClient
lateinit var locationRequest: LocationRequest
//Permission id
private var PERMISSION_ID = 1000
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Initiate Fused Location Provider Client
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
btnLocation.setonClickListener {
getLastLocation()
}
}
//Function to get last location
@SuppressLint("MissingPermission","SetTextI18n")
private fun getLastLocation() {
if(CheckPermission()) {
if(isLocationEnabled()) {
fusedLocationProviderClient.lastLocation.addOnCompleteListener {task ->
var location = task.result
if(location == null) {
getNewLocation()
} else {
tv_location.text = "Your current coordinates are :\nLat: " + location.latitude + " ; Long: " + location.longitude +
"\nYour City: " + getCityName(location.latitude,location.latitude) + ",Your Country: " + getCountryName(location.latitude,location.longitude)
}
}
} else {
Toast.makeText(this,"Please enable your location service",Toast.LENGTH_LONG).show()
}
} else {
RequestPermission()
}
}
@SuppressLint("MissingPermission")
private fun getNewLocation() {
locationRequest = LocationRequest()
locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
locationRequest.interval = 0
locationRequest.fastestInterval = 0
locationRequest.numUpdates = 2
fusedLocationProviderClient!!.requestLocationUpdates(
locationRequest,locationCallback,Looper.myLooper()
)
}
private val locationCallback = object : LocationCallback() {
@SuppressLint("SetTextI18n")
override fun onLocationResult(p0: LocationResult?) {
var lastLocation = p0?.lastLocation
if (lastLocation != null) {
tv_location.text = "Your current coordinates are :\nLat: " + lastLocation.latitude + " ; Long: " + lastLocation.longitude +
"\nYour City: " + getCityName(lastLocation.latitude,lastLocation.longitude) + ",Your Country: " + getCountryName(lastLocation.latitude,lastLocation.longitude)
}
}
}
//Check user permission
private fun CheckPermission():Boolean {
if(
ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
) {
return true
}
return false
}
//Get user permission
private fun RequestPermission() {
ActivityCompat.requestPermissions(
this,arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.permission.ACCESS_COARSE_LOCATION),PERMISSION_ID
)
}
//Check location service
private fun isLocationEnabled():Boolean {
var locationManager :LocationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
}
private fun getCityName(lat:Double,lon:Double):String {
var CityName = ""
var geoCoder = Geocoder(this,Locale.getDefault())
var Adress = geoCoder.getFromLocation(lat,lon,1)
CityName = Adress.get(0).locality
return CityName
}
private fun getCountryName(lat:Double,lon:Double):String {
var CountryName = ""
var geoCoder = Geocoder(this,1)
CountryName = Adress.get(0).countryName
return CountryName
}
//Built in function to check permission result
//Used it just for debugging
override fun onRequestPermissionsResult(
requestCode: Int,permissions: Array<out String>,grantResults: IntArray
) {
if (requestCode == PERMISSION_ID) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d("Debug:","You have the permission")
}
}
}
}
解决方法
您需要在Androidmenifest.xml文件中添加这两个权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />