OnActivityResult no se llama después de startIntentSenderForResult

Estoy usando una página de inicio para "Iniciar sesión con Google". Cuando el usuario tiene varias cuentas … después de seleccionar la cuenta con la que desea iniciar sesión, intento iniciar la actividad principal de las aplicaciones, pero por alguna razón nunca se llama a onActivityResult en mi fragmento.

Im la actividad, llamo a onActivityResult y lo dejo llamar super para que el fragmento puede manejarlo, pero nunca se dispara.

¿Alguna sugerencia?

Aquí está el fragmento que está en cuestión:

 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); } } 

La clave era llamar al siguiente método en la primera actividad.

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

Añadir esto en su actividad externa:

 @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); } 

Para solucionar correctamente este problema puede utilizar la solución ya preparada accountPicker .
Sin embargo – Si desea idear su propia solución – una idea es iniciar su segunda actividad (desde la primera actividad obviamente) con:

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

Y luego cuando la actividad hizo todo lo que tenía que hacer Usted le permite volver:

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

Finalmente es tu primera actividad que luego obtiene resultado en su onActivityResult.

  • fragmentos startActivityForResult devuelven siempre resultCode 0 y el intento null en callback onActivityResult
  • Inicie correctamente la Actividad de la Notificación independientemente del estado de la aplicación
  • Método onActivityResult no está siendo llamado
  • Actualización del recuento del carro al presionar el botón de retroceso después de la eliminación
  • resultCode siempre es 0 y la petición es siempre -1,. Activity.onActivityResult ();
  • OnActivityResult () no se llama
  • ACTION_INSTALL_PACKAGE
  • OnActivityResult no llama al Fragmento
  • OnActivityResult en el fragmento de diálogo
  • Cómo utilizar el método onActivityResult de otra clase que no sea Activity
  • Identificar en onActivityResult si se seleccionó la imagen de una galería o un video - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.