8
votes

Below is my code to get neaby places at the current location.The code works sometimes and sometimes not without changing anything. Why it happens like this . I have checked the api key is valid , Status code "ERROR" says The operation failed with no more detailed information on https://developers.google.com/android/reference/com/google/android/gms/common/api/CommonStatusCodes.html#constants Thank you Below is activity:

public class PlacesAPIActivity extends AppCompatActivity implements
        OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks {
    private static final String LOG_TAG = "PPPPPPPPPPPPPPPPP";
    private static final int GOOGLE_API_CLIENT_ID =0;
    private GoogleApiClient mGoogleApiClient;
    private static final int PERMISSION_REQUEST_CODE = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_places_api);
        Log.d("resuktfvvvfdfd", "onCreate: ");
        buildGoogleApiClient();}

    private synchronized void buildGoogleApiClient()
    {  Button currentButton = (Button) findViewById(R.id.currentButton);
        mGoogleApiClient = new GoogleApiClient.Builder(PlacesAPIActivity.this)
                .addApi(Places.PLACE_DETECTION_API)
                .addApi(Places.GEO_DATA_API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .enableAutoManage(this, GOOGLE_API_CLIENT_ID, this)
                .build();
        mGoogleApiClient.connect();
        Log.d("connected", String.valueOf(mGoogleApiClient.isConnected()));
        currentButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mGoogleApiClient.isConnected()) {
                    Log.d("connected1", String.valueOf(mGoogleApiClient.isConnected()));
                    if (ContextCompat.checkSelfPermission(PlacesAPIActivity.this,
                            Manifest.permission.ACCESS_FINE_LOCATION)
                            != PackageManager.PERMISSION_GRANTED) {
                        ActivityCompat.requestPermissions(PlacesAPIActivity.this,
                                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                                PERMISSION_REQUEST_CODE);
                    } else {
                        callPlaceDetectionApi();
                    }

                }
            }
        });
    }



    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.e(LOG_TAG, "Google Places API connection failed with error code: "
                + connectionResult.getErrorCode());

        Toast.makeText(this,
                "Google Places API connection failed with error code:" +
                        connectionResult.getErrorCode(),
                Toast.LENGTH_LONG).show();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    callPlaceDetectionApi();
                }
                break;
        }
    }

    private void callPlaceDetectionApi() throws SecurityException {

        Log.d("mvkvkmvkmvkm", "callPlaceDetectionApi: ");
        PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
                .getCurrentPlace(mGoogleApiClient, null);
        Log.d("result", result.toString());
        result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
            @Override
            public void onResult(PlaceLikelihoodBuffer likelyPlaces) {
                System.out.println("inside callback...");
                Status status = likelyPlaces.getStatus();
                System.out.println("Status.tostring"+status.toString());
                System.out.println(status.isSuccess());
                System.out.println(status.getStatusCode());
                System.out.println(status.getStatusMessage());
                System.out.println(status.getStatus());
                for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                    Log.i(LOG_TAG, String.format("Place '%s' with " +
                                    "likelihood: %g",
                            placeLikelihood.getPlace().getName(),
                            placeLikelihood.getLikelihood()));
                }
                likelyPlaces.release();
            }
        });
    }




    @Override
    public void onStop() {
        super.onStop();


        mGoogleApiClient.disconnect();
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {

    }

    @Override
    public void onConnectionSuspended(int i) {

    }
}

Android MAnifest File

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.******">
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".PlacesAPIActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

       <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"/>

        <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="A***************************o"/>
    </application>
</manifest>

LOG Screen

07-06 15:56:32.499 10925-10925/com.example.nearby D/connected1: true
07-06 15:56:32.500 10925-10925/com.example.nearby D/mvkvkmvkmvkm: callPlaceDetectionApi: 
07-06 15:56:32.554 10925-10925/com.example.nearby D/result: com.google.android.gms.location.places.internal.zzj$1@5dd8757
07-06 15:56:42.610 10925-10925/com.example.nearby I/System.out: inside callback...
07-06 15:56:42.610 10925-10925/com.example.nearby I/System.out: Status.tostringStatus{statusCode=ERROR, resolution=null}
07-06 15:56:42.610 10925-10925/com.example.nearby I/System.out: false
07-06 15:56:42.610 10925-10925/com.example.nearby I/System.out: 13
07-06 15:56:42.611 10925-10925/com.example.nearby I/System.out: ERROR
07-06 15:56:42.611 10925-10925/com.example.nearby I/System.out: Status{statusCode=ERROR, resolution=null}
2
Were you able to fix this? - Nidhin Rejoice
Having the same issue, did you find a solution? - mehmetsen80

2 Answers

0
votes

After having lot of this error code I solved it sending my GPS location in my emulator. In the Android Studio AVD - Android Emulator, with my program running, I clicked in "More" > "Location" > Set my latitude and longitude and clicked in "Send". Immediately the next request to getCurrentLocation() was successfully executed. You can send your location to the emulator before executing your app. It will work as well.

0
votes

In my case, Google Places for Android is not work properly without initializing a Google Map as described in this example https://developers.google.com/places/android-api/current-places-tutorial

/**
 * Builds the map when the Google Play services client is successfully connected.
 */
@Override
public void onConnected(Bundle connectionHint) {
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}