<your app =“”> Google Play服务遇到问题 - 使用GoogleApiClient时,它始终触发onConnectionFailed

时间:2016-05-27 06:36:34

标签: android google-play-services google-signin

目前,我的应用正在使用

  • 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服务时遇到问题。如果问题   如果仍然存在,请与开发者联系以获取帮助。

enter image description here

错误对话框来自GoogleApiAvailability.getInstance().getErrorDialog中的onConnectionFailed代码。

每当

        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时,它会给出

ConnectionResult{statusCode=INTERNAL_ERROR, resolution=null, message=null}

我的一位用户正在使用以下规范。

  • Sony Xperia z5
  • Android 6
  • Google Play服务9.0.83
  • 他的设备中只有一个Google帐户

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

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

5 个答案:

答案 0 :(得分:11)

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

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

  

重新:&#34; Google Play商店已停止&#34; Z5 Premium Marshmallow更新后
  四月

     

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

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

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

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

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

  索尼Xperia Z5用户&#39;对收到Android 6.0感到兴奋   棉花糖更新似乎是短暂的用户   手机现在在更新设备后抱怨问题   最新的操作系统。

     

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

     

一些Xperia Z5用户抱怨说他们的智能手机已经破坏了#34;   安装新操作系统后。他们也受到了弹出式招牌的欢迎   这说他们的#Go; Google Play商店已经停止了。&#34;用户也是   无法打开Play商店应用。

     

&#34;一旦我更新到Marshmallow,我就会不断获得   &#34;遗憾的是Google Play商店已经停止了......&#34;并且消息保持不变   每5秒钟一次。我尝试清除缓存,删除数据,   卸载,禁用应用程序,强行关闭,退出谷歌   并重新开始。不行。我一直不停地弹出它   发生在Marshmallow更新时,#34;注意到用户   支持论坛。

     

&#34;是的,这里有同样的问题。尝试卸载   / settings / apps / google play商店中的更新,也尝试过安装   .apk通过chrome。仍然收到错误消息。说话   客户支持和运行&#34;维修&#34;索尼桥的选项是   他们提供的唯一建议。在我尝试之前创建备份   运行它...&#34;另一个说。

     

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

     

虽然这解决了其他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中修复了一些,它确实很难解决一些问题。

我也遇到过这个问题的应用程序和人们说这样的设备无法正常工作,然后尝试解决问题,有时在用户手机设置中可能会出现问题,这也会导致问题应用程序和其中一些设置因手机而异。

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

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()也可能有所帮助。

其他人登陆的完整性有些问题:

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

来自Release Notes May 2016 - v.9.0

  

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

答案 1 :(得分:4)

这可能是由多个问题引起的,您是否阅读过ConnectionResult的文档?它说:

  

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

您还可以在此帖子中收到有关错误代码的大量信息:Error : ConnectionResult{statusCode=INTERNAL_ERROR, resolution=null}

问题还可能是您未在控制台中添加Drive API。但是你应该得到一条logcat消息。

好的我还测试过JStock应用程序:

Android 6的Moto G3

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

我不确定这对你有什么帮助,但请告诉我。

答案 2 :(得分:3)

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

1。卸载Google Play服务

enter image description here

enter image description here

2。再次更新Google Play服务

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

enter image description here

之后工作正常。如果它仍然没有,也许重新启动你的设备可能有帮助吗?!

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

它应该多么荒谬?我运行谷歌Nexus 5所以问题不应该与索尼产品绑定。