访问所有活动中的 GoogleApiClient 对象

2023-11-21

如果大多数人想要使用 Google Plus 登录他们的应用程序,这似乎是一件简单的事情:s。

在活动 1 中:

我让用户登录。

登录后,我想让该用户对象全局可访问,因此我将其添加到 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;
    }
}

通过像这样绑定它:

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

有人可以告诉我完成此任务的正确方法吗?我希望该用户对象可用于所有类,并且我在这方面花费了太多时间:|。

我是不是哪里搞砸了?啊...

编辑:活动 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 中成功登录并获取帐户信息。


在清单文件中添加 google play 位置服务依赖项和位置权限

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

Note:不要忘记将此子类的完全限定名称指定为 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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问所有活动中的 GoogleApiClient 对象 的相关文章

随机推荐

  • 如何防止MATLAB打印错误空格和使用错误字体?

    Matlab 2015a 在长字符串中的 之前插入空格 但在短字符串中则不插入空格 xlabel 在某些情况下 可以通过使用 UTF 8 字母来解决 但在其他情况下这会失败 请参阅 2 文本的字体应该是Helvetica但看起来不一样 虽然
  • iOS 上的线程安全延迟初始化

    我有一个视图控制器 我想延迟初始化 初始化后 尽可能使用相同的副本 我不使用单例 因为我最终想从内存中删除它 我使用 getter 来这样做 我的代码如下所示 property retain UIViewController myContr
  • 确定 ASP.NET 站点的“活跃”用户数

    在 ASP NET 站点上 有哪些技术可用于跟踪在任何给定时间点登录该站点的用户数量 例如 我可以生成一份显示如下内容的报告 10 00am 11 00am 12 00pm 1 00pm 2 00pm 3 25 25 32 45 40 37
  • 如何使 svn:externals 策略适应 git 子模块?

    我无法弄清楚如何改变我的心态以使用 git 并遇到了以下问题 我遇到的情况是 我们有一个共享引擎和多个使用该引擎的项目 内部开发团队和第二方团队可能正在开发使用共享引擎的项目 并且希望在开发过程中尽可能多地使用共享引擎的 HEAD 直到发布
  • 将 HTML 表单数据传递给 Javascript 函数

    我创建了一个表单 其中有一个下拉菜单可供选择 以及其他三个文本字段供用户输入数据 我需要对用户输入的数据进行计算 然后显示结果 现在 我只想能够将结果传递到函数中并打印结果 从那里我将弄清楚如何将这些输出显示到表格中 现在 我无法确定特定元
  • 为什么异步函数被调用两次?

    我正在使用线程计时器来做一些定期工作 private static async void TimerCallback object state if Interlocked CompareExchange ref currentlyRunn
  • jest.fn(implementationCallback) 和 jest.fn().mockImplementation(implementationCallback) 之间的区别

    我注意到当我们 jest fn 并将实现作为 fn 和 jest fn mockImplementation 中的参数传递时 我们得到了相同的行为 如果是这样 选择合适只是一个品味问题吗 Example jest fn num1 num2
  • jquery datepicker范围(mindate maxdate)不起作用

    我正在尝试为表单上的 jquery 日期选择器设置一个范围 但是当我打开表单时 它允许我选择任何日期
  • org.apache.solr.common.SolrException:缺少内容流

    我已经使用 Tomcat 和我的安装了 Apache Solr solr admin工作正常 但是当我尝试发出 solr update我收到以下错误 可能是什么原因 org apache solr common SolrException
  • 以编程方式访问 Google Chrome 历史记录

    我想在谷歌浏览器中索引所有用户操作和网站 我了解 google chrome 索引 sqlLite 数据库中的所有数据 我如何在我自己的应用程序中以编程方式访问 chrome 网络历史记录 您需要从以下位置下载适当的程序集SqLite 下载
  • chrome.runtime 是否支持使用可传输对象发布消息?

    我正在学习可转移对象 http updates html5rocks com 2011 12 Transferable Objects Lightning Fast 它们看起来非常棒 我想在我的扩展中使用它们来加速数据从 iframe 内部
  • Java 错误:EventDispatchThread.run() 行:不可用 [局部变量不可用]

    当我尝试在调试器中启动代码时 出现以下错误 EventDispatchThread run line not available local variables unavailable 代码非常大 我无法在这里发布 但无论如何这里有一些细节
  • 多次登录尝试后实施禁令的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 在我实施了自己的禁止过多尝试的系统后 过去两天我一直在研究这个问题 但我还没有找到我正在寻找的正确答案 这几乎是 实现这一点的最佳方法是什么 目前我是通过IP封禁的方式实现的 如果同
  • rllib 使用自定义注册环境

    Rllib 文档提供了一些有关如何创建和训练自定义环境 有一些有关注册该环境的信息 但我想它的工作方式需要与健身房登记 我正在与简单走廊环境 如果我将注册码添加到文件中 如下所示 from ray tune registry import
  • 为什么 UIButton 没有返回正确的约束?

    在我下面的代码中 我在垂直滚动视图中添加了 5 个按钮 每个按钮都限制为滚动视图的顶部 20 前缘 后缘及其高度 我创建了一个b1HeightConstraint多变的 它的作用是保持高度约束b1按钮 单击按钮 我试图消除此限制 然而我面临
  • 如何更改颠覆存储库的结构?

    我是 Subversion 的新手 所以我现在不知道这是不是一个愚蠢的问题 我继承了一个具有扁平结构的颠覆存储库 没有 trunk tags branches 顶层 我想重新构造它 使其遵循 trunk tags branches layo
  • 允许逗号和空格分隔的数字列表的正则表达式

    我想使用 javascript 或 jquery 编写正则表达式以允许 逗号分隔的数字列表 OR 空格分隔的数字 OR 逗号后跟空格分隔的数字 OR 上述任何一种的组合 任何非数字 空格或逗号的内容都必须被拒绝 应该通过 111 222 3
  • 如何将 pandas.core.series.Series 转换为列表?

    I tried print type numbers 2 numbers 2 tolist print type numbers 2 那是行不通的 我有
  • 需要可预测的随机生成器

    我是一名网页游戏开发人员 我遇到了随机数问题 假设一名玩家有 20 的几率用剑造成致命一击 这意味着 五分之一的点击应该是关键的 问题是我在现实生活中得到了非常糟糕的结果 有时玩家在 5 次命中中获得 3 次暴击 有时在 15 次命中中没有
  • 访问所有活动中的 GoogleApiClient 对象

    如果大多数人想要使用 Google Plus 登录他们的应用程序 这似乎是一件简单的事情 s 在活动 1 中 我让用户登录 登录后 我想让该用户对象全局可访问 因此我将其添加到 Application 对象中 public class Gl