谷歌放置API返回单一类型“car_repair”

我正在使用Google Places API,它将返回我所在位置的所有位置。 但是我只想让它返回一个“汽车维修”的类型我想我几乎拥有它但我错过了一些东西,如果有人能指导我在正确的方向它会很棒:)

我的代码到目前为止PlacPickerActivity

import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.Html; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.common.GooglePlayServicesRepairableException; import com.google.android.gms.location.places.Place; import com.google.android.gms.location.places.ui.PlacePicker; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; public class PlacePickerActivity extends AppCompatActivity { private static final int PLACE_PICKER_REQUEST = 1; String url="https://maps.googleapis.com/maps/api/place/textsearch/json?type=car_repair&key=AIzaSyBKsTtLyMBQH8mhvbknJ4MvZwACotmeYO0"; private TextView mName; private TextView mAddress; private TextView mAttributions; private TextView mNumber; private static final LatLngBounds Sligo = new LatLngBounds( new LatLng(54.27, -8.47), new LatLng(54.27, -8.47)); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_place_picker); mName = (TextView) findViewById(R.id.textView); mAddress = (TextView) findViewById(R.id.textView2); mAttributions = (TextView) findViewById(R.id.textView3); mNumber = (TextView) findViewById(R.id.textView4); Button pickerButton = (Button) findViewById(R.id.pickerButton); pickerButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { PlacePicker.IntentBuilder intentBuilder = new PlacePicker.IntentBuilder(); intentBuilder.setLatLngBounds(Sligo); Intent intent = intentBuilder.build(PlacePickerActivity.this); startActivityForResult(intent, PLACE_PICKER_REQUEST); } catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException e) { e.printStackTrace(); } } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PLACE_PICKER_REQUEST && resultCode == Activity.RESULT_OK) { final Place place = PlacePicker.getPlace(this, data); final CharSequence name = place.getName(); final CharSequence address = place.getAddress(); final CharSequence formatted_phone_number = place.getPhoneNumber(); String attributions = (String) place.getAttributions(); if (attributions == null) { attributions = ""; } mName.setText(name); mAddress.setText(address); mAttributions.setText(Html.fromHtml(attributions)); mNumber.setText(formatted_phone_number); } else { super.onActivityResult(requestCode, resultCode, data); } } } 

清单文件

                 

当我在我的PC上的浏览器中输入URL时,它返回我所在区域中的所有类型“car_repair”,因此我的API密钥确实有效 在此处输入图像描述

尝试使用类似于此的查询:位置的格式为纬度,经度……并且要小心“类型”不是类型。

 https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=54.27,-8.47&radius=1000&types=car_repair&key=AddYourOwnKeyHere 

因为此API在范围内返回地点类型。 有一种方法可能会改善结果,但仍然不是最佳的,这称为setLatLngBounds 。链接是https://developers.google.com/android/reference/com/google/android/gms/location/places/ui/PlacePicker .IntentBuilder#public-method-summary我之前尝试过这个API,发现它在某种程度上完全是一团糟。 例如,如果您想在大学内找到餐厅,这个API不仅会让您回到餐厅,还会回到许多其他类型的University 。 设置一个绑定可能是好的,但如果你只使用API​​,仍然会产生令人讨厌的结果。 如果你只是想要car-repair的类型,我建议你写一个filter来过滤其他类型,只保留汽车维修类型和相关信息。

我已经为你做好了准备,希望它有所帮助

  // A class to store your results public class Place { private String icon; private Double latitude; public void setIcon(String icon) { this.icon=icon; } public void setLatitude(Double latitude) { this.latitude=latitude; } // ..... } // Utility class to keep things simple public class Functions { public static JSONObject convertInputStreamToJSONObject(InputStream inputStream) throws JSONException, IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = ""; String result = ""; while ((line = bufferedReader.readLine()) != null) result += line; inputStream.close(); return new JSONObject(result); } public static ArrayList parsePlacesFromJson(JSONObject datos) throws JSONException { List placesList = new ArrayList<>(); // in your case this must be "results" I think final int LIST_LENGTH = datos.getJSONArray("results").length(); //final int LIST_LENGTH = datos.getJSONArray("nameOfTheJsonMainArray").length(); Log.d("Length", String.valueOf(LIST_LENGTH)); // For every element in the list for(int i = 0; i < LIST_LENGTH; i++) { // Instance of a new Place Place place = new Place(); // Get data as needed, this represents one place JSONObject obj = datos.getJSONArray("results").getJSONObject(i); Double latitude = obj.getJSONObject("geometry").getJSONObject("location").getDouble("lat"); String icon = obj.getString("icon"); place.setLatitude(latitude); place.setIcon(icon); //.... placesList.add(place) } return placesList; } } // The google places reader class public class ApiReader { private static final String TAG = "API_READER"; Context context; View v; public ApiReader(Context context, View v) { this.context = context; this.v = v; } private static final String APIKEY = "yourkeyhere"; private static String ENDPOINT = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=54.27,-8.47&radius=1000&types=car_repair&key=%s"; // Method to be called public void getCarRepairs() throws IOException { URL url = new URL(String.format(ENDPOINT, APIKEY)); new GetPlaces().execute(url); } // Inner asyctask class private class GetPlaces extends AsyncTask> { List lista; @Override protected List doInBackground(URL... params) { JSONObject datos; URL url = params[0]; HttpURLConnection urlConnection = null; try { urlConnection = (HttpURLConnection) url.openConnection(); InputStream in = new BufferedInputStream(urlConnection.getInputStream()); datos = Functions.convertInputStreamToJSONObject(in); Log.i(TAG, datos.toString()); // De los datos obtenemos un objeto Place lista = Functions.parsePlacesFromJson(datos); Log.i(TAG, "" + lista.toString()); Log.i(TAG, "Went into try was OK."); } catch (Exception e) { Log.e(TAG, e.toString()); Log.i(TAG, "Went into catch"); } finally { urlConnection.disconnect(); Log.i(TAG, "Went into finally, urlConnection disconnected."); } return lista; } // This method it gets what the "doInBackGround" returns protected void onPostExecute(List placesList) { if(placesList != null) { // Do whatever with the list of places //Functions.updateView(v, placesList); } } } } // And to make things work in yout activity just do like this ApiReader api = new ApiReader(this, findViewById(R.id.mainLayout)); try { api.getCarRepairs(); } catch (IOException e) { e.printStackTrace(); } 

请享用 !!