<Your App> 在使用 Google Play 服务时遇到问题 - 使用 GoogleApiClient 时,它总是会触发 onConnectionFailed

Posted

技术标签:

【中文标题】<Your App> 在使用 Google Play 服务时遇到问题 - 使用 GoogleApiClient 时,它总是会触发 onConnectionFailed【英文标题】:<Your App> is having trouble with Google Play services - When using GoogleApiClient, it always trigger onConnectionFailed 【发布时间】:2016-09-25 09:03:31 【问题描述】:

目前,我的应用正在使用

minSdkVersion 14 targetSdkVersion 23 编译'com.google.android.gms:play-services-gcm:8.4.0' 编译 'com.google.android.gms:play-services-base:8.4.0' 编译 'com.google.android.gms:play-services-analytics:8.4.0' 编译 'com.google.android.gms:play-services-ads:8.4.0' 编译 'com.google.android.gms:play-services-drive:8.4.0'

我正在使用以下代码执行GoogleApiClient 连接。

public class GoogleApiClientFragment extends Fragment implements
        GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener 

    public interface ConnectionCallbacks 
        void onConnected(GoogleApiClient googleApiClient, int action);
        void onCancel(int action);
    

    public static GoogleApiClientFragment newInstance(String accountName, int action) 
        GoogleApiClientFragment googleApiClientFragment = new GoogleApiClientFragment();
        Bundle bundle = new Bundle();
        bundle.putString(INTENT_EXTRA_ACCOUNT_NAME, accountName);
        bundle.putInt(INTENT_EXTRA_ACTION, action);
        googleApiClientFragment.setArguments(bundle);
        return googleApiClientFragment;
    

    /**
     * Handles resolution callbacks.
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode,
                                    Intent data) 
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == RequestCode.REQUEST_GOOGLE_API_CLIENT_CONNECT) 
            if (resultCode == Activity.RESULT_OK) 
                mGoogleApiClient.connect();
             else 
                Activity activity = this.getActivity();
                if (activity instanceof ConnectionCallbacks) 
                    ConnectionCallbacks connectionCallbacks = (ConnectionCallbacks)activity;
                    connectionCallbacks.onCancel(action);
                
            
        
    

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setRetainInstance(true);

        Bundle bundle = this.getArguments();
        this.accountName = bundle.getString(INTENT_EXTRA_ACCOUNT_NAME);
        this.action = bundle.getInt(INTENT_EXTRA_ACTION);
    

    @Override
    public void onResume() 
        super.onResume();
        if (mGoogleApiClient == null) 
            mGoogleApiClient = new GoogleApiClient.Builder(this.getContext())
                    .setAccountName(accountName)
                    .addApi(Drive.API)
                    .addScope(Drive.SCOPE_FILE)
                    .addScope(Drive.SCOPE_APPFOLDER)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();

            mGoogleApiClient.connect();
        
    

    @Override
    public void onConnected(Bundle bundle) 
        Log.i(TAG, "GoogleApiClient connected");

        Activity activity = this.getActivity();
        if (activity instanceof ConnectionCallbacks) 
            ConnectionCallbacks connectionCallbacks = (ConnectionCallbacks)activity;
            connectionCallbacks.onConnected(mGoogleApiClient, action);
        
    

    @Override
    public void onConnectionSuspended(int i) 
        Log.i(TAG, "GoogleApiClient connection suspended");
    

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) 
        Log.i(TAG, "GoogleApiClient connection failed: " + connectionResult.toString());

        if (!connectionResult.hasResolution()) 
            Utils.showLongToast("debug two " + connectionResult.toString());

            // show the localized error dialog.
            GoogleApiAvailability.getInstance().getErrorDialog(this.getActivity(), connectionResult.getErrorCode(), 0).show();
            return;
        
        try 
            connectionResult.startResolutionForResult(this.getActivity(), RequestCode.REQUEST_GOOGLE_API_CLIENT_CONNECT);
         catch (IntentSender.SendIntentException e) 
            Log.e(TAG, "Exception while starting resolution activity", e);
        
    

    private String accountName = null;
    private int action = -1;
    private GoogleApiClient mGoogleApiClient;

    public static final int ACTION_LOAD_FROM_CLOUD = 0;
    public static final int ACTION_SAVE_TO_CLOUD = 1;
    private static final String INTENT_EXTRA_ACCOUNT_NAME = "INTENT_EXTRA_ACCOUNT_NAME";
    private static final String INTENT_EXTRA_ACTION = "INTENT_EXTRA_ACTION";

    private static final String TAG = "GoogleApiClientFragment";

某些用户(并非所有用户)遇到以下问题。

在使用 Google Play 服务时遇到问题。如果问题 仍然存在,请联系开发者寻求帮助。

错误对话框是由于onConnectionFailed 中的GoogleApiAvailability.getInstance().getErrorDialog 代码造成的。

无论何时

        mGoogleApiClient = new GoogleApiClient.Builder(this.getContext())
                .setAccountName(accountName)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .addScope(Drive.SCOPE_APPFOLDER)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

被执行,它总是命中

@Override
public void onConnectionFailed(ConnectionResult connectionResult) 

当我使用 toString 打印出 connectionResult 时,它给出了

ConnectionResultstatusCode=INTERNAL_ERROR, resolution=null, message=null

我的一个用户具有以下规范。

索尼 Xperia z5 Android 6 Google Play 服务 9.0.83 他的设备中只有 1 个 Google 帐户

我什至尝试使用 Google Play Services 9.0.1 重新编译 APK。但是,同样的问题仍然存在。

关于如何解决问题的任何想法?

【问题讨论】:

关于最新版本的 Google Play 服务,我认为现在存在错误问题。如果可以帮助您,请尝试检查此SO question。 @KENdi 似乎不是同一个问题。不过还是谢谢。 您是否在遇到错误后尝试重新连接,因为我在文档中发现它说尝试重新连接后可能会正常。正如文档所指developers.google.com/android/reference/com/google/android/gms/… 你是在请求安卓 6 的权限吗?在这种情况下,应用程序不会崩溃,但 connectionResult 将失败。 @JpCrow,我已经检查过了,这不是问题。您可以通过自己安装应用程序“JStock”来检查它。 【参考方案1】:

可能是多个问题导致的,你看过ConnectionResult的文档吗?它是这样说的:

可用于解决错误并确定发生何种错误的 ConnectionResult。要解决该错误,必须从具有传递给 startResolutionForResult(Activity, int) 的非负 requestCode 的活动开始解析。如果用户已解决问题(resultCode 为 RESULT_OK),应用程序应在其 Activity 中实现 onActivityResult 以再次调用 connect()。

还有很多关于你在这篇文章中收到的错误代码的信息:Error : ConnectionResultstatusCode=INTERNAL_ERROR, resolution=null

问题也可能是您没有在控制台中添加 Drive API。但是你应该已经收到了一条 logcat 消息。

好的,我还测试了 JStock 应用:

搭载 Android 6 的 Moto G3

而且我无法重现该错误。但是当您将手机设置为飞行模式时,底部的连接栏不会改变。

我不确定这是否对您有任何帮助,但请告诉我。

【讨论】:

嘿,抱歉没有说清楚。要触发GoogleApiClient 运行,您需要转到“从云端打开”或“保存到云端”。这样,它将使用GoogleApiClient 访问Google Drive。请注意,以上 2 个功能已锁定。但是,您可以通过激活 7 天免费试用轻松解锁它们。你能告诉我,你是否可以重现这个问题? (通过使用 Nexus 5 和 Nexus 4,我无法在我身边) 我会的,我会告诉你的 :) 从云中保存和检索都对我有用。我第一次尝试保存到云端失败了,但第二次成功了。你看过我最初的回答吗?有什么可以帮助你的吗? 感谢测试。您发布的 SO 链接对我没有帮助。您发布的 SO 链接的解决方案正在 Google API 控制台上修复。但是,不适用于我的情况。如果我的 Google API 控制台出现问题,所有用户都会失败。【参考方案2】:

鉴于它正在其他 Anrdoid 6.0 设备上运行,并且您已指定要投诉的设备。我怀疑,这不是你的应用程序。 Sony Xperia z5 在更新到 Android 6.0 时存在一个已知问题。

索尼声称已经修复了这个错误。

回复:Z5 Premium Marshmallow 更新后“Google Play 商店已停止” 四月

大家好,我今天得到消息,这将在计划很快发布的下一个软件更新中修复。 索尼 Xperia 官方支持人员

因此,请务必建议客户确保所有索尼更新都是最新的,但这仍然不适用于所有消费者。 坏消息是,除了恢复出厂设置之外没有任何解决办法,所以回到 Android 5 有时会失败。

我建议指导客户与索尼讨论这个问题,如果恢复出厂设置不能解决问题,这将是消费者是否应该更换手机的问题。

索尼移动网站"Google Play Store has Stopped" after Z5 Premium Marshmallow Update 上的这个帖子详细讨论了这些问题(上面有 122 条消息),除了恢复出厂设置之外,还有很多建议,例如使用索尼 PC 伴侣。

Xperia Z5 Issues After Android Marshmallow Update: Here's A Fix From Sony

Sony Xperia Z5 用户对收到 Android 6.0 的兴奋 Marshmallow 更新似乎是短暂的,因为 手机现在在更新设备后抱怨问题 最新的操作系统。

智能手机用户已访问这家日本公司的在线网站 支持页面发泄他们的愤怒并抱怨访问谷歌 Play 商店在更新到 Android 6.0 Marshmallow 后停止。

一些 Xperia Z5 用户抱怨他们的智能手机“坏了” 安装新操作系统后。他们还受到了一个弹出式标志的欢迎 上面写着他们的“Google Play 商店已停止”。用户还 无法打开 Play 商店应用。

“一旦我更新到 Marshmallow,我就会不断收到 “不幸的是,Google Play 商店已停止......”并且消息一直存在 每 5 秒出现一次。我尝试清除缓存,删除数据, 卸载、禁用应用程序、强制关闭、退出谷歌 并重新开始。不工作。我不停地弹出窗口,它 更新到棉花糖后就发生了,”一位用户在 支持论坛。

“是的,这里有同样的问题。尝试卸载 /settings/apps/google play store 中的更新,也尝试安装 .apk 通过 chrome。仍然收到错误消息。与 客户支持和运行 Sony Bridge 的“修复”选项是 他们提供的唯一建议。在我尝试之前创建一个备份 运行它......”另一个说。

索尼已经承认了这个问题,并且只提供了一家工厂 重置。

虽然这解决了其他 Xperia Z5 用户的问题,但有些是 尽管执行了重置,但仍然无法访问 Play 商店。

如果这发生在其他设备上,请告诉我,因为此时,我建议这是问题所在,无需更多区分细节。

我已经从高到低进行了搜索,并且鉴于它适用于大多数设备而不是少数设备,因此很难理解问题所在。我建议使用更新的依赖项运行它,因为 android 6.0 手机使用 Google Play Services 9.0.83,我知道你已经运行了这个,但最好跟上这个。

dependencies 
    compile 'com.google.android.gms:play-services:9.0.2'

鉴于 Google 服务存在已知错误,Android 6.0 更新以及 Android 5.0 与 5.0.1 和 5.0.2 更新之间存在许多错误。 5.1 中修复了更多问题,但确实很难解决某些问题。

我也遇到过一个应用程序的问题,人们说某某设备无法正常工作,然后尝试对其进行故障排除,有时用户手机设置中可能存在问题,这也可能导致应用程序和其中一些设置因手机而异。

我建议在您的 Builder 中明确创建您的侦听器,并添加更多日志记录以检查它在失败连接中的确切位置,因为您可以在失败连接中建立连接并需要在其中管理您的连接连接回调。

mGoogleApiClient = new GoogleApiClient.Builder(this.getContext())
                .setAccountName(accountName)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .addScope(Drive.SCOPE_APPFOLDER)
                .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() 
            @Override
            public void onConnected(Bundle bundle) 

                if(mGoogleApiClient != null) 
                    Log.i(TAG, "GoogleApiClient connected");

                    Activity activity = this.getActivity();
                    if (activity instanceof ConnectionCallbacks) 
                        ConnectionCallbacks connectionCallbacks = (ConnectionCallbacks)activity;
                        connectionCallbacks.onConnected(mGoogleApiClient, action);
                    
                
            

            @Override
            public void onConnectionSuspended(int i) 
                mGoogleApiClient.connect();
            
        )
        .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() 
            @Override
            public void onConnectionFailed(ConnectionResult connectionResult) 
                Log.i(TAG, "GoogleApiClient connection failed: " + connectionResult.toString());

                if (!connectionResult.hasResolution()) 
                    Utils.showLongToast("debug two " + connectionResult.toString());

                    // show the localized error dialog.
                    GoogleApiAvailability.getInstance().getErrorDialog(this.getActivity(), connectionResult.getErrorCode(), 0).show();
                    return;
                
                try 
                    connectionResult.startResolutionForResult(this.getActivity(), RequestCode.REQUEST_GOOGLE_API_CLIENT_CONNECT);
                 catch (IntentSender.SendIntentException e) 
                    Log.e(TAG, "Exception while starting resolution activity", e);
                
            )
        .build();

    mGoogleApiClient.connect();

    

我还会添加您的班级成员/变量:

private String accountName = null;
private int action = -1;
private GoogleApiClient mGoogleApiClient;
// etc

放在班级的顶部,因为将它们放在底部会令人困惑,最好有可读的代码。

这个问题Multiple GoogleApiClient not firing connect()也可能有帮助。

其他人登陆这里的完整性问题:

还需要在某个时候更新到 Firebase Migrate a GCM Client App for Android to Firebase Cloud Messaging。

来自Release Notes May 2016 - v.9.0

Google 云消息传递 Google Cloud Messaging (GCM) 与 Firebase 集成。 GCM 的现有用户可以继续使用 GCM 而不会中断,但我们强烈建议升级到新的和简化的 Firebase Cloud Messaging (FCM) API,以便用户可以从未来发布的新功能和增强功能中受益。要了解更多信息,请参阅将适用于 Android 的 GCM 客户端应用迁移到 Firebase 云消息传递。

【讨论】:

他可以在 Google Play 商店崩溃中检查这一点。如果崩溃只发生在 Sonys 这可能是问题:-) 这就是我的想法,这确实是最好的答案:-) 另一位受影响的用户正在使用 HTC eye Android 5.0.2。但是,我仍在等待来自用户的更多信息......【参考方案3】:

尝试将 minSdkVersion 14 更新到 minSdkVersion 16 或更高版本。因为它发生在我身上,经过长时间的搜索,我改变了它并解决了我的问题,所以它可能对你有用。

【讨论】:

您是否有任何参考资料可以解释为什么更改为 sdk 14 会起作用? 也许你会从这里得到答案:reddit.com/r/androiddev/comments/3ghr6g/minsdkversion_16【参考方案4】:

我遇到了完全相同的问题,当我的应用程序显示错误对话框时,它也会在确切的点 (OnConnectionFailed) 崩溃。但是如果我不点击 OK 按钮,它不会崩溃,只是它无法连接到 Google Play 服务。 我有两个在 graddle 中设置的应用程序,一切几乎相同,一个崩溃,这个仍然像以前一样运行。 https://play.google.com/store/apps/details?id=com.softphan.services.smartcallrecorder

这应该有多荒谬?我运行的是 Google Nexus 5,所以问题不应该与 Sony 产品有关。

【讨论】:

【参考方案5】:

在与我的用户密切合作后,我意识到解决方案是

1。卸载 Google Play 服务

2。再次更新 Google Play 服务

https://play.google.com/store/apps/details?id=com.google.android.gms&hl=en

之后就可以正常使用了。如果仍然没有,也许重新启动您的设备可能会有所帮助?!

【讨论】:

这是否彻底解决了问题?就我而言,在我更新到最新版本(9.0.83)后,问题会在某个时候再次出现...... 我有一个 Android 5 用户和一个 Android 6 用户。他们都可以通过卸载 GPS 并重新安装最新版本来解决这个问题。也许重新启动设备会再次有帮助? 感谢您的帮助。我认为我的问题略有不同,所以我的情况不相关。还是谢谢

以上是关于<Your App> 在使用 Google Play 服务时遇到问题 - 使用 GoogleApiClient 时,它总是会触发 onConnectionFailed的主要内容,如果未能解决你的问题,请参考以下文章

错误:defineAlreadyDefined

Yii2 Unable to verify your data submission

Unable to verify your data submission.加入了_csrf也报400错误的解决

yii框架post提交遇到400 (Unable to verify your data submission. )

Verify the Developer App certificate for youraccount is trusted on your device

如何定义回复地址?