Code Monkey home page Code Monkey logo

google-places-api-java's Introduction

google-places-api-java

UNMAINTAINED: DO NOT USE

Notice: Before using this library, you must register an API key for Google Places API.

Notice 2: The release of v2 brings many breaking changes. You will almost certainly need to make adjustments and recompile after upgrading to the latest version. This is because many deprecations from previous iterations of this library and the Google Places API specification have been removed for conciseness including the removal of Events. Previous iterations of this library will stop working once the deprecations in the API specification are removed and it is imperative that you update ASAP to ensure your applications continue to work.

Walker Crouse is an aspiring software developer, open source contributor, and starving college student. If you like my projects, please consider donating a small amount so that I may continue to devote time to them. Thank you.

Contents

Quickstart

With Maven (make sure you are using the latest version):

<dependencies>
    <dependency>
        <groupId>se.walkercrou</groupId>
        <artifactId>google-places-api-java</artifactId>
        <version>2.1.2</version>
    </dependency>
</dependencies>

With Gradle (make sure you are using the latest version):

repositories {
    mavenCentral()
}

dependencies {
    compile 'se.walkercrou:google-places-api-java:2.1.2'
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
}

Or just download the JAR with all dependencies included from the releases. Do not use the JAR if you are using Android, it will cause an error.

Creating the client

GooglePlaces client = new GooglePlaces("yourApiKey");

You may optionally provide your own RequestHandler to delegate HTTP traffic

GooglePlaces client = new GooglePlaces("yourApiKey", new MyRequestHandler());

Place Searches

Nearby Search Requests

You can search for places near specific latitude-longitude coordinates with a radius (in meters):

List<Place> places = client.getNearbyPlaces(lat, lng, radius, GooglePlaces.MAXIMUM_RESULTS);

You can retrieve at most 60 results. Every 20 results a new HTTP GET request will have to be made and also has a delay of 3 seconds because of API restrictions. You can omit the 'limit' parameter and it will default to 20 which will only ever require one HTTP GET request.

Text Search Requests

You can also search for locations by search query. This is the same backend system that Google Maps uses.

List<Place> places = client.getPlacesByQuery("Empire State Building", GooglePlaces.MAXIMUM_RESULTS);

Radar Search Requests

You can also use the "radar" method of finding locations.

List<Place> places = client.getPlacesByRadar(lat, lng, radius, GooglePlaces.MAXIMUM_RESULTS);

Additional Url Parameters

If you need to add additional URL parameters to the request URL you can append as many Param objects as you want to any request method.

List<Place> places = client.getPlacesByQuery("Empire State Building", GooglePlaces.MAXIMUM_RESULTS, Param.name("language").value("en"), Param.name("opennow").value(true));

Place Details

Any of the above getters will only get you limited information about the returned Place. You can get a much more in-depth Place object with Place#getDetails(Param...):

Here's one way I can get detailed information about the Empire State Building.

List<Place> places = client.getPlacesByQuery("Empire State Building", GooglePlaces.MAXIMUM_RESULTS);
Place empireStateBuilding = null;
for (Place place : places) {
    if (place.getName().equals("Empire State Building")) {
        empireStateBuilding = place;
        break;
    }
}

if (empireStateBuilding != null) {
    Place detailedEmpireStateBuilding = empireStateBuilding.getDetails(); // sends a GET request for more details
    // Just an example of the amount of information at your disposal:
    System.out.println("ID: " + detailedEmpireStateBuilding.getId());
    System.out.println("Name: " + detailedEmpireStateBuilding.getName());
    System.out.println("Phone: " + detailedEmpireStateBuilding.getPhoneNumber());
    System.out.println("International Phone: " + empireStateBuilding.getInternationalPhoneNumber());
    System.out.println("Website: " + detailedEmpireStateBuilding.getWebsite());
    System.out.println("Always Opened: " + detailedEmpireStateBuilding.isAlwaysOpened());
    System.out.println("Status: " + detailedEmpireStateBuilding.getStatus());
    System.out.println("Google Place URL: " + detailedEmpireStateBuilding.getGoogleUrl());
    System.out.println("Price: " + detailedEmpireStateBuilding.getPrice());
    System.out.println("Address: " + detailedEmpireStateBuilding.getAddress());
    System.out.println("Vicinity: " + detailedEmpireStateBuilding.getVicinity());
    System.out.println("Reviews: " + detailedEmpireStateBuilding.getReviews().size());
    System.out.println("Hours:\n " + detailedEmpireStateBuilding.getHours());
}

This will print something like:

ID: bc232d2422e7068b2a2ffb314f02e3733dd47796
Name: Empire State Building
Phone: (212) 736-3100
International Phone: null
Website: http://www.esbnyc.com/
Always Opened: false
Status: OPENED
Google Place URL: https://plus.google.com/110101791098901696787/about?hl=en-US
Price: NONE
Address: 350 5th Ave, New York, NY, United States
Vicinity: 350 5th Ave, New York
Reviews: 5
Hours:
SUNDAY 08:00 -- MONDAY 02:00
MONDAY 08:00 -- TUESDAY 02:00
TUESDAY 08:00 -- WEDNESDAY 02:00
WEDNESDAY 08:00 -- THURSDAY 02:00
THURSDAY 08:00 -- FRIDAY 02:00
FRIDAY 08:00 -- SATURDAY 02:00
SATURDAY 08:00 -- SUNDAY 02:00

Icons

Once you have a detailed Place object, you can download it's "Icon" with the following.

BufferedImage image = place.downloadIcon().getIconImage();

If you are working on Android, javax.imageio is not implemented. You can create a Bitmap from the icon with:

InputStream stream = place.downloadIcon().getIconInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(stream);

Place Actions

Add Place

Places can be added to Google Places API through this library. Added Places are only visible to your application until they are approved by Google's moderation process. This can be checked with Place.getScope().

You must begin by building the Place input via the PlaceBuilder class.

PlaceBuilder builder = new PlaceBuilder(locationName, latitude, longitude, "type1", "type2"...)

The constructor arguments are the only required arguments to add a place to Google Places but filling out the building more completely will help your Place get approved by the moderation process faster.

builder.accuracy(50)
       .phoneNumber("(000) 000-0000")
       .address("4 John St")
       .website("http://walkercrou.se")
       .locale(Locale.ENGLISH);

You must then pass the builder as an argument of GooglePlaces.addPlace().

Place place = client.addPlace(builder, true);

Delete Place

You can delete places with:

client.deletePlace(place);

Place Photos

You can retrieve photos of places from Google as well. For example, here's how I can choose a random photo from a place and save it to disk.

List<Photo> photos = place.getPhotos();
Photo photo = photos.get(new Random().nextInt(photos.size()));
BufferedImage image = photo.download().getImage();

File file = new File("test.jpg");
file.createNewFile();
ImageIO.write(image, "jpg", file);

You can also specify a max width and max height for the image. The aspect ratio of the image will always be maintained.

BufferedImage image = photo.download(100, 100).getImage();

To specify one and not the other, just set one of them to -1. If you do not specify them, the max size (1600) will be passed. NOTE: You must pass at least one of the size parameters.

If you are working on Android, javax.imageio is not implemented, so you can create a bitmap from a photo with.

InputStream stream = photo.download().getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(stream);

Remember not to execute this code on the main thread.

Autocomplete

Place prediction

You can receive auto-complete predictions for Places with:

List<Prediction> predictions = client.getPlacePredictions("Empire");

As you might expect, The Empire State Building is the first result returned here. The prediction object contains a human-readable description and a Place accessor so you can easily build a UI around it. (Particularly useful for Android development)

Query prediction

You can also receive auto-complete predictions for Places with general queries such as "pizza in New York".

List<Prediction> predictions = client.getQueryPredictions("pizza in New York");

Android integration

Just remember that if you are using this library with Android you should never execute network code on the main thread. Either run it in another thread...

new Thread(new Runnable() {
    public void run() {
        // do something
    }
}).start();

...or run it in an AsyncTask.

Documentation

Documentation for this project can be found at this location.

Build

This project uses Apache Maven. Create a file called src/main/resources/places_api.key with your Google Places API key before running tests and building with mvn.

google-places-api-java's People

Contributors

0x3333 avatar abouzek avatar gbero avatar intrications avatar jameskbride avatar janoe avatar nonvirtualthunk avatar seb-doncker avatar windy1 avatar winghin2517 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

google-places-api-java's Issues

getDetails

Hi, I'm currently trying to get the details of a list of Places in Paris. The first iteration works fine but the second get stuck on getDetails().

        List<Place> places = client.getNearbyPlaces(48.927597, 2.263365, 10, GooglePlaces.MAXIMUM_RESULTS);
        for (Place place : places) {
            System.out.println("Name: " + place.getName());
            Place detail = place.getDetails();
            System.out.println("ID: " + detail.getPlaceId());
        }

EDIT : I tried to create my own RequestHandler extending your DefaultRequestHandler and replaced the HttpClient. You provide exactly the same thing as HttpClients.getDefault() and I replaced it with HttpClients.getMinimal() and it works like a charm.

private final HttpClient client = HttpClients.createMinimal();

I am not at all expert in this, I don't get why your way doesn't work and mine does. Would you please explain to me what the issue is ?

Bug String.formatURL

There is a bug when generating URL , you should pass the Locale.ENGLISH while formatting it otherwise it will generate the wrong url. In my case I am using arabic locale after debugging it, seems url is wrong.

//Current

private static String buildUrl(String method, String params, Param... extraParams) {
String url = String.format("%s%s/json?%s", API_URL, method, params);
url = addExtraParams(url, extraParams);
url = url.replace(' ', '+');
return url;
}

//Should be Locale.ENGLISH

private static String buildUrl(String method, String params, Param... extraParams) {
String url = String.format(Locale.ENGLISH,"%s%s/json?%s", API_URL, method, params);
url = addExtraParams(url, extraParams);
url = url.replace(' ', '+');
return url;
}

SSLPeerUnverifiedException

I get the following error

Exception in thread "main" se.walkercrou.places.exception.GooglePlacesException: java.io.IOException: javax.net.ssl.SSLPeerUnverifiedException: Host name 'maps.googleapis.com' does not match the certificate subject provided by the peer (CN=*.storage.googleapis.com, O=Google Inc, L=Mountain View, ST=California, C=US)

with the following invocation

GooglePlaces client = new GooglePlaces(googleApiKey);                   
List<Prediction> predictions = client.getPlacePredictions(location);

If I manually do a HTTPS connection, I encounter no problems. I'd appreciate any suggestions you have.

Rewrite tests

The current tests are rather old and antiquated and have been patched up from old versions of the library and never truly re-fashioned properly. The old tests should be re-written entirely.

Cannot Get the Perminately Closed Flag

Hey Windy,

I hope this is not a stupid question. Thank you in advance for any help. I have tried for a while and am unable to figure one part out.

I have your library working and querying places. I get the response and places back. However, what I cannot figure out how to get is the "permanently_closed" boolean that the full API returns. You can see the boolean I am talking about here https://developers.google.com/places/web-service/details. I cannot see any method that returns this? Any chance you could help me with getting it?

Thank you,

Spencer

MAXIMUM_RESULTS for Radar search

Radar search returns 200 results at once but the result is treated like 60 Result per page, therefore only the first 20 places are retrieved.

DefaultRequestHandler does not release connections

Google Places server side code must have recently changed, because as of yesterday, 8/20/15, HttpClient requests made through DefaultRequestHandler are not automatically released after receiving a response.

The solution is to call HttpMethod.releaseConnection() after the response is returned. I'm opening a pull request to address the issue now.

API Key Is Checked In

Walker, I checked out your code, and when I built it locally I noticed your Places API key has been checked in. I would remove that and either mock out the tests you currently have in place or require developers to insert their own API key before building.

Each GooglePlaces Instance Can Only Perform 2 getNearbyLocations Calls

While experimenting with the library, I found that on the third getNearbyLocations call the GooglePlaces object hangs the thread. However, if I instead initiate a new GooglePlaces object every 2 calls, the objects work fine.

Here is the code I used to test this. The coordinates were chosen due to the large amount of nearby restaurants. I have found that sameInstanceTest() hangs after 2 print statements, while multipleInstanceTest() outputs 5 print statements and exits.

public void multipleInstanceTest(){
    GooglePlaces gpl = new GooglePlaces(API_KEYS[0]);
    int usages = 0;

    double[][] testDoubles = new double[][]{
            new double[]{40.7607077,-73.980695},
            new double[]{40.7607077,-73.980695},
            new double[]{40.7607077,-73.980695},
            new double[]{40.7607077,-73.980695},
            new double[]{40.7607077,-73.980695}
    };
    double range = 6000;
    for (double[] coords : testDoubles){

        List<Place> places = new ArrayList<>();
        try {
            places = gpl.getNearbyPlaces(coords[0], coords[1],range, 20, Param.name("type").value("food"));
        } catch (Exception e){
            //Default to 0
        }
        usages ++;
        System.out.printf("Got %d locations at coords %f,%f\n",places.size(),coords[0],coords[1]);
        if (usages == 2){
            gpl = new GooglePlaces(API_KEYS[0]);
            usages = 0;
        }
    }
}

public void sameIstanceTest(){
    GooglePlaces gpl = new GooglePlaces(API_KEYS[0]);
    double[][] testDoubles = new double[][]{
            new double[]{40.7607077,-73.980695},
            new double[]{40.7607077,-73.980695},
            new double[]{40.7607077,-73.980695},
            new double[]{40.7607077,-73.980695},
            new double[]{40.7607077,-73.980695}
    };
    double range = 6000;
    for (double[] coords : testDoubles){

        List<Place> places = new ArrayList<>();
        try {
            places = gpl.getNearbyPlaces(coords[0], coords[1],range, 20, Param.name("type").value("food"));
        } catch (Exception e){

        }
        System.out.printf("Got %d locations at coords %f,%f\n",places.size(),coords[0],coords[1]);
    }
}

No place info in Request

Hello,
please qny help on why i may be getting places results without additional info suh as place name, vicinity? here is my log:
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "html_attributions" : [],
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "results" : [
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? {
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "geometry" : {
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "location" : {
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "lat" : 4.038973,
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "lng" : 9.687594000000001
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? }
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? },
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "id" : "eaafbd8ca32a4743e129e0c17235922bc844b79f",
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "place_id" : "ChIJj-qFruUSYRARPP70h_QEAB8",
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "reference" : "CpQBhQAAAKUVrAEZIlB_IFn8NneJlFMR_TdS0qb1GaZ85UQKgDdlK90rWXadD8juwERek0wFH0Ps2F739Vxylzwqxo4anI5qZJStP3T4W9V4DNdVdyULwebvjKKHTf1WNW-GLEjtXle_Z4KeKpB75FTgJJhDKEUnp1h5HghYeV0u0BSG6l0UnCElMsZ-THRWujF5wARNXBIQ2dl37vqy2f-H3TxCxQ6oChoUxPMRcvBbibfS0rG8lfbzYKJiklk"
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? },
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? {
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "geometry" : {
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "location" : {
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "lat" : 4.0678,
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "lng" : 9.7127
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? }
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? },
06-27 09:30:59.307 18330-18705/com.izigate.trackr I/System.out? "id" : "b42b1901de55e63d3574f8660743e1bec57c5f01",
06-27 09:30:59.308 18330-18705/com.izigate.trackr I/System.out? "place_id" : "ChIJ6Y_YDXISYRARlzP7hiv2CSA",
06-27 09:30:59.308 18330-18705/com.izigate.trackr I/System.out? "reference" : "CnRnAAAAdPEjkvuJK5pLaF5rn9871tYe4hamTLK8q5KDDBTqXIEM_kFlFpq3tToBI43PoXY1VBAxJS8yOEm9P3kWvZWbjITPLsPM-anI6cAo_B9LvBwYu8sdLlHLdPrGY_TtUfzkufUTbGxA5FZuI0XzLH3-8BIQMJ0mas9tyfBOHrE8oIDG9RoUz2SYIjZeJoxG28aZXEKmZ8UW2Bc"
06-27 09:30:59.308 18330-18705/com.izigate.trackr I/System.out? },
06-27 09:30:59.308 18330-18705/com.izigate.trackr I/System.out? {
06-27 09:30:59.308 18330-18705/com.izigate.trackr I/System.out? "geometry" : {
06-27 09:30:59.308 18330-18705/com.izigate.trackr I/System.out? "location" : {
06-27 09:30:59.308 18330-18705/com.izigate.trackr I/System.out? "lat" : 4.081312,
06-27 09:30:59.308 18330-18705/com.izigate.trackr I/System.out? "lng" : 9.719552999999999
06-27 09:30:59.308 18330-18705/com.izigate.trackr I/System.out? }

get photo

hello
please if someone can explain me how i get photo of place
i use this fuction
if (!findPlace(client.getNearbyPlaces(TEST_PLACE_LAT, TEST_PLACE_LNG, MAXIMUM_RADIUS,
MAXIMUM_RESULTS, TypeParam.name("types").value(Types.TYPE_BEAUTY_SALON)), TEST_PLACE_NAME))

///
private boolean findPlace(List places, String name) {

    boolean found = false;
    feedsList = new ArrayList<>();
    for (Place place : places) {

        Shop item = new Shop();
        item.BusinessName = place.getName();
        List<Photo> photos = place.getPhotos();
        Log.e("photo", "" + photos.size());

        InputStream stream = photo.download().getInputStream();
        Bitmap bitmap = BitmapFactory.decodeStream(stream);

// Photo photos = photos.get(new Random().nextInt(photos.size()));

// InputStream stream = photo.download().getInputStream();
// Bitmap bitmap = BitmapFactory.decodeStream(stream);
//
// Log.e("place_img", BitMapToString(bitmap));

        feedsList.add(item);
        found = true;


    }
    return found;

 and i get list size zero 

what i do wrong ?

Runtime error

Hello Guys,

I was wondering if you guys seen this error before. I am trying to integrate this library into my android app. It compiles without any problems but crashes when i run the app. The error is below.

Thanks!

John

Process: com.johamcruz.Balln, PID: 4118
java.lang.NoSuchFieldError: No static field INSTANCE of type Lorg/apache/http/message/BasicLineFormatter; in class Lorg/apache/http/message/BasicLineFormatter; or its superclasses (declaration of 'org.apache.http.message.BasicLineFormatter' appears in /system/framework/ext.jar)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:52)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:56)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:46)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:72)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:84)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:59)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.(PoolingHttpClientConnectionManager.java:493)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:149)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:138)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:114)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:726)
at se.walkercrou.places.DefaultRequestHandler.(DefaultRequestHandler.java:18)
at se.walkercrou.places.DefaultRequestHandler.(DefaultRequestHandler.java:34)
at se.walkercrou.places.GooglePlaces.(GooglePlaces.java:39)
at com.johamcruz.Balln.Activities.NearbyCourtsActivity$1.run(NearbyCourtsActivity.java:45)
at java.lang.Thread.run(Thread.java:818)
02-28 22:31:42.220 4118-4127/com.johamcruz.Balln E/System﹕ Uncaught exception thrown by finalizer
02-28 22:31:42.221 4118-4127/com.johamcruz.Balln E/System﹕ java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.concurrent.atomic.AtomicBoolean.compareAndSet(boolean, boolean)' on a null object reference
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.shutdown(PoolingHttpClientConnectionManager.java:349)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.finalize(PoolingHttpClientConnectionManager.java:172)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:190)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:173)
at java.lang.Thread.run(Thread.java:818)

More than one search criteria

Good morning,
First congratulate you on your work. Good simple and functional API.
A question like I can search for points based on more than one search criteria.
Javascript API allows me to put in the parameter name like this: value1 | valor21valor3.
But using java api (This is my code):

places = client.getNearbyPlaces(location.getLat(), location.getLng(), 5000, Param.name("name").value("baloto|efecty|jamar"), Param.name("rankBy").value("distance"), Param.name("language").value("es"));

It shows an invalid character error.

I hope your collaboration is the only thing missing me to complete my project.

How to get pageToken?

The client can only return a list of places, right? So how to get the pageToken if there is one?

Execution Failed for task :app:dexDebug

When I add the dependency
compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
I get the following error
Error:Execution failed for task ':app:dexDebug'.

com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_40\bin\java.exe'' finished with non-zero exit value 2

but if I take it out I get a runtime error from the library. Any suggestions?
Thanks!

Exceptions handling

Hi,

I'm having an issue with the exceptions caught by the API. My problem is that the API catches the exceptions and does not let me choose what to do when they occures.

My application is set to send 150k resquests a day (limited by Google) and write data in an excel file. But when an exception occures and is caught by the API my program just ends and I can't tell the application what to do next, and I'm afraid I will lose the data beacause I can't call HSSFWorkbook.write() from the Apache POI API.

Would it be possible not to catch some exceptions but to throw them so the developper can handle them ? Mostly those caught by the GooglePlace class.

'ParseException: bad class file magic' with 2.0.1 in android gradle based project

I'm having a lot of trouble to manage dependencies with this library.
Do you guys have any tips for importing the library on Android ?

I can't import the 2.0.1 library in my project.
Using version 2.0.0 or 1.2.8 building is working fine.

This is probably a dependency problem but I can't resolve it.

While building I receive the following error.

Error:Execution failed for task ':xxxxxx:dexSnapshotDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    /Users/xxxxxx/android-sdk/sdk/build-tools/21.1.2/dx --dex --output /Users/xxxxxx/build/intermediates/dex/snapshot/debug --input-list=/Users/xxxxxx/build/intermediates/tmp/dex/snapshot/debug/inputList.txt
  Error Code:
    1
  Output:
    warning: Ignoring InnerClasses attribute for an anonymous inner class
    (edu.emory.mathcs.backport.java.util.AbstractMap$1) that doesn't come with an
    associated EnclosingMethod attribute. This class was probably produced by a
    compiler that did not target the modern .class file format. The recommended
    solution is to recompile the class from source, using an up-to-date compiler
    and without specifying any "-target" type options. The consequence of ignoring
    this warning is that reflective operations on this class will incorrectly
    indicate that it is *not* an inner class.
    warning: Ignoring InnerClasses attribute for an anonymous inner class
    (edu.emory.mathcs.backport.java.util.AbstractMap$2) that doesn't come with an
    associated EnclosingMethod attribute. This class was probably produced by a
    compiler that did not target the modern .class file format. The recommended
    solution is to recompile the class from source, using an up-to-date compiler
    and without specifying any "-target" type options. The consequence of ignoring
    this warning is that reflective operations on this class will incorrectly
    indicate that it is *not* an inner class.
    warning: Ignoring InnerClasses attribute for an anonymous inner class
    (edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils$1) that doesn't come with an
    associated EnclosingMethod attribute. This class was probably produced by a
    compiler that did not target the modern .class file format. The recommended
    solution is to recompile the class from source, using an up-to-date compiler
    and without specifying any "-target" type options. The consequence of ignoring
    this warning is that reflective operations on this class will incorrectly
    indicate that it is *not* an inner class.
    warning: Ignoring InnerClasses attribute for an anonymous inner class
    (edu.emory.mathcs.backport.java.util.concurrent.helpers.Utils$2) that doesn't come with an
    associated EnclosingMethod attribute. This class was probably produced by a
    compiler that did not target the modern .class file format. The recommended
    solution is to recompile the class from source, using an up-to-date compiler
    and without specifying any "-target" type options. The consequence of ignoring
    this warning is that reflective operations on this class will incorrectly
    indicate that it is *not* an inner class.
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
        at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
        at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
        at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
        at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
        at com.android.dx.command.dexer.Main.processClass(Main.java:704)
        at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
        at com.android.dx.command.dexer.Main.access$300(Main.java:83)
        at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
        at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
        at com.android.dx.command.dexer.Main.processOne(Main.java:632)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)
        at com.android.dx.command.dexer.Main.run(Main.java:246)
        at com.android.dx.command.dexer.Main.main(Main.java:215)
        at com.android.dx.command.Main.main(Main.java:106)
    ...while parsing org/json/JSONArray.class
    1 error; aborting

Unable to Merg dex

Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.

com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

Problem running getNearbyPlacesRankedByDistance multiple times

Hi,
I'm trying to use your library in my project and encounters in following issue:
i can't run the function getNearbyPlacesRankedByDistance more then two times.
Here is my function:

public void SearchPlaces(Context ctx)
{
    new Thread(new Runnable() {
        public void run() {
            List<Place> places=null;
            try {
                Log.i("MyApp", "search started");
                places = client.getNearbyPlacesRankedByDistance(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude(), 20, Param.name("keyword").value(task_category.getSearchKey()));
                Log.i("MyApp", "places received");
            } catch (Exception e) {
                Log.i("MyApp", "exception"); 
            }
            Log.i("MyApp", "thread exit");
        }
    }).start();
}

On the third run i'm running my function, the function getNearbyPlacesRankedByDistance does not returns and seems to be blocked.
After the function execution i don't get anything neither in the log, nor in debug.
What am i doing wrong ?

Regards,
Alex.

Trouble compiling the project using Gradle

In order to use this project in an Android app, I had these two lines in the gradle script.

    implementation 'se.walkercrou:google-places-api-java:2.1.7'
    implementation 'org.apache.httpcomponents:httpclient-android:4.3.5.1'

I noticed the following libraries were added because of the two lines above.

Gradle: org.apache.httpcomponents:httpclient:4.3.5@jar
Gradle: org.apache.httpcomponents:httpclient-android:4.3.5.1@jar
Gradle: org.apache.httpcomponents:httpcore:4.3.2@jar

When I compile and run the project, I got this error message.

Program type already present: org.apache.http.ContentTooLongException

The reason is ContentTooLongException class is present in both httpcore 4.3.2 jar and the httpclient-android 4.3.5.1 jar. If you remove httpclient-android, it compiles but ends up with a run-time exception at the BasicLineFormatter. Do you guys have any idea how to solve this issue?

Thank you!

java.lang.IllegalArgumentException: No enum constant se.walkercrou.places.Scope.

It appears like Google has a breaking change where their API does not always return the "scope" field in the API anymore. We first detected this on June 4th and it got much worse on June 24th. ~50% of requests no longer have the "scope" field.

java.lang.IllegalArgumentException: No enum constant se.walkercrou.places.Scope.

This is caused by the following lines converting a null value to an empty string and trying to get the enum value of the empty string.

https://github.com/windy1/google-places-api-java/blob/master/src/main/java/se/walkercrou/places/Place.java#L73-L74

getNearbyPlaces with rankby

Hey Thanks for the library!

Can you add the function to getNearbyPlaces with rankby. Right now is with radius. I want to show the results based on ranking.

trying to create the subclass but due to buildUrl is private method unable to do that. I am using jar file

Thanks

getNearbyPlaces(UNLIMITED_RESULTS)

Hello,

I am trying to get an "unlimited" amount of results out of the getNearbyPlaces() method, so I give Integer.MAX_VALUE as limit but I always get 60 results.

I went into the GooglePlaces class and it seems the getPlaces() method overrides my limit with :

limit = Math.min(limit, MAXIMUM_RESULTS); // max of 60 results possible

But then the number of request that have to be sent is calculated with the new limit :

int pages = (int) Math.ceil(limit / (double) MAXIMUM_PAGE_RESULTS);

So obviously I can never have more than 60 results even though it should be possible.

Problem with concurrent connection kept alive

Hi,

I have a problem with your project.

I have follow your indications, all ok but looping on List when I try to get details about a single Place after first result, there is a problem with concurrent connection using HttpClient 4.3.5.

This is a loop using on List

for (Place place : places) {
if (place.getName().equals(textSearch)) {
if (place != null) {
Place detailedPlace = place.getDetails(); // sends a GET request for more details

The problem that I read in log is this:

12/10/2015 16:38:14 DEBUG PoolingHttpClientConnectionManager:219 - Connection request: [route: {s}->https://maps.googleapis.com:443][total kept alive: 0; route allocated: 2 of 2; total allocated: 2 of 20]

Can you help me?

Thank you

Piè

Problem when using google-places-api-java library with GAE

Hi,

Getting exception when deploying application into GAE container:

Caused by: java.lang.NoClassDefFoundError: javax.naming.ldap.LdapName is a restricted class. Please see the Google App Engine developer's guide for more details.
at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
at org.apache.http.conn.ssl.AbstractVerifier.extractCNs(AbstractVerifier.java:277)
at org.apache.http.conn.ssl.AbstractVerifier.getCNs(AbstractVerifier.java:265)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:157)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:140)
at org.apache.http.conn.ssl.SSLSocketFactory.verifyHostname(SSLSocketFactory.java:561)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:536)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:403)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
at se.walkercrou.places.DefaultRequestHandler.get(DefaultRequestHandler.java:77)
at se.walkercrou.places.GooglePlaces.getPlaces(GooglePlaces.java:844)
at se.walkercrou.places.GooglePlaces.getNearbyPlaces(GooglePlaces.java:397)

Looks like that class javax.naming.ldap.LdapName is not possible to use in GAE container. Is it possible to do something?

Detail query?

I'm not seeing an Api for the Google Detail query - getPlacesByQuery is a text search and does not bring back address components.

API doesn't work consistently with API key

At first the problem was with Places API not being enabled on my API key. Actually, API key just had no restriction to API and it was supposed to be working.
While my application was running, i open google developer console, restricted API key to Places API, opened my application, tried geocoding an address and it worked.

Then i restarted an application and tried it again - it didn't work again, as if API key haven't had permissions for Places API:
com.google.maps.errors.RequestDeniedException: This API project is not authorized to use this API.

Then i removed Places API restriction from the key in goodle dev console, all while application still was running from the moment when it failed - i tried it again, and it worked.

I have an issue - do i have to put/remove restrictions on API key every time i reboot an application in order for Java API to work?

Week_day text is not being parsed

The Week_day text which the places api has is not being parsed here. Here is a sample of what I am talking about

weekday_text: [
"Monday: 11:00 am – 3:00 pm, 5:00 – 8:00 pm",
"Tuesday: 11:00 am – 3:00 pm, 5:00 – 8:00 pm",
"Wednesday: 11:00 am – 3:00 pm, 5:00 – 8:00 pm",
"Thursday: 11:00 am – 3:00 pm, 5:00 – 8:00 pm",
"Friday: 11:00 am – 9:00 pm",
"Saturday: 12:00 – 9:00 pm",
"Sunday: Closed"
]

This occurs at the detail view. This information is valuable because it includes the am/pm information and this information is already converted to 12 hour time (instead of the 24 hour time that the detail view of google places loves to use) I can do this and submit a PR for you guys to review?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.