问题描述
我想在用户当前位置的一定半径内搜索附近的地方(例如:医院,学校,综合诊所等)。 我已经成功地获得了用户的当前位置,但是不知道如何在半径范围内寻找附近的位置。 我已经成功设置了html属性来获取附近的地方,如下所示: https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${location.latitude},${location.longitude}&radius=1500&type=restaurant&key=YOUR_API_KEY (我已放好钥匙)
但是我似乎不知道我在哪里以及如何实现此网址。仅当有人告诉我如何使用此URL时。那也可能有很大帮助! 谢谢!
这是我目前的代码:
package com.sampathpatro.vipalsiddh
import android.content.pm.PackageManager
import android.location.Address
import android.location.Geocoder
import android.location.Location
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.Marker
import com.google.android.gms.maps.model.MarkerOptions
import java.io.IOException
class MapsActivity : AppCompatActivity(),OnMapReadyCallback,GoogleMap.OnMarkerClickListener {
private lateinit var map: GoogleMap
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
private lateinit var lastLocation: Location
private fun placeMarkerOnMap(location: LatLng){
val markerOptions = MarkerOptions().position(location)
val titleString = getAddress(location)
markerOptions.title(titleString)
map.addMarker(markerOptions)
}
private fun getAddress(latLng: LatLng): String {
val geocoder = Geocoder (this)
val addresses: List<Address>
val address: Address?
var addresstext = ""
try {
addresses = geocoder.getFromLocation(latLng.latitude,latLng.longitude,1)
if (null != addresses && addresses.isNotEmpty()){
address = addresses[0]
for (i in 0 until address.maxAddressLineIndex){
addresstext += if (i==0) address.getAddressLine(i) else
"\n" + address.getAddressLine(i)
}
}
} catch (e: IOException){
Log.e("MapsActivity",e.localizedMessage)
}
return addresstext
}
companion object {
private const val LOCATION_PERMISSION_REQUEST_CODE = 1
}
private fun setUpMap() {
if(ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),LOCATION_PERMISSION_REQUEST_CODE)
return
}
map.isMyLocationEnabled = true
fusedLocationProviderClient.lastLocation.addOnSuccessListener(this) { location ->
if (location != null){
lastLocation = location
val currentLatLng = LatLng(location.latitude,location.longitude)
placeMarkerOnMap(currentLatLng)
map.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng,12f))
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_maps)
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
}
/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines,add listeners or move the camera. In this case,* we just add a marker near Sydney,Australia.
* If Google Play services is not installed on the device,the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
*/
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
map.uiSettings.isZoomControlsEnabled = true
map.setonMarkerClickListener(this)
setUpMap()
}
override fun onMarkerClick(p0: Marker?) = false
} ```
解决方法
使用OkHttp库安全地进行API调用。 将库包含在gradle文件中
将GSON
库与它配合使用,它将为您带来方便,为简单起见,我将简单地通过JSONObject
使它起作用
在模块级别gradle中,包括此
implementation("com.squareup.okhttp3:okhttp:4.8.1")
使用此方法进行通话
fun makeApiCall(location:Location){
val request = Request.Builder().url("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${location.latitude},${location.longitude}&radius=1500&type=restaurant&key=YOUR_API_KEY")
.build()
val response = OkHttpClient().newCall(request).execute().body().string()
val jsonObject = JSONObject(response) // This will make the json below as an object for you
// You can access all the attributes,nested ones using JSONArray and JSONObject here
}
当您进行api调用时,您会得到类似这样的响应
{
"debug_log" : {
"line" : []
},"html_attributions" : [],"logging_info" : {
"experiment_id" : [],"query_geographic_location" : "AU"
},"results" : [
{
"geometry" : {
"location" : {
"lat" : -33.86879,"lng" : 151.194217
}
},"icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png","id" : "21a0b251c9b8392186142c798263e289fe45b4aa","name" : "Rhythmboat Cruises","opening_hours" : {
"open_now" : false,"weekday_text" : []
},"photos" : [
{
"height" : 426,"html_attributions" : [
"\u003ca href=\"https://www.google.com/maps/views/profile/104066891898402903288\"\u003eRhythmboat Cruises\u003c/a\u003e"
],"photo_reference" : "CmRdAAAA-YL_I_Gk02blOX6S0nKHry8PFu9pDyp3Y9AnqISsa3Eq8mkbdD5mXuu1Fax60s0nSy3iiX-h5j-ztyLHcc1-782MsLQsgLLa4t3ZgDmCMll-a8ABapZGnZwDKByk67LFEhBgedv_u_eYFsEo9ay8jxJjGhTUHKPJ4G82vBJqSNliuv7UlAtclw","width" : 640
}
],"place_id" : "ChIJyWEHuEmuEmsRm9hTkapTCrk","reference" : "CnRmAAAAvQlMKw-XtxEY4vWFCvudF7CEMQGI5ycNbfVgGl9rAF75fdiPOiLJw1k9NL2v8ZIJsOJuRS3Lm9Dw1vga4ajycAs7PlxN1MVnnYT9la0pBvEvSQNlyvszKANS1R4P7Mvk_jhqswMggqCUtwJ13LN2hRIQOiAkLTWUi3DOjVVOw7J5IRoUb_cJyJaJNqKdmkDM2f0OjQjh9F0","scope" : "GOOGLE","types" : [ "restaurant","food","point_of_interest","establishment" ],"vicinity" : "Pyrmont Bay Wharf (Near Australia Maritime Museum),Pyrmont,NSW 2009"
},{
"geometry" : {
"location" : {
"lat" : -33.867591,"lng" : 151.201196
}
},"id" : "a97f9fb468bcd26b68a23072a55af82d4b325e0d","name" : "Australian Cruise Group","photos" : [
{
"height" : 1331,"html_attributions" : [
"\u003ca href=\"https://www.google.com/maps/views/profile/110751364053842618118\"\u003eAustralian Cruise Group\u003c/a\u003e"
],"photo_reference" : "CmRdAAAAtEoj29FJcNBccrsu6bHt0xgwVGhYlciCY1fe6gTr_d5_KkeP3LITnOwnpNRJWnX39B04-aIBOKXKJH6ltx948T5vWIYBoah1yZDXsWngWZ5kMsK7xyCB5P_q_xBIBxxUEhAYWeB4PiOm_Jy093fB-j0iGhSYmIs9xB2aa6u-RH8V8lZEk-Q5ig","width" : 2000
}
],"place_id" : "ChIJrTLr-GyuEmsRBfy61i59si0","reference" : "CnRqAAAAFbukrZvRNsc05TreHUCrPEya5NcN9v0fFLLaK-D1fSyxFTuQlUDhDstU3qwXKw_fADX4W6guUkexax1nufgiYIuGCKoZPEnup1r-LhGGNz9dn1uf9Of5iOtZ1XgCeDjJaYvGbSB3C0pAXL8r9kOsmhIQbx2Sia2DAWTjtSZwuh5aehoUhM6upqBCDLhGruZAGGsCOwAiIq8","types" : [
"restaurant","travel_agency","establishment"
],"vicinity" : "32 The Promenade,King Street Wharf 5,Sydney"
},{
"geometry" : {
"location" : {
"lat" : -33.870943,"lng" : 151.190311
}
},"icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/bar-71.png","id" : "e644f7f34cf875b9919c6548f1b721947362850a","name" : "Lunch Cruise with Jazz on Sydney Harbour","photos" : [
{
"height" : 292,"html_attributions" : [
"\u003ca href=\"https://www.google.com/maps/views/profile/105423912060796272053\"\u003eFrom a Google User\u003c/a\u003e"
],"photo_reference" : "CmRdAAAAR4bqFTKYWdBwZwdBdON_JRD7V_joTwwIPwRUpZIZWkSSd8GQ3P2O-_aQbUJdL2RhoAyzCUIF0f--DI4oXFneTpj5zZfFq-iFiT7i_x0tjnDveIY8tJv-6o0uWSSjYqabEhCKqQWZqrKAoddjDcc64N48GhQZ2T1_ntPzNKCooHpZzlYQ7AxFOA","width" : 438
}
],"place_id" : "ChIJLfySpTOuEmsRPCRKrzl8ZEY","reference" : "CoQBewAAAFd2fO_YWGTiT4RzXWb5tsOuOt7YyV_ScQOwm0tqJSrAyACCczeOzV-P_mgZLro1oKP_34Nt0nVC_1OEKAQUcd7cUm7xmAMSX-EkbSWiD0kOWGgGgKuDRtb0t_8qsxBGU_izugWCyK7SRWezTxELYNdkS0OEiSWPnvhxvXuQktBBEhAAtEe7fagW2kUR14T1QpVsGhQBO7YpIyYSPvo4zUJuL_bX30nJZw","types" : [ "bar","restaurant","vicinity" : "37 Bank St,Pyrmont"
}
],"status" : "OK"
}