2015-10-28 134 views
11

这似乎是一个简单的事情,如果他们想使用谷歌加号与他们的应用程序大部分人将需要:秒。访问GoogleApiClient对象

在活动1:

我登录的用户

中,我想使该用户对象全局可访问的符号后,所以我把它添加到应用程序对象:

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

然而,当我尝试访问它在活动2:

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

我得到的错误:

E/GMPM: getGoogleAppId failed with status: 10 

可有人请填写我在用正确的方法来做到这一点?我希望将该用户对象提供给所有类,并且我在这方面花费了太多时间:|。

难道我弄乱的地方?啊......

编辑:客户创建自Activity 1码

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

我直接使用Google的代码从他们的Git仓库。它成功地签署并获取活动1.

+0

你如何创建mGoogleApiClient发布其代码。 – Sabeeh

+0

完成!我编辑了我的帖子。 – Kris

回答

23

加入谷歌播放清单文件位置服务的依赖和位置的权限

AndroidManifest.xml中

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

应用程序/的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(); 
    } 
} 

注意:不要忘记在你的AndroidManifest.xml标签中指定这个子类的完全限定名作为“android:name”属性。

您可以回调得到apiClient,并得到时它会连接

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

或者你也可以得到像这样

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

上面定义的类不会通过编译。有一堆缺失的变量和错误(例如,没有任何变量命名上下文,位置等在任何地方定义) – Codevalley

+0

从Application类传递上下文将解决编译问题。 – Bikash

+3

@Codevalley,这是不完整的,不与Android N兼容,我会尽量使它完整和完美。感谢您的反馈 – Sabeeh

0

的帐户信息在您的活动1,当你试图让应用程序对象,你应该如下做:

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

,然后使用GoogleApiClient对象setClient方法设置。在你的activity2中使用相同的方式来获得Application对象。

3

对于从每一个地方访问对象,你可以不喜欢我在这里做 App.java。不要忘了在清单中添加应用程序一样,

<application 
     android:name=".App" 

现在访问对象简单地做,从任何地方

App.getGoogleApiHelper(); 

而且结帐我GoogleApiHelper类在这里GoogleApiHelper.java

对于GOOGLEPLUS API检查出这GooglePlusAPI。按着这些次序。

应用程序代码,根据您的代码

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

现在初始化和访问

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

这工作(有点)。我得到了'java.lang.IllegalStateException:必须连接GoogleApiClient.'。我是否需要不断连接Application类中的客户端? (这是在活动1连接100%) – Kris

+0

@Kris您创建客户端,你必须实现'GoogleApiClient.ConnectionCallbacks'和'GoogleApiClient.OnConnectionFailedListener'并设置回调结帐我的'GoogleApiHelper'类可以连接GoogleApiClient有像我一样 – Sabeeh

+0

@克里斯当客户连接然后'onConnected'功能被称为做什么,你需要像访问位置或其他谷歌服务 – Sabeeh