Android谷歌登录卡在循环中

Android谷歌登录卡在循环中,android,android-fragments,google-plus,google-play-services,Android,Android Fragments,Google Plus,Google Play Services,我正在从片段实现Google plus登录。 在我的对话中,我得到了一个无限循环的谷歌签名 代码: 活动: @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.e("TEST", "requestCode: " + requestCode + ", resultCode: " + resultCode); if (FragmentLogIn.R

我正在从
片段
实现Google plus登录。 在我的对话中,我得到了一个无限循环的谷歌签名

代码: 活动:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.e("TEST", "requestCode: " + requestCode + ", resultCode: " + resultCode);
    if (FragmentLogIn.RC_SIGN_IN == requestCode){
        FragmentLogIn fragment = (FragmentLogIn)  getSupportFragmentManager().findFragmentById(mainContent.getId());
        fragment.onActivityResult(requestCode, resultCode, data);
    } else{
        super.onActivityResult(requestCode, resultCode, data);
    }
}
片段:

@Override
public void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

@Override
public void onStop() {
    super.onStop();
    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

/**
 * Method to resolve any signin errors
 * */
private void resolveSignInError() {
    if (mConnectionResult.hasResolution()) {
        try {
            mIntentInProgress = true;
            mConnectionResult.startResolutionForResult(getActivity(), RC_SIGN_IN);
        } catch (SendIntentException e) {
            mIntentInProgress = false;
            mGoogleApiClient.connect();
        }
    }
}

@Override
public void onActivityResult(int requestCode, int responseCode, Intent intent)
{           
    Log.e("GOOGLE+", "requestCode: " + requestCode + "responseCode = " + responseCode);

    if (requestCode == RC_SIGN_IN) {
        if (responseCode != Activity.RESULT_OK) {
            mSignInClicked = false;
        }

        mIntentInProgress = false;

        if (!mGoogleApiClient.isConnecting()) {
            mGoogleApiClient.connect();
        }
    }
}

@Override
public void onConnected(Bundle bundle)
{
    Log.e("GOOGLE TEST", "onConnected");
    //get user info
    try{
        if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
            Person currentPerson = Plus.PeopleApi
                    .getCurrentPerson(mGoogleApiClient);
            String personName = currentPerson.getDisplayName();
            String personPhotoUrl = currentPerson.getImage().getUrl();
            String personGooglePlusProfile = currentPerson.getUrl();
            String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
            new RetrieveTokenTask().execute(email);
        } else {
            Log.e("GOOGLE+", "info = null");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    mSignInClicked = false;
}

@Override
public void onConnectionSuspended(int i)
{
    Log.e("GOOGLE TEST", "onConnectionSuspended");
    mGoogleApiClient.connect();
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    if (!result.hasResolution()) {
        GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), getActivity(),
                0).show();
        return;
    }

    if (!mIntentInProgress) {
        // Store the ConnectionResult for later usage
        mConnectionResult = result;

        if (mSignInClicked) {
            // The user has already clicked 'sign-in' so we attempt to
            // resolve all
            // errors until the user is signed in, or they cancel.
            resolveSignInError();
        }
    }

}

@Override
public void onClick(View view)
{
    if (view.getId() == R.id.google_sign_in_button) {
        if (!mGoogleApiClient.isConnecting()) {
            mSignInClicked = true;
            resolveSignInError();
        }
    } else if (view.getId() == R.id.google_sign_out_button) {
        revokeGplusAccess();

    }
}

private class RetrieveTokenTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        String accountName = params[0];
        Log.e("accountName", accountName);
        String scopes = "oauth2:profile "+Scopes.PLUS_LOGIN;;
        String token = null;
        try {
            if (getActivity() != null)
                token = GoogleAuthUtil.getToken(getActivity().getApplicationContext(), accountName, scopes);
        } catch (IOException e) {
            Log.e("GOOGLE+", e.getMessage());
        } catch (UserRecoverableAuthException e) {
            startActivityForResult(e.getIntent(), 1);
        } catch (GoogleAuthException e) {
            Log.e("GOOGLE+", e.getMessage());
        }
        return token;
    }

    @Override
    protected void onPostExecute(String s) {
        Log.d("TOKEN", "token: " + s);
    }
}

private void revokeGplusAccess() {
    if (mGoogleApiClient.isConnected()) {
        Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
        Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient)
        .setResultCallback(new ResultCallback<Status>() {
            @Override
            public void onResult(Status arg0) {
                Log.e("GOOGLE+", "User access revoked!");
                mGoogleApiClient.connect();
            }

        });
    }
}
@覆盖
public void onStart(){
super.onStart();
mGoogleApiClient.connect();
}
@凌驾
公共void onStop(){
super.onStop();
if(mgoogleapClient.isConnected()){
mGoogleApiClient.disconnect();
}
}
/**
*方法来解决任何登录错误
* */
私有无效解析错误(){
if(mcConnectionResult.hasResolution()){
试一试{
mIntentInProgress=true;
mcConnectionResult.startResolutionForResult(getActivity(),RC\u SIGN\u IN);
}捕获(发送){
mIntentInProgress=false;
mGoogleApiClient.connect();
}
}
}
@凌驾
ActivityResult上的公共无效(int请求代码、int响应代码、意图)
{           
Log.e(“GOOGLE+”,“requestCode:“+requestCode+”responseCode=“+responseCode”);
if(requestCode==RC\u登录){
if(responseCode!=活动结果\u确定){
mSignInClicked=false;
}
mIntentInProgress=false;
如果(!mgoogleapClient.isConnecting()){
mGoogleApiClient.connect();
}
}
}
@凌驾
未连接的公共空间(捆绑包)
{
Log.e(“谷歌测试”、“未连接”);
//获取用户信息
试一试{
if(Plus.PeopleApi.getCurrentPerson(mGoogleApiClient)!=null){
Person currentPerson=Plus.PeopleApi
.getCurrentPerson(MGoogleapClient);
字符串personName=currentPerson.getDisplayName();
字符串personPhotoUrl=currentPerson.getImage().getUrl();
字符串personGooglePlusProfile=currentPerson.getUrl();
字符串email=Plus.AccountApi.getAccountName(mGoogleApiClient);
新建RetrieveTokenTask().execute(电子邮件);
}否则{
Log.e(“GOOGLE+”,“info=null”);
}
}捕获(例外e){
e、 printStackTrace();
}
mSignInClicked=false;
}
@凌驾
公共空间连接暂停(int i)
{
Log.e(“谷歌测试”、“onConnectionSuspended”);
mGoogleApiClient.connect();
}
@凌驾
连接失败的公共void(连接结果){
如果(!result.hasResolution()){
GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(),getActivity(),
0)show();
返回;
}
如果(!mIntentInProgress){
//存储ConnectionResult供以后使用
mConnectionResult=结果;
如果(mSignInClicked){
//用户已单击“登录”,因此我们尝试
//解决所有问题
//错误,直到用户登录或取消。
ResolveSignError();
}
}
}
@凌驾
公共void onClick(视图)
{
if(view.getId()==R.id.google\u登录\u按钮){
如果(!mgoogleapClient.isConnecting()){
mSignInClicked=true;
ResolveSignError();
}
}else if(view.getId()==R.id.google\u注销\u按钮){
revokeGplusAccess();
}
}
私有类RetrieveTokenTask扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串accountName=params[0];
Log.e(“accountName”,accountName);
String scopes=“oauth2:profile”+scopes.PLUS_LOGIN;;
字符串标记=null;
试一试{
如果(getActivity()!=null)
token=GoogleAuthUtil.getToken(getActivity().getApplicationContext(),accountName,scopes);
}捕获(IOE异常){
Log.e(“GOOGLE+”,e.getMessage());
}捕获(UserRecoverableAuthe异常){
startActivityForResult(e.getIntent(),1);
}捕获(googleauthe异常){
Log.e(“GOOGLE+”,e.getMessage());
}
返回令牌;
}
@凌驾
受保护的void onPostExecute(字符串s){
日志d(“令牌”,“令牌:+s”);
}
}
私有void revokeGplusAccess(){
if(mgoogleapClient.isConnected()){
Plus.AccountApi.clearDefaultAccount(mgoogleapClient);
Plus.AccountApi.revokeAccessAndDisconnect(mgoogleAppClient)
.setResultCallback(新的ResultCallback(){
@凌驾
公共void onResult(状态arg0){
Log.e(“谷歌+”,“用户访问权被撤销!”);
mGoogleApiClient.connect();
}
});
}
}
这个代码在
活动
中编写时有效,但当我将它切换到
片段
时,我得到一个无限循环。 我做错了什么?是否有人使用访问令牌使用Google plus登录的不同示例

谢谢,
Ilan

当您在
onStop()
中断开
GoogleAppClient
时,无限循环问题就会出现。只能在
onDestroy()中执行此操作

希望有帮助。

删除该行

if (mSignInClicked) {
        // The user has already clicked 'sign-in' so we attempt to
        // resolve all
        // errors until the user is signed in, or they cancel.
        resolveSignInError();
    }

onConnectionFailed(ConnectionResult)
方法,无限循环将不再发生。

我应该添加任何日志调用吗?这是我得到的:08-20 16:02:43.923:E/GOOGLE TEST(28215):onConnected 08-20 16:02:43.931:E/accountName(28215):***@gmail.com 08-20 16:02:44.861:D/TOKEN(28215):token:null 08-20 16:02:46.220:E/GOOGLE测试(28215):onConnected 08-20 16:02:46.220:E/accountName(28215):***@gmail.com 08-20 16:02:47.150:D/token(28215):token:null 08-20 16:02:48.978:E/GOOGLE测试(28215):onConnected 08-20 16:02:48.986:E/accountName(28215):***@gmail.com 08-20 16:02:02:49.970:D/token:28215:这是有效的。非常感谢你。我花了很长时间试图解决这个问题。@gellyke我也被困在登录中,你也能帮我吗?