web-dev-qa-db-fra.com

Erreur lors de la mise en œuvre de GoogleApiClient Builder pour le développement de Android

Je suis la documentation de Google pour implémenter la fonctionnalité de connexion Google+ dans une application.

https://developers.google.com/+/mobile/Android/getting-started

J'ai suivi chaque étape conformément au guide, mais je me suis retrouvé coincé dans une erreur générée par GoogleApiClient.Builder. J'ai effectué une recherche approfondie, mais aucun résultat. S'il vous plaît, aidez-moi à résoudre ce problème. Merci.

Code d'erreur:

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).addApi(Plus.API, null)
            .addScope(Plus.SCOPE_PLUS_LOGIN).build();

Message d'erreur :

   The method addConnectionCallbacks(GoogleApiClient.ConnectionCallbacks) in the type 
   GoogleApiClient.Builder is not applicable for the arguments (MainActivity)

Code MainActivity.Java complet:

    package mad.project.mightysatta;

    import Android.content.Intent;
    import Android.content.IntentSender.SendIntentException;
    import Android.os.Bundle;
    import Android.support.v4.app.Fragment;
    import Android.support.v7.app.ActionBarActivity;
    import Android.view.LayoutInflater;
    import Android.view.Menu;
    import Android.view.MenuInflater;
    import Android.view.MenuItem;
    import Android.view.View;
    import Android.view.ViewGroup;

    import com.google.Android.gms.common.ConnectionResult;
    import com.google.Android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
    import com.google.Android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;
    import com.google.Android.gms.common.api.GoogleApiClient;
    import com.google.Android.gms.plus.Plus;

    public class MainActivity extends ActionBarActivity implements
    ConnectionCallbacks, OnConnectionFailedListener {

/* Request code used to invoke sign in user interactions. */
private static final int RC_SIGN_IN = 0;

/* Client used to interact with Google APIs. */
private GoogleApiClient mGoogleApiClient;

/*
 * A flag indicating that a PendingIntent is in progress and prevents us
 * from starting further intents.
 */
private boolean mIntentInProgress;

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

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).addApi(Plus.API, null)
            .addScope(Plus.SCOPE_PLUS_LOGIN).build();

    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    // getMenuInflater().inflate(R.menu.main, menu);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
    // return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);
        return rootView;
    }
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    // TODO Auto-generated method stub

    if (!mIntentInProgress && result.hasResolution()) {
        try {
            mIntentInProgress = true;
            result.startResolutionForResult(this, // your activity
                    RC_SIGN_IN);
        } catch (SendIntentException e) {
            // The intent was canceled before it was sent. Return to the
            // default
            // state and attempt to connect to get an updated
            // ConnectionResult.
            mIntentInProgress = false;
            mGoogleApiClient.connect();
        }
    }

}

@Override
public void onConnected(Bundle connectionHint) {
    // TODO Auto-generated method stub

}

@Override
public void onDisconnected() {
    // TODO Auto-generated method stub

}

protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

protected void onStop() {
    super.onStop();

    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

protected void onActivityResult(int requestCode, int responseCode,
        Intent intent) {
    if (requestCode == RC_SIGN_IN) {
        mIntentInProgress = false;

        if (!mGoogleApiClient.isConnecting()) {
            mGoogleApiClient.connect();
        }
    }
}

public void onConnectionSuspended(int cause) {
    mGoogleApiClient.connect();
}

    }

Dans ce code, si je commente .addConnectionCallbacks et .addOnConnectionFailedListener, l'erreur disparaît. L'erreur semble être liée à leurs arguments.

    mGoogleApiClient = new GoogleApiClient.Builder(this)
        //  .addConnectionCallbacks(this)
        //  .addOnConnectionFailedListener(this)
            .addApi(Plus.API, null)
            .addScope(Plus.SCOPE_PLUS_LOGIN).build();

Activité principale mise à jour, après le remplacement des outils pour

    GooglePlayServicesClient.ConnectionCallbacks,
    GooglePlayServicesClient.OnConnectionFailedListener

MainActivity.Java (Mise à jour)

    package mad.project.mightysatta;

    import Android.content.Intent;
    import Android.content.IntentSender.SendIntentException;
    import Android.os.Bundle;
    import Android.support.v4.app.Fragment;
    import Android.support.v7.app.ActionBarActivity;
    import Android.view.LayoutInflater;
    import Android.view.Menu;
    import Android.view.MenuInflater;
    import Android.view.MenuItem;
    import Android.view.View;
    import Android.view.ViewGroup;

    import com.google.Android.gms.common.ConnectionResult;
    import com.google.Android.gms.common.GooglePlayServicesClient;
    import com.google.Android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
    import com.google.Android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;
    import com.google.Android.gms.common.api.GoogleApiClient;
    import com.google.Android.gms.plus.Plus;

    public class MainActivity extends ActionBarActivity implements
    GooglePlayServicesClient.ConnectionCallbacks,
    GooglePlayServicesClient.OnConnectionFailedListener {

/* Request code used to invoke sign in user interactions. */
private static final int RC_SIGN_IN = 0;

/* Client used to interact with Google APIs. */
private GoogleApiClient mGoogleApiClient;

/*
 * A flag indicating that a PendingIntent is in progress and prevents us
 * from starting further intents.
 */
private boolean mIntentInProgress;

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

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Plus.API, null)
            .addScope(Plus.SCOPE_PLUS_LOGIN).build();

    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    // getMenuInflater().inflate(R.menu.main, menu);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
    // return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);
        return rootView;
    }
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    // TODO Auto-generated method stub

    if (!mIntentInProgress && result.hasResolution()) {
        try {
            mIntentInProgress = true;
            result.startResolutionForResult(this, // your activity
                    RC_SIGN_IN);
        } catch (SendIntentException e) {
            // The intent was canceled before it was sent. Return to
            // default
            // state and attempt to connect to get an updated
            // ConnectionResult.
            mIntentInProgress = false;
            mGoogleApiClient.connect();
        }
    }

}

@Override
public void onConnected(Bundle connectionHint) {
    // TODO Auto-generated method stub

}

@Override
public void onDisconnected() {
    // TODO Auto-generated method stub

}

protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

protected void onStop() {
    super.onStop();

    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

protected void onActivityResult(int requestCode, int responseCode,
        Intent intent) {
    if (requestCode == RC_SIGN_IN) {
        mIntentInProgress = false;

        if (!mGoogleApiClient.isConnecting()) {
            mGoogleApiClient.connect();
        }
    }
}

public void onConnectionSuspended(int cause) {
    mGoogleApiClient.connect();
}

    }
34
Taha Rushain

Je vois dans leur documentation où ils vous indiquent clairement d'inclure cette importation:

import com.google.Android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;

Cependant, l'erreur générée attend une classe différente de GooglePlayServicesClient.ConnectionCallbacks, c'est demander GoogleApiClient.ConnectionCallbacks. Essayez de changer vos implémentations pour utiliser le nom de classe plus qualifié. Cela semble être la seule chose possible qui jette le code pour une boucle et sans le nom de classe qualifié explicite, le nom de classe directement importé sera utilisé par défaut.

Il est toujours plus difficile de remettre en question le manuel.

Edit: Je veux dire un changement comme celui-ci:

public class MainActivity 
    extends ActionBarActivity 
    implements GoogleApiClient.ConnectionCallbacks,
               GoogleApiClient.OnConnectionFailedListener {
72
Sylas Seabrook

Moi aussi j'ai fait face au même problème, j'ai résolu en faisant les choses suivantes.

importer le bon ConnectionCallbacks.

voici mon code:

import Android.content.Context;
import Android.os.Bundle;

import com.google.Android.gms.common.ConnectionResult;
import com.google.Android.gms.common.api.GoogleApiClient;
import com.google.Android.gms.drive.Drive;

public class GplusLogin implements
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {
GoogleApiClient mGoogleApiClient;
GplusLogin(Context context){

    mGoogleApiClient = new GoogleApiClient.Builder(context)
            .addApi(Drive.API)
            .addScope(Drive.SCOPE_FILE)
            .addConnectionCallbacks((GoogleApiClient.ConnectionCallbacks) context)
            .addOnConnectionFailedListener(this)
            .build();
}

@Override
public void onConnected(Bundle bundle) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}

@Override
public void onConnectionSuspended(int i) {

}
}
16
raju

s’avère qu’ils (google) ne suivent pas beaucoup le guide eux-mêmes. Utilisez leur Google Drive Android Quickstart comme référence, qu’ils mentionnent en fait dans la partie supérieure du didacticiel, mais ils lui donnent le nom trompeur "Android Quickstart" même bien qu'il soit spécifique à Google Drive

La note en haut de le guideThe note at the top of the guide

2
woojoo666

cliquez sur alt entrer et forcer Android studio à implémenter:

GoogleApiClient.ConnectionCallbacks,

GoogleApiClient.OnConnectionFailedListener

2
carlos
   implements LocationListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,OnMapReadyCallback

à l'activité

0
Brinda Rathod