android - Kotlin:如何获取纬度和经度以有意调用谷歌地图?
问题描述
我有这样的代码
//onCreate()
btnmap.setOnClickListener{
viewMap()
}
//end of onCreate()
var MyLongitude:Double? = null
var Mylatitude:Double? = null
fun location(){
var locationListener = object : LocationListener {
override fun onLocationChanged(locationn: Location?) {
Mylongitude = locationn!!.longitude //i want to take this value
Mylatitude = locationn.latitude //i want to take this value
}
....
}
}
fun viewMap(){
Log.i(LOG, "$MyLongitude, $Mylatitude") //the output is null, null
val gmmIntentUri = Uri.parse("google.streetview:cbll=$MyLatitude,$MyLongitude")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent)
}
我想调用谷歌地图以了解我现在的位置,为此我需要 location() 中的纬度和经度值,如果我在 viewMap() 中调用 Log MyLatitude 和 MyLongitude 时看到我的代码即使之前在 location() 中给定了一个值,输出也始终为空
我尝试在 location() 中的 onLocationChanged() 中调用 viewMap() 并获得纬度和经度的值,但这使得我的应用程序总是在每次位置更改时自动调用谷歌地图
通常,当我按下按钮 btnmap 时,我的应用程序会调用谷歌地图
那么,如何从 location() 函数中为 viewMap() 中的意图获取纬度和经度值?
解决方案
您可以从此处了解有关用户位置的更多信息。要获取当前位置,您必须询问用户权限并在AndroidManifest.xml
文件中定义它:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
在您的Activity's onCreate()
方法中定义以下内容:
val permissionState = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
if (permissionState != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), REQUEST_PERMISSIONS_REQUEST_CODE)
}
并覆盖onRequestPermissionsResult
这里的功能:
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
when (requestCode) {
REQUEST_PERMISSIONS_REQUEST_CODE -> {
if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
getLocation()
}
}
}
因此,这是获取用户位置的主要部分。为了简单起见,这里是完整的代码:
class MainActivity : AppCompatActivity() {
companion object {
private const val REQUEST_PERMISSIONS_REQUEST_CODE = 1
}
private lateinit var txtView: TextView
private lateinit var fusedLocationClient: FusedLocationProviderClient
private var myLongitude: Double? = null
private var myLatitude: Double? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
txtView = findViewById(R.id.txtView)
txtView.setOnClickListener {
viewMap()
}
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
val permissionState = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
if (permissionState != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), REQUEST_PERMISSIONS_REQUEST_CODE)
}
if (myLatitude == null || myLatitude == null)
getLocation()
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
when (requestCode) {
REQUEST_PERMISSIONS_REQUEST_CODE -> {
if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
getLocation()
}
}
}
private fun viewMap() {
Log.i("LOG", "$myLongitude, $myLatitude")
val gmmIntentUri = Uri.parse("google.streetview:cbll=$myLatitude,$myLongitude")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent)
}
@SuppressLint("MissingPermission")
private fun getLocation() {
fusedLocationClient.lastLocation.addOnSuccessListener { location : Location? ->
location?.let {
myLongitude = it.longitude
myLatitude = it.latitude
}
}
}
}
有关用户位置的更多详细信息,请参阅上面的链接,有很多学习资料。