2014-11-23 15 views
5

Sto utilizzando una pagina di avvio per "Accedi con Google". Quando l'utente ha più account ... dopo aver selezionato l'account con cui desiderano accedere, sto tentando di avviare l'attività principale delle app, ma per qualche motivo lo onActivityResult non viene mai chiamato nel mio frammento.OnActivityResult non chiamato dopo startIntentSenderForResult

Im the Activity, chiamo onActivityResult e lo faccio chiamare super in modo che il frammento possa gestirlo, ma non spara mai.

Qualche suggerimento?

Ecco il frammento che è in questione:

package com.garciaericn.goodeats.login; 

import android.app.Activity; 
import android.app.Fragment; 
import android.content.Intent; 
import android.content.IntentSender; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

import com.garciaericn.goodeats.R; 
import com.garciaericn.goodeats.helpers.CheckConnection; 
import com.garciaericn.goodeats.main.FavoritesActivity; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.SignInButton; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.plus.Plus; 

public class LoginFragment extends Fragment implements View.OnClickListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

    public static final String TAG = "com.garciaericn.goodeats.login.LoginFragment.TAG"; 

    /* Request code used to invoke sign in user interactions. */ 
    private static final int RC_SIGN_IN = 0; 
    private static final int RC_LOGGED_IN = 1034553; 
    public static final int RC_SIGN_OUT = 34458392; 
    /* Client used to interact with Google APIs. */ 
    private GoogleApiClient mGoogleApiClient; 
    /* A flag indicating that a PendingIntent is in progress and prevents 
    * us from starting further intents. 
    */ 
    private boolean mIntentInProgress; 
    /* Store the connection result from onConnectionFailed callbacks so that we can 
    * resolve them when the user clicks sign-in. 
    */ 
    private ConnectionResult mConnectionResult; 
    private boolean mSignInClicked; 
    private boolean mSignedIn; 
    private CheckConnection checkConnection; 

    public LoginFragment() { 
    } 

    public static LoginFragment getInstance() { 
     return new LoginFragment(); 
    } 

    private void signOut() { 
     if (mGoogleApiClient.isConnected()) { 
      Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); 
      mGoogleApiClient.disconnect(); 
      mGoogleApiClient.connect(); 
      mIntentInProgress = false; 
      mSignInClicked = false; 
     } 
    } 

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

     checkConnection = new CheckConnection(getActivity()); 
     setHasOptionsMenu(true); 

     mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(Plus.API) 
       .addScope(Plus.SCOPE_PLUS_LOGIN) 
       .build(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_login, container, false); 

     SignInButton signInButton = (SignInButton) view.findViewById(R.id.g_plus_login); 
     signInButton.setSize(SignInButton.SIZE_WIDE); 
     signInButton.setOnClickListener(this); 

     return view; 
    } 

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

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_sign_out: 
       if (mGoogleApiClient.isConnected()) { 
        Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); 
        mGoogleApiClient.disconnect(); 
        mGoogleApiClient.connect(); 
       } 
       return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onClick(View v) { 
     checkConnection.isConnected(); 
     switch (v.getId()) { 
      case R.id.g_plus_login: 
       if (!mGoogleApiClient.isConnected()) { 
        mSignInClicked = true; 
        resolveSignInError(); 
       } 
       break; 
      default: 
       // If default action is needed. 
       break; 
     } 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     mSignInClicked = false; 
     mSignedIn = true; 
     // User is connected 


     String accountName = Plus.AccountApi.getAccountName(mGoogleApiClient); 
     Toast.makeText(getActivity(), accountName, Toast.LENGTH_SHORT).show(); 
     //  String accountID = GoogleAuthUtil.getAccountId(getActivity(), accountName); 
     //  try { 
     //   accountID = GoogleAuthUtil.getAccountId(getActivity().getApplicationContext(),accountName); 
     //  } catch (GoogleAuthException e) { 
     //   e.printStackTrace(); 
     //  } catch (IOException e) { 
     //   e.printStackTrace(); 
     //  } 

     //  if (accountID != null) { 
     //   // TODO: createLocalAccount() = Store account name and id with DB of restaurants 
     //  } 


     // Launch main activity 
     Intent intent = new Intent(getActivity(), FavoritesActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     if (!mIntentInProgress) { 
      // Store the ConnectionResult so that we can use it later when the user clicks 
      // 'sign-in'. 
      mConnectionResult = connectionResult; 

      if (mSignInClicked) { 
       resolveSignInError(); 
      } 

     } 
     checkConnection.isConnected(); 
     //  if (!checkConnection.isConnected()) { 
     //   Toast.makeText(getActivity(), "No network connection", Toast.LENGTH_SHORT).show(); 
     //  } 

    } 

    public void resolveSignInError() { 
     if (mConnectionResult.hasResolution()) { 
      try { 
       mIntentInProgress = true; 
       getActivity().startIntentSenderForResult(mConnectionResult.getResolution().getIntentSender(), RC_SIGN_IN, null, 0, 0, 0); 
      } catch (IntentSender.SendIntentException e) { 
       // The intent was canceled before it was sent. Return to the default 
       // state and attempt to connect to get an updated ConnectionResult. 
       mIntentInProgress = false; 
       mGoogleApiClient.connect(); 
      } 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == RC_SIGN_IN) { 
      if (resultCode != Activity.RESULT_OK) { 
       mSignInClicked = false; 
      } 

      mIntentInProgress = false; 

      if (!mGoogleApiClient.isConnected()) { 
       mGoogleApiClient.connect(); 
      } 
     } else if (requestCode == RC_LOGGED_IN) { 
      if (resultCode == RC_SIGN_OUT) { 
       signOut(); 
      } 
     } 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 
+0

Ciao, ho lo stesso problema ... hai trovare qualche soluzione? sarà contento di saperlo ;-) –

+1

Hai fatto una chiamata a super nell'attività 'onActivityResult'? – ENG618

+0

grazie mille! sono stato sovrascritto suActivityResult nel mio frammento, ma ho dimenticato di sovrascriverlo in actvivity .... –

risposta

3

La chiave era chiamare il metodo seguente nella prima attività.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
} 
0

Per risolvere correttamente il problema È possibile utilizzare già preparato soluzione accountPicker.
Tuttavia - Se si vuole mettere a punto una soluzione personalizzata - Un'idea è quella di iniziare la vostra seconda attività (dalla prima attività, ovviamente) con:

Intent intent = this.getIntent(); 
intent.putExtra(... /* some code that will control second activity */ 
startActivityForResult(intent, request_code); 

e poi, quando l'attività ha fatto tutto quello che doveva fare si permettono di ritorno:

Intent intent = this.getIntent(); 
intent.putExtra(... /* all needed results to return */); 
this.setResult(RESULT_OK, intent); 
finish(); 

finalmente è la tua prima attività che quindi ottiene risultato nel suo onActivityResult.

1

Aggiungere questo nella vostra attività esterna:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.change_to_your_id); 
    fragment.onActivityResult(requestCode, resultCode, data); 
} 
+0

Questo funziona, tuttavia ho dovuto sostituire 'Fragment' con la mia classe di frammento effettiva. – lenooh