ihsan
ihsan

Reputation: 707

Google Places API: How to get photos and place id from latitude and longitude?

I want to get photos and place_id required by Google Place Details API of my current location.

Search nearby does not return places in my exact location. (current lat/lng returned by android location service).

Radar search requires a keyword. Please suggest.

Upvotes: 1

Views: 2251

Answers (1)

Sheridan Gray
Sheridan Gray

Reputation: 698

Per the Google Place Search documentation the three things you need to provide are the KEY, LOCATION and RADIUS. I cut out a bunch of unnecessary code, but here's how I did something similar.

1) Get your current location

private void initializeMapLocation() {
    LocationManager locationManager = (LocationManager) this
            .getSystemService(Context.LOCATION_SERVICE);

    Location lastLocation = locationManager
            .getLastKnownLocation(LocationManager.GPS_PROVIDER);

    if (lastLocation != null) {
        setUserLocation(lastLocation);
    }
}

private void setUserLocation(Location location) {
    LatLng currentLatLng = new LatLng(location.getLatitude(), location.getLongitude());
    mMap.animateCamera(CameraUpdateFactory.newLatLng(currentLatLng));
}

2) Build your search URL. You can add extra parameters like a keyword if you want by appending them on, but it doesn't sound like you want that in this particular case.

private void buildAndInitiateSearchTask(String searchType) {
    Projection mProjection = mMap.getProjection();
    LatLng mProjectionCenter = mProjection.getVisibleRegion().latLngBounds
        .getCenter();

    searchURL.append("https://maps.googleapis.com/maps/api/place/nearbysearch/");
    searchURL.append("json?");
    searchURL.append("location=" + mProjectionCenter.latitude + "," + mProjectionCenter.longitude);
    searchURL.append("&radius=" + calculateProjectionRadiusInMeters(mProjection));
    searchURL.append("&key=YOUR_KEY_HERE");

    new PlaceSearchAPITask().execute(searchURL.toString());
}

private double calculateProjectionRadiusInMeters(Projection projection) {

    LatLng farLeft = projection.getVisibleRegion().farLeft;
    LatLng nearRight = projection.getVisibleRegion().nearRight;

    Location farLeftLocation = new Location("Point A");
    farLeftLocation.setLatitude(farLeft.latitude);
    farLeftLocation.setLongitude(farLeft.longitude);

    Location nearRightLocation = new Location("Point B");
    nearRightLocation.setLatitude(nearRight.latitude);
    nearRightLocation.setLongitude(nearRight.longitude);

    return farLeftLocation.distanceTo(nearRightLocation) / 2 ;
}

3) Send your request and display your results as an AsyncTask

private class PlaceSearchAPITask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... placesURL) {
        StringBuilder placesBuilder = new StringBuilder();

        for (String placeSearchURL : placesURL) {
            HttpClient placesClient = createHttpClient();
            try {
                HttpGet placesGet = new HttpGet(placeSearchURL);
                HttpResponse placesResponse = placesClient
                        .execute(placesGet);
                StatusLine placeSearchStatus = placesResponse
                        .getStatusLine();
                if (placeSearchStatus.getStatusCode() == 200) {
                    HttpEntity placesEntity = placesResponse
                            .getEntity();
                    InputStream placesContent = placesEntity
                            .getContent();
                    InputStreamReader placesInput = new InputStreamReader(
                            placesContent);
                    BufferedReader placesReader = new BufferedReader(
                            placesInput);
                    String lineIn;
                    while ((lineIn = placesReader.readLine()) != null) {
                        placesBuilder.append(lineIn);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return placesBuilder.toString();
    }

    @Override
    protected void onPostExecute(String result) {
        try {
            JSONObject resultObject = new JSONObject(result);

            // This is my custom object to hold the pieces of the JSONResult that I want. You would need something else for your particular problem.
            mapData = new MapDataSource(resultObject.optJSONArray("results"));
        } catch (JSONException e) {
            e.printStackTrace();
        }

        if (mapData != null) {
            // TODO - This is where you would add your markers and whatnot.
        } 
    }
}

Upvotes: 3

Related Questions