Cela semble être une chose simple dont la plupart des gens auraient besoin s'ils souhaitaient utiliser Google Plus, connectez-vous à leur application: s.
Dans l'activité 1:
Je connecte l'utilisateur dans.
Après la connexion, je souhaite rendre cet objet utilisateur accessible de manière globale. Je l'ajoute donc à l'objet Application:
public class GlobalUserAccess extends Application {
private GoogleApiClient mGoogleApiClient;
public GlobalUserAccess(){
mGoogleApiClient = null;
}
public void setClient(GoogleApiClient client){
mGoogleApiClient = client;
}
public GoogleApiClient getClient(){
return mGoogleApiClient;
}
}
En le liant comme ceci:
GlobalUserAccess client = ((GlobalUserAccess) getApplicationContext());
client.setClient(mGoogleApiClient);
Cependant, lorsque j'essaie d'y accéder à l'activité 2:
GlobalUserAccess client = ((GlobalUserAccess) getApplicationContext());
String currentUser = Plus.AccountApi.getAccountName(client.getClient());
Je reçois l'erreur:
E/GMPM: getGoogleAppId failed with status: 10
Quelqu'un peut-il s'il vous plaît me renseigner sur la bonne façon d'accomplir cela? J'aimerais que cet objet utilisateur soit disponible pour toutes les classes et j'ai passé trop de temps à ceci: |.
Est-ce que je me suis trompé quelque part? Ah ...
EDIT: code de création du client de l'activité 1
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API)
.addScope(new Scope(Scopes.PROFILE))
.addScope(new Scope(Scopes.EMAIL))
.build();
J'utilise le code de Google directement à partir de leur référentiel Git. Il se connecte avec succès et récupère les informations du compte dans l'activité 1.
Ajouter une dépendance aux services d'emplacement Google Play et une autorisation d'emplacement dans le fichier manifeste
AndroidManifest.xml
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
app/build.gradle
compile 'com.google.Android.gms:play-services-location:11.0.0'
GoogleApiHelper.Java
public class GoogleApiHelper implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private static final String TAG = GoogleApiHelper.class.getSimpleName();
private Context context;
private GoogleApiClient mGoogleApiClient;
private ConnectionListener connectionListener;
private Bundle connectionBundle;
public GoogleApiHelper(Context context) {
this.context = context;
buildGoogleApiClient();
connect();
}
public GoogleApiClient getGoogleApiClient() {
return this.mGoogleApiClient;
}
public void setConnectionListener(ConnectionListener connectionListener) {
this.connectionListener = connectionListener;
if (this.connectionListener != null && isConnected()) {
connectionListener.onConnected(connectionBundle);
}
}
public void connect() {
if (mGoogleApiClient != null) {
mGoogleApiClient.connect();
}
}
public void disconnect() {
if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
public boolean isConnected() {
return mGoogleApiClient != null && mGoogleApiClient.isConnected();
}
private void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API).build();
}
@Override
public void onConnected(Bundle bundle) {
connectionBundle = bundle;
if (connectionListener != null) {
connectionListener.onConnected(bundle);
}
}
@Override
public void onConnectionSuspended(int i) {
Log.d(TAG, "onConnectionSuspended: googleApiClient.connect()");
mGoogleApiClient.connect();
if (connectionListener != null) {
connectionListener.onConnectionSuspended(i);
}
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d(TAG, "onConnectionFailed: connectionResult = " + connectionResult);
if (connectionListener != null) {
connectionListener.onConnectionFailed(connectionResult);
}
}
public interface ConnectionListener {
void onConnectionFailed(@NonNull ConnectionResult connectionResult);
void onConnectionSuspended(int i);
void onConnected(Bundle bundle);
}
}
App.Java
public class App extends Application {
private GoogleApiHelper googleApiHelper;
private static App mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
googleApiHelper = new GoogleApiHelper(mInstance);
}
public static synchronized App getInstance() {
return mInstance;
}
public GoogleApiHelper getGoogleApiHelperInstance() {
return this.googleApiHelper;
}
public static GoogleApiHelper getGoogleApiHelper() {
return getInstance().getGoogleApiHelperInstance();
}
}
Remarque: N'oubliez pas de spécifier le nom complet de cette sous-classe en tant qu'attribut "Android: name" dans la balise de votre AndroidManifest.xml.
Vous pouvez obtenir apiClient par rappel et savoir quand il se connectera
App.getGoogleApiHelper().setConnectionListener(new GoogleApiHelper.ConnectionListener() {
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnected(Bundle bundle, GoogleApiClient googleApiClient) {
//this function will call whenever google api connected or already connected when setting listener
//You are connected do what ever you want
//Like i get last known location
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
}
});
Ou vous pouvez aussi l'obtenir comme ça
if(App.getGoogleApiHelper().isConnected())
{
//Get google api client from anywhere
GoogleApiClient client = App.getGoogleApiHelper().getGoogleApiClient();
}
Pour accéder à un objet de partout, vous pouvez faire comme je l’ai fait ici App.Java . N'oubliez pas d'ajouter une application dans manifeste comme ça
<application
Android:name=".App"
maintenant pour accéder à l'objet simplement le faire de n'importe où
App.getGoogleApiHelper();
Consultez également ma classe GoogleApiHelper ici GoogleApiHelper.Java
Pour GooglePlus Api, consultez ceci GooglePlusAPI . Suivez ces étapes.
Code App en fonction de votre code
public class App extends Application {
private GoogleApiClient mGoogleApiClient;
private static App mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public void setClient(GoogleApiClient client){
mGoogleApiClient = client;
}
public GoogleApiClient getClient(){
return mGoogleApiClient;
}
}
maintenant pour initialiser et accéder
App.getInstance().setClient(client);
GoogleApiClient client = App.getInstance().getClient();
Dans votre activité 1, lorsque vous essayez d’obtenir un objet Application, procédez comme suit:
GlobalUserAccess client = ((GlobalUserAccess) getApplication());
Et ensuite, définissez l'objet GoogleApiClient
à l'aide de la méthode setClient
. Dans votre activité2, utilisez la même méthode pour obtenir un objet Application.