在所有活动中访问 GoogleApiClient 对象
Accessing GoogleApiClient object in All Activities
这看起来很简单,如果大多数人想要使用 Google Plus 登录他们的应用程序,他们将需要:s。
在 Activity 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);
但是,当我尝试在 Activity 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();
我直接从他们的 Git 存储库中使用 Google 的代码。它成功登录并获取 Activity 中的帐户信息 1.
在您的 activity 1 中,当您尝试获取 Application 对象时,您应该执行以下操作:
GlobalUserAccess client = ((GlobalUserAccess) getApplication());
然后使用setClient
方法设置GoogleApiClient
对象。在您的 activity2 中使用相同的方式获取应用程序对象。
要从任何地方访问对象,你可以像我在这里做的那样
App.java。不要忘记像那样在清单中添加应用程序
<application
android:name=".App"
现在只需从任何地方访问对象即可
App.getGoogleApiHelper();
还可以在此处 GoogleApiHelper.java
查看我的 GoogleApi 助手 class
对于 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();
在清单文件中添加google播放位置服务依赖和位置权限
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();
}
}
注意:不要忘记将此子类的完全限定名称指定为 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();
}
这看起来很简单,如果大多数人想要使用 Google Plus 登录他们的应用程序,他们将需要:s。
在 Activity 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);
但是,当我尝试在 Activity 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();
我直接从他们的 Git 存储库中使用 Google 的代码。它成功登录并获取 Activity 中的帐户信息 1.
在您的 activity 1 中,当您尝试获取 Application 对象时,您应该执行以下操作:
GlobalUserAccess client = ((GlobalUserAccess) getApplication());
然后使用setClient
方法设置GoogleApiClient
对象。在您的 activity2 中使用相同的方式获取应用程序对象。
要从任何地方访问对象,你可以像我在这里做的那样 App.java。不要忘记像那样在清单中添加应用程序
<application
android:name=".App"
现在只需从任何地方访问对象即可
App.getGoogleApiHelper();
还可以在此处 GoogleApiHelper.java
查看我的 GoogleApi 助手 class对于 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();
在清单文件中添加google播放位置服务依赖和位置权限
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();
}
}
注意:不要忘记将此子类的完全限定名称指定为 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();
}