2015-10-28 18 views
11

Bu, kullanıcıların Google Plus uygulamasını kullanmak istedikleri takdirde uygulamalarının çoğuna ihtiyaç duyabilecekleri basit bir şey gibi görünüyor: s.Tüm Etkinlikler İçinde GoogleApiClient nesnesine erişme

Faaliyet 1'de

. Ben kullanıcıyı oturum

O kullanıcı nesnesi global olarak erişilebilir hale getirmek isteriz, oturum açma sonra

, bu yüzden Uygulama nesnesine ekleyin:

public class GlobalUserAccess extends Application { 

    private GoogleApiClient mGoogleApiClient; 

    public GlobalUserAccess(){ 
     mGoogleApiClient = null; 
    } 

    public void setClient(GoogleApiClient client){ 
     mGoogleApiClient = client; 
    } 

    public GoogleApiClient getClient(){ 
     return mGoogleApiClient; 
    } 
} 

GlobalUserAccess client = ((GlobalUserAccess) getApplicationContext()); 
client.setClient(mGoogleApiClient); 

Ancak, ben bunu erişmeye çalıştığınızda: öylesine gibi bağlayıcı olarak

Faaliyet 2'de: Bunu gerçekleştirmek için

E/GMPM: getGoogleAppId failed with status: 10 

birisi doğru yolda beni doldurunuz Can:

GlobalUserAccess client = ((GlobalUserAccess) getApplicationContext()); 
String currentUser = Plus.AccountApi.getAccountName(client.getClient()); 

hatası alıyorum? Bu kullanıcı nesnesinin tüm sınıflara açık olmasını isterdim ve bu konuda çok fazla zaman geçirdim: |.

Bir yerlere mi bulaştım? Ah ...

DÜZENLEME: Faaliyet 1 istemci oluşturma kodu onların Git deposundan doğrudan Googleın kodunu kullanıyorum

mGoogleApiClient = new GoogleApiClient.Builder(this) 
     .addConnectionCallbacks(this) 
     .addOnConnectionFailedListener(this) 
     .addApi(Plus.API) 
     .addScope(new Scope(Scopes.PROFILE)) 
     .addScope(new Scope(Scopes.EMAIL)) 
     .build(); 

.

GlobalUserAccess client = ((GlobalUserAccess) getApplication()); 

Sonra GoogleApiClient nesne setClient yöntemi kullanarak ayarlayın: Eğer aşağıda yapmalıyım Uygulama nesnesini almaya çalışırken başarıyla oturum açan ve etkinlik 1'de Faaliyet 1.

+0

gibi alabilirsiniz zaman alabilir. – Sabeeh

+0

Bitti! Gönderiyi düzenledim. – Kris

cevap

23

google manifest dosyasında yer hizmetleri bağımlılık ve konum izni oynamak ekle

AndroidManifest.xml göre

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

uygulama/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(); 
    } 
} 

Not: AndroidManifest.xml etiketinizde bu alt sınıfın tam niteliğini "android: name" özelliği olarak belirtmeyi unutmayın.

Sen callback'inde tarafından apiClient almak ve onu

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); 
      } 
     }); 

bağlayacak Yoksa ayrıca mGoogleApiClient kodunu sonrası oluşturulan bu nasıl

if(App.getGoogleApiHelper().isConnected()) 
{ 
    //Get google api client from anywhere 
    GoogleApiClient client = App.getGoogleApiHelper().getGoogleApiClient(); 
} 
+1

Yukarıda tanımlanan sınıf derleme geçmez. Eksik olan bir dizi değişken ve hata vardır (örn., Her yerde tanımlanmış bağlam, konum vb. Değişken yok) – Codevalley

+0

Uygulama sınıfından içeriğin geçirilmesi derleme sorununu çözer. – Bikash

+3

@Codevalley bu eksik ve Android N ile uyumlu değil, tam ve mükemmel hale getirmeye çalışacağım. Geri bildiriminiz için teşekkürler – Sabeeh

0

hesap bilginizi elde . Aktivitenizde2 Uygulama nesnesini almak için aynı yolu kullanın.

3

Her yerden nesnelere erişmek için, burada yaptığım gibi yapabilirsin App.java. basitçe yapmak nesneye erişim şimdi bu

<application 
     android:name=".App" 

gibi manifest'te uygulamayı eklemesi unutmayın herhangi

App.getGoogleApiHelper(); 

Ayrıca burada GoogleApiHelper sınıfı GoogleApiHelper.java

GooglePlus Api kontrol için ödeme yerden Bu GooglePlusAPI. Bu adımları takip et.

Uygulama Kodu, başlatmak için kod artık

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; 
    } 
} 

ve erişim

App.getInstance().setClient(client); 
GoogleApiClient client = App.getInstance().getClient(); 
+0

Bu çalışır (çeşit). Ben java.lang.IllegalStateException alıyorum: GoogleApiClient bağlı olmalıdır. İstemciyi Uygulama sınıfında sürekli olarak bağlamalı mıyım? – Kris

+0

@Kris, "GoogleApiClient.ConnectionCallbacks" ve "GoogleApiClient.OnConnectionFailedListener" öğelerini uygulamanız gereken yerdeyim ve geri çağırma ayarlaması yapmalısınız "GoogleApiHelper" Sınıfım, GoogleApiClient'i – Sabeeh

+0

@ yaptığım gibi buraya bağlayabilirsiniz @ Krisse müşteri bağlandığında o zaman 'onConnected 'işlevi çağrılır. Konumunuza veya diğer google hizmetlerine erişmek için ihtiyaç duyduğunuz şeyleri yapın – Sabeeh

İlgili konular