Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

google api client callback is never called

I am trying to get the last known location using google services API, but after I build the GoogleApiClient, no callback method is ever fired.

My activity looks like that :

public class MainActivity extends Activity implements FragmentObserver, SessionSpotListObserver,
                                                        ConnectionCallbacks, OnConnectionFailedListener{

//Objects used for the location API
    private Location mLastLocation;
    private GoogleApiClient mGoogleApiClient;
    // Request code to use when launching the resolution activity
    private static final int REQUEST_RESOLVE_ERROR = 1001;
    // Unique tag for the error dialog fragment
    private static final String DIALOG_ERROR = "dialog_error";
    // Bool to track whether the app is already resolving an error
    private boolean mResolvingError = false;
    public static final String STATE_RESOLVING_ERROR = "resolving_state";
    //Request code to use when launching the activity to fix the connection to google API
    private static final int REQUEST_SOLVE_CONNEXION = 999;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//We make sure that google play service is available on the device
         if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS){
            //We get a connection to the Google Play Service API to get the location of the user
            buildGoogleApiClient();
         }
         else {
             GooglePlayServicesUtil.getErrorDialog(GooglePlayServicesUtil.isGooglePlayServicesAvailable(this),
                     this,
                     REQUEST_SOLVE_CONNEXION); 
         }
}

@Override
    public void onConnectionFailed(ConnectionResult result) {
         if (mResolvingError) {
                // Already attempting to resolve an error.
                return;
            } else if (result.hasResolution()) {
                try {
                    mResolvingError = true;
                    result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
                } catch (SendIntentException e) {
                    // There was an error with the resolution intent. Try again.
                    mGoogleApiClient.connect();
                }
            } else {
                // Show dialog using GooglePlayServicesUtil.getErrorDialog()
                showErrorDialog(result.getErrorCode());
                mResolvingError = true;
            }
        }

        // The rest of this code is all about building the error dialog

        /* Creates a dialog for an error message */
        private void showErrorDialog(int errorCode) {
            // Create a fragment for the error dialog
            ErrorDialogFragment dialogFragment = new ErrorDialogFragment();
            // Pass the error that should be displayed
            Bundle args = new Bundle();
            args.putInt(DIALOG_ERROR, errorCode);
            dialogFragment.setArguments(args);
            dialogFragment.show(getFragmentManager(), "errordialog");
        }

        /* Called from ErrorDialogFragment when the dialog is dismissed. */
        public void onDialogDismissed() {
            mResolvingError = false;
        }

        /* A fragment to display an error dialog */
        public static class ErrorDialogFragment extends DialogFragment {
            public ErrorDialogFragment() { }

            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                // Get the error code and retrieve the appropriate dialog
                int errorCode = this.getArguments().getInt(DIALOG_ERROR);
                return GooglePlayServicesUtil.getErrorDialog(errorCode,
                        this.getActivity(), REQUEST_RESOLVE_ERROR);
            }

            @Override
            public void onDismiss(DialogInterface dialog) {
                ((MainActivity)getActivity()).onDialogDismissed();
            }
    }

    @Override
    public void onConnected(Bundle arg0) {
         mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                    mGoogleApiClient);
         Log.d("API Connection", "The API has connected and the last location is :" + mLastLocation);
            if (mLastLocation != null) {

            }


    }

    @Override
    public void onConnectionSuspended(int arg0) {
        // TODO Auto-generated method stub

    }

    /**
     * Creates the connexion to the Google API. Once the API is connected, the 
     * onConnected method is called.
     */
    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addApi(LocationServices.API)    
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .build();
    }

I placed breakpoints on all callback methods, that is how I know that none is called.

Because at this stage I am not using Google Map Api, I did not register my app to get a key. Do I need to do that even if I just get the location ?

Don't hesitate to tell me if you need more info.

Thank you all.

like image 243
JDenais Avatar asked Mar 16 '15 02:03

JDenais


People also ask

When to invoke callback interfaces in Google APIs?

For example if your app makes calls to write data to Google APIs, these should be invoked only after the onConnected()method has been called. Here is an example activity that implements the callback interfaces and adds them to the Google API Client:

What is a suspension callback in API?

Provides callbacks that are called when the client is connected or disconnected from the service. Most applications implement GoogleApiClient.ConnectionCallbacks#onConnected(Bundle) to start making requests. A suspension cause informing you that a peer device connection was lost.

What should API implementors use instead of Google API?

use GoogleApi based APIs instead. see moving past googleapiclient. API implementors should use the stand-alone ConnectionCallbacks instead. Provides callbacks that are called when the client is connected or disconnected from the service.

What is connectioncallbacks in API?

API implementors should use the stand-alone ConnectionCallbacks instead. Provides callbacks that are called when the client is connected or disconnected from the service. Most applications implement GoogleApiClient.ConnectionCallbacks#onConnected (Bundle) to start making requests.


1 Answers

You never call mGoogleApiClient.connect() after building your GoogleApiClient. Your onCreate() should instead be:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    buildGoogleApiClient();
    mGoogleApiClient.connect();
}

Note that there is no need to call GooglePlayServicesUtil.isGooglePlayServicesAvailable() if you are using GoogleApiClient as connect() includes that check as well.

like image 138
ianhanniballake Avatar answered Oct 23 '22 23:10

ianhanniballake