Android:如何解决服务中的 Google API 连接失败问题?

2024-01-11

here https://developers.google.com/android/guides/api-client是官方指南提供的代码,而这是导致问题的代码片段。

@Override
public void onConnectionFailed(ConnectionResult result) {
    if (mResolvingError) {
        // Already attempting to resolve an error.
        return;
    } else if (result.hasResolution()) {
        try {
            mResolvingError = true;
            result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
        } catch (IntentSender.SendIntentException e) {
            // There was an error with the resolution intent. Try again.
            mGoogleApiClient.connect();
        }
    } else {
        // Show dialog using GooglePlayServicesUtil.getErrorDialog()
        mResolvingError = true;
        GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, REQUEST_RESOLVE_ERROR)
                .setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        mResolvingError = false;
                    }
                });
    }
}

如果我在服务中使用它,当你读取变量时this作为参数传递给这些函数,它们需要一个 Activity 类型。 我应该怎么做?这是一项服务。

出于同样的原因,我无法获得活动结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_RESOLVE_ERROR) {
    mResolvingError = false;
    if (resultCode == RESULT_OK) {
        // Make sure the app is not already connected or attempting to connect
        if (!mGoogleApiClient.isConnecting() &&
                !mGoogleApiClient.isConnected()) {
            mGoogleApiClient.connect();
        }
    }
}
}

此答案假设您的服务是“已启动”服务。如果它是绑定服务或意向服务,请在评论中指出,我将更新此处包含的描述和代码。

我建议的解决方案是实现如下所示的活动来处理分辨率 UI。更换onConnectionFailed()使用此代码在您的服务中的方法将解析处理移交给ResolverActivity:

@Override
public void onConnectionFailed(ConnectionResult result) {
    Intent i = new Intent(this, ResolverActivity.class);
    i.putExtra(ResolverActivity.CONNECT_RESULT_KEY, result);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
}

将如下所示的活动添加到您的应用程序中。当您的服务中的连接请求失败时,连接结果是Parcelable,传递给活动。该活动处理分辨率 UI,并在完成后将状态作为 Intent Extra 返回给服务。您需要修改服务中的代码onStartCommand()检查 Intent 中的额外内容,以确定是否第一次调用它来启动服务,或者从 Intent 接收解析状态ResolverActivity.

此方法的增强功​​能是发布带有PendingIntent for ResolverActivity而不是立即启动活动。这将使用户可以选择推迟解决连接故障。

public class ResolverActivity extends AppCompatActivity {
    public static final String TAG = "ResolverActivity";

    public static final String CONNECT_RESULT_KEY = "connectResult";

    public static final String CONN_STATUS_KEY = "connectionStatus";
    public static final int CONN_SUCCESS = 1;
    public static final int CONN_FAILED  = 2;
    public static final int CONN_CANCELLED = 3;

    // Request code to use when launching the resolution activity
    private static final int REQUEST_RESOLVE_ERROR = 1111;

    private static final String ERROR_CODE_KEY = "errorCode";
    private static final String DIALOG_FRAG_TAG = "errorDialog";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Log.i(TAG, "onCreate()");

        // No content needed.
        //setContentView(R.layout.activity_main);

        Intent i = getIntent();

        ConnectionResult result = i.getParcelableExtra(CONNECT_RESULT_KEY);

        if (result.hasResolution()) {
            try {
                Log.i(TAG, "Starting error resolution...");
                result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
            } catch (IntentSender.SendIntentException e) {
                // There was an error with the resolution intent.
                sendStatusToService(CONN_FAILED);
                finish();
            }
        } else {
            // Show dialog using GooglePlayServicesUtil.getErrorDialog()
            ErrorDialogFragment.newInstance(result.getErrorCode())
                    .show(getSupportFragmentManager(), DIALOG_FRAG_TAG);
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent result) {

        if (requestCode == REQUEST_RESOLVE_ERROR) {
            if (resultCode == RESULT_OK) {
                Log.i(TAG, "onActivityResult(): Connection problem resolved");
                sendStatusToService(CONN_SUCCESS);
            } else {
                sendStatusToService(CONN_CANCELLED);
                Log.w(TAG, "onActivityResult(): Resolution cancelled");
            }
            // Nothing more to do in this activity
            finish();
        }
    }

    private void sendStatusToService(int status) {
        Intent i = new Intent(this, MyGoogleApiService.class);
        i.putExtra(CONN_STATUS_KEY, status);
        startService(i);
    }

    // Fragment to display an error dialog
    public static class ErrorDialogFragment extends DialogFragment {

        public static ErrorDialogFragment newInstance(int errorCode) {
            ErrorDialogFragment f = new ErrorDialogFragment();
            // Pass the error that should be displayed
            Bundle args = new Bundle();
            args.putInt(ERROR_CODE_KEY, errorCode);
            f.setArguments(args);
            return f;
        }

        @Override
        @NonNull
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Get the error code and retrieve the appropriate dialog
            int errorCode = getArguments().getInt(ERROR_CODE_KEY);
            return GooglePlayServicesUtil.getErrorDialog(
                    errorCode, getActivity(), REQUEST_RESOLVE_ERROR);
        }

        @Override
        public void onDismiss(DialogInterface dialog) {
            Log.i(TAG, "Dialog dismissed");
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:如何解决服务中的 Google API 连接失败问题? 的相关文章

随机推荐

  • 如何在 PowerShell 中使用 REST API 在 TFS 中创建错误?

    我正在尝试使用 PowerShell 中的 REST API 使用下面的代码在 TFS 中创建一个错误 但我无法弄清楚如何填充 Bug具有这些参数和数据名称的变量 Param string vstsAccount MyAccountName
  • 安装插件后在 Firefox 中打开我的页面

    HI 我正在尝试在安装后第一次重新启动 Firefox 后打开我的主页 为此 我在加载页面上添加事件处理程序 并检查该事件第一次执行的位置 window addEventListener load initializeOverlay fal
  • 在 R 中将 unicode 字符保存为 .pdf

    我想将特定的 unicode 字符保存到 pdf 文件中ggsave 示例代码 library ggplot2 ggplot geom point data data frame x 1 y 1 aes x y shape u2191 ge
  • ArrayList中存储不同类型

    我想将元素存储在列表中 每个元素有4个参数 我正在尝试创建一个数组列表 为每个元素存储 4 个参数 它们是不同类型的 iD intx位置 浮动y 位置 浮动名称 字符串 I use ArrayList
  • SyntaxError:使用 jQuery.ajax() 的标签无效

    我正在尝试使用以下命令对我的服务器进行 Ajax 调用jQuery call ajax type GET dataType jsonp url http iceworld sls atl com api cmd time success f
  • Python 检查 gzip 存档的完整性

    Python 中有没有办法使用 gzip 或其他模块来检查 gzip 存档的完整性 基本上 Python 中是否有与以下内容等效的内容 gunzip t my archive gz 哎呀 第一个答案 现已删除 是误读问题的结果 我建议使用g
  • 什么是 IllegalStateException?

    我正在尝试使用遵循 Fastload API http developer teradata com doc connectivity jdbc reference current samp T20208JD java txt 连接 等都是
  • CasperJS并发请求

    假设我有一个网址数组 我不想使用打开功能 因为它会等待之前的每个 url 被加载 从而减少加载时间 casper each hrefs function self href self thenOpen href function self
  • Visual Studio 2008 上的 NuPack (NuGet)

    NuPack NuGet 可以安装在 Visual Studio 2008 上吗 不 它仅支持 VS 2010 From NuPack 常见问题解答 http nupack codeplex com wikipage title Frequ
  • 在 Mechanical Turk 中,如何限制每个工人只能获得 1 个 HIT

    我从与 Mechanical Turk 工人的交流中得知 有一种方法可以限制特定工人可以完成的 HIT 数量 但我不知道该怎么做 任何帮助将不胜感激 我开发了一个主要解决这个问题的脚本 主要思想是根据数据库检查工作人员 ID 然后如果工作人
  • Swift 中自定义 UICollectionViewCell 上的标签插座导致Optional.None崩溃

    我有一个 collectionViewController 我想显示一堆带有一些标签的自定义 UICollectionViewCells 不幸的是 每当我尝试访问自定义 UICollectionViewCell 的标签时 它都会导致崩溃 C
  • 使用 C# 从线路输入连续采样的最简单方法是什么

    我想使用 C 从 PC 的音频线路中连续采样 然后处理该数据 进行采样的最佳方法是什么 您可以使用开源进行一些 基本 音频捕获NAudio http www codeplex com naudio NET 音频库 查看 NAudioDemo
  • Tonumber 函数 (tonumber ‘(一二三) --> 123

    解决后如何拼写球拍中的数字 咒语编号 https stackoverflow com questions 22696615 how to spell a number in racket spellnum 22700116 noredire
  • 如何使用java将反斜杠替换为正斜杠?

    我正在将 CSV 文件导入 MySQL 数据库 这可以使用以下方法完成java mysql支持文件路径中的正斜杠 如果用户给出路径 c upload date csv sample csv MySQL 不支持这种类型的路径模式 我想在路径中
  • 发送 post 请求 python

    我有一个网站 我想检查它自上次检查 使用哈希 以来是否已更新 问题是我需要输入用户名和密码才能访问该网站 有没有办法使用python输入用户名和密码 查看requests http docs python requests org en l
  • Clojure 中的命名空间之间共享函数

    我很可能以错误的方式处理这个问题 所以请原谅我的天真 为了学习 Clojure 我开始将 Python 的 OAuth 客户端库移植到 Clojure 我通过包装 clj http 来做到这一点 就像我在 Python 库中包装 Pytho
  • 成功会话后获取 Stripe 处理费

    我们在应用程序中创建一个 Stripe 会话 如下所示 StripeConfiguration ApiKey ConfigurationManager AppSettings StripeKey var baseUrl Configurat
  • 重置必填字段 - jQuery

    我需要一些字段 具体取决于单击的按钮 但我所看到的行为并不是我所期望或希望的 当我单击其中一个按钮时 它会按照我的意愿设置必填字段 但是如果我单击另一个按钮 它不会由于某种原因重置它们 代码如下 感谢您的任何帮助 您可以提供 functio
  • 如何根据方面术语和情感来标记文本

    我已编码按术语方面标记文本数据 然后使用维德词典进行情感标记 但结果只是输出 1表示负 1表示正 其中应该有正 负 中性3类 这是代码 import pandas as pd from vaderSentiment vaderSentime
  • Android:如何解决服务中的 Google API 连接失败问题?

    here https developers google com android guides api client是官方指南提供的代码 而这是导致问题的代码片段 Override public void onConnectionFaile