Facebook Login / Google Login – ¿La misma actividad?

Estoy tratando de dar a mis usuarios la opción de iniciar sesión con Google o Facebook. Hasta ahora he encontrado un ejemplo para implementar un flujo de inicio de sesión de Google, pero estoy confundido si puedo implementar un flujo de conexión de Facebook similar dentro de la misma actividad.

¿Alguien tiene una idea para manejar los inicios de sesión? Estaba pensando en la posibilidad de definir una clase para manejar los flujos de inicio de sesión tanto para Google / Facebook, y tal vez sólo comprobar para ver qué se utiliza cuando se inicia la aplicación. ¿Algunas ideas?

public class MainActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, OnClickListener, OnAccessRevokedListener { private static final String TAG = "MainActivity"; // A magic number we will use to know that our sign-in error // resolution activity has completed. private static final int OUR_REQUEST_CODE = 49404; // The core Google+ client. private PlusClient mPlusClient; // A flag to stop multiple dialogues appearing for the user. private boolean mResolveOnFail; // We can store the connection result from a failed connect() // attempt in order to make the application feel a bit more // responsive for the user. private ConnectionResult mConnectionResult; // A progress dialog to display when the user is connecting in // case there is a delay in any of the dialogs being ready. private ProgressDialog mConnectionProgressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // We pass through this for all three arguments, specifying the: // 1. Context // 2. Object to call onConnected and onDisconnected on // 3. Object to call onConnectionFailed on mPlusClient = new PlusClient.Builder(this, this, this) .setVisibleActivities("http://schemas.google.com/BuyActivity") .build(); // We use mResolveOnFail as a flag to say whether we should trigger // the resolution of a connectionFailed ConnectionResult. mResolveOnFail = false; // Connect our sign in, sign out and disconnect buttons. findViewById(R.id.sign_in_button).setOnClickListener(this); findViewById(R.id.sign_out_button).setOnClickListener(this); findViewById(R.id.sign_out_button).setVisibility(View.GONE); findViewById(R.id.authButton).setOnClickListener(this); // Configure the ProgressDialog that will be shown if there is a // delay in presenting the user with the next sign in step. mConnectionProgressDialog = new ProgressDialog(this); mConnectionProgressDialog.setMessage("Signing in..."); } @Override protected void onStart() { super.onStart(); Log.v(TAG, "Start"); // Every time we start we want to try to connect. If it // succeeds we'll get an onConnected() callback. If it // fails we'll get onConnectionFailed(), with a result! mPlusClient.connect(); } @Override protected void onStop() { super.onStop(); Log.v(TAG, "Stop"); // It can be a little costly to keep the connection open // to Google Play Services, so each time our activity is // stopped we should disconnect. mPlusClient.disconnect(); } @Override public void onConnectionFailed(ConnectionResult result) { Log.v(TAG, "ConnectionFailed"); // Most of the time, the connection will fail with a // user resolvable result. We can store that in our // mConnectionResult property ready for to be used // when the user clicks the sign-in button. if (result.hasResolution()) { mConnectionResult = result; if (mResolveOnFail) { // This is a local helper function that starts // the resolution of the problem, which may be // showing the user an account chooser or similar. startResolution(); } } } @Override public void onConnected(Bundle bundle) { // Yay! We can get the oAuth 2.0 access token we are using. Log.v(TAG, "Connected. Yay!"); // Turn off the flag, so if the user signs out they'll have to // tap to sign in again. mResolveOnFail = false; // Hide the progress dialog if its showing. mConnectionProgressDialog.dismiss(); // Hide the sign in button, show the sign out buttons. findViewById(R.id.sign_in_button).setVisibility(View.GONE); findViewById(R.id.sign_out_button).setVisibility(View.VISIBLE); // Retrieve the oAuth 2.0 access token. final Context context = this.getApplicationContext(); AsyncTask task = new AsyncTask() { @Override protected Object doInBackground(Object... params) { String scope = "oauth2:" + Scopes.PLUS_LOGIN; try { // We can retrieve the token to check via // tokeninfo or to pass to a service-side // application. String token = GoogleAuthUtil.getToken(context, mPlusClient.getAccountName(), scope); } catch (UserRecoverableAuthException e) { // This error is recoverable, so we could fix this // by displaying the intent to the user. e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (GoogleAuthException e) { e.printStackTrace(); } return null; } }; task.execute((Void) null); // THIS IS TO CONNECT TO NAVI ACTIVITY AFTER YOU CONNECT Also makes it // so you cannot go back to main activity /* * if (mPlusClient.isConnected()) { Intent intent = new Intent(this, * NaviActivity.class); startActivity(intent); } finish(); */ } @Override public void onDisconnected() { // Bye! Log.v(TAG, "Disconnected. Bye!"); } protected void onActivityResult(int requestCode, int responseCode, Intent intent) { Log.v(TAG, "ActivityResult: " + requestCode); if (requestCode == OUR_REQUEST_CODE && responseCode == RESULT_OK) { // If we have a successful result, we will want to be able to // resolve any further errors, so turn on resolution with our // flag. mResolveOnFail = true; // If we have a successful result, lets call connect() again. If // there are any more errors to resolve we'll get our // onConnectionFailed, but if not, we'll get onConnected. mPlusClient.connect(); } else if (requestCode == OUR_REQUEST_CODE && responseCode != RESULT_OK) { // If we've got an error we can't resolve, we're no // longer in the midst of signing in, so we can stop // the progress spinner. mConnectionProgressDialog.dismiss(); } } @Override public void onClick(View view) { switch (view.getId()) { case R.id.sign_in_button: Log.v(TAG, "Tapped sign in"); if (!mPlusClient.isConnected()) { // Show the dialog as we are now signing in. mConnectionProgressDialog.show(); // Make sure that we will start the resolution (eg fire the // intent and pop up a dialog for the user) for any errors // that come in. mResolveOnFail = true; // We should always have a connection result ready to resolve, // so we can start that process. if (mConnectionResult != null) { startResolution(); } else { // If we don't have one though, we can start connect in // order to retrieve one. mPlusClient.connect(); } } break; case R.id.sign_out_button: Log.v(TAG, "Tapped sign out"); // We only want to sign out if we're connected. if (mPlusClient.isConnected()) { // Clear the default account in order to allow the user // to potentially choose a different account from the // account chooser. mPlusClient.clearDefaultAccount(); // Disconnect from Google Play Services, then reconnect in // order to restart the process from scratch. mPlusClient.disconnect(); mPlusClient.connect(); // Hide the sign out buttons, show the sign in button. findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); findViewById(R.id.sign_out_button).setVisibility(View.GONE); } break; // THIS SHOULD NOT BE NEEDED, MUST SWITCH ACTIVITIES UPON AUTHORIZATION case R.id.authButton: Log.v(TAG, "Switch Activities"); if (mPlusClient.isConnected()) { Intent intent = new Intent(view.getContext(), NaviActivity.class); view.getContext().startActivity(intent); } break; default: // Unknown id. } } @Override public void onAccessRevoked(ConnectionResult status) { // mPlusClient is now disconnected and access has been revoked. // We should now delete any data we need to comply with the // developer properties. To reset ourselves to the original state, // we should now connect again. We don't have to disconnect as that // happens as part of the call. mPlusClient.connect(); // Hide the sign out buttons, show the sign in button. findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); findViewById(R.id.sign_out_button).setVisibility(View.GONE); } /** * A helper method to flip the mResolveOnFail flag and start the resolution * of the ConnenctionResult from the failed connect() call. */ private void startResolution() { try { // Don't start another resolution now until we have a // result from the activity we're about to start. mResolveOnFail = false; // If we can resolve the error, then call start resolution // and pass it an integer tag we can use to track. This means // that when we get the onActivityResult callback we'll know // its from being started here. mConnectionResult.startResolutionForResult(this, OUR_REQUEST_CODE); } catch (SendIntentException e) { // Any problems, just try to connect() again so we get a new // ConnectionResult. mPlusClient.connect(); } } } 

Defina ambos fragmentos (facebook y google) en el diseño que utilice como inicio de sesión y en otro para recibir la sesión validada

 <com.facebook.widget.LoginButton android:id="@+id/authButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="30dp" /> <com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_below="@id/authButton" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

Luego use las funciones requeridas por cada uno

 public class MainActivity extends Activity implements ConnectionCallbacks,OnConnectionFailedListener { //google private PlusClient plusClient; private SignInButton btnSignIn; private ProgressDialog connectionProgressDialog; private ConnectionResult connectionResult; private static final int REQUEST_CODE_RESOLVE_ERR = 9000; //face private LoginButton buttonLoginLogout; private UiLifecycleHelper uiHelper; static Usuario appusuario; static String urldelogin="algo"; private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { onSessionStateChange(session, state, exception); if (session.isOpened()) { Log.e("usuario", "si hay sesion"); // make request to the /me API Request.newMeRequest(session, new Request.GraphUserCallback() { // callback after Graph API response with user object @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { Log.e("usuario", "si hay usuario"); buildUserInfoDisplay(user); //start another activity } } }).executeAsync(); } } private void onSessionStateChange(Session session, SessionState state, Exception exception) { // TODO Auto-generated method stub } }; @Override public void onResume() { super.onResume(); uiHelper.onResume(); } @Override public void onPause() { super.onPause(); uiHelper.onPause(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_RESOLVE_ERR && resultCode == RESULT_OK) { connectionResult = null; plusClient.connect(); } } @Override public void onDestroy() { super.onDestroy(); uiHelper.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); uiHelper.onSaveInstanceState(outState); } public static void buildUserInfoDisplay(GraphUser user) { appusuario=new Usuario(user.getName(),user.getUsername()); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); uiHelper = new UiLifecycleHelper(this, callback); uiHelper.onCreate(savedInstanceState); buttonLoginLogout = (LoginButton)findViewById(R.id.authButton); buttonLoginLogout.setReadPermissions(Arrays.asList("user_status")); btnSignIn = (SignInButton)findViewById(R.id.sign_in_button); buttonLoginLogout.setVisibility(View.VISIBLE); btnSignIn.setVisibility(View.VISIBLE); plusClient = new PlusClient.Builder(this, this, this).setActions("http://schemas.google.com/AddActivity", "http://schemas.google.com/BuyActivity") .build(); connectionProgressDialog = new ProgressDialog(this); connectionProgressDialog.setMessage("Conectando..."); btnSignIn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { if (!plusClient.isConnected()) { if (connectionResult == null) { connectionProgressDialog.show(); } else { try { connectionResult.startResolutionForResult( MainActivity.this, REQUEST_CODE_RESOLVE_ERR); } catch (SendIntentException e) { connectionResult = null; plusClient.connect(); } } } } }); } @Override protected void onStart() { super.onStart(); plusClient.connect(); } @Override protected void onStop() { super.onStop(); plusClient.disconnect(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onConnected(Bundle connectionHint) { connectionProgressDialog.dismiss(); //nombre String accountName = plusClient.getAccountName(); //cuenta con mail Person accountperson=plusClient.getCurrentPerson(); String personName = accountperson.getDisplayName(); Log.e("Google +", "Conectado"); //start another activity } @Override public void onDisconnected() { Log.e("Google +", "Desconectado"); } @Override public void onConnectionFailed(ConnectionResult result) { // TODO Auto-generated method stub if (connectionProgressDialog.isShowing()) { if (result.hasResolution()) { try { result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR); } catch (SendIntentException e) { plusClient.connect(); } } } connectionResult = result; } } 

En la nueva actividad las mismas funciones para validar la sesion y utilizar

 if (session.isOpened()) { } 

Para ocultar el botón de inicio de sesión de Google o

  public void onConnected(Bundle connectionHint) { } 

Para ocultar el botón de inicio de sesión de facebook

  • Cómo obtener un archivo de directorio y el ClassLoader para un juego de Android libGDX
  • ¿Cómo usar esta palabra clave en un método estático en java?
  • Cómo utilizar AsyncTask clase para actualizar el progreso de copiar un archivo de otro directorio?
  • ¿Puedo hacer un juego HTML5 para Android?
  • Cambiar el fondo ListView - comportamiento extraño
  • FileNotFoundException: open failed: EACCES (Permiso denegado)
  • Problemas con ProGuard para Android con Parse 1.3.5 jar
  • Android cómo detener la actualización Fragmentos en el cambio de ficha
  • Android: capitalize no funciona
  • Cómo mostrar heart sign in android usando Html.fromHtml
  • Ajuste de prioridad de solicitud Volley
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.