Usar la cuenta de Google para iniciar sesión en una aplicación de Android

Estoy desarrollando una aplicación en Android y quiero permitir que los usuarios inicien sesión con su cuenta de Google. ¿Cómo puedo conseguir esto?

Es posible que desee autenticar al usuario utilizando una de las cuentas de google ya configuradas en su dispositivo, como lo hacen algunas de las aplicaciones, para eso siga el siguiente enlace:

“Autenticación a los servicios de OAuth2” – http://developer.android.com/training/id-auth/authenticate.html

Descargar Sample from Google – Android SDK Manager / Extras / Google Play Services

En simples pasos lo hace

  1. Muestra la lista de cuentas en tu móvil
  2. Genera token de acceso de cuentas seleccionadas
  3. Obtiene el nombre de la cuenta del token de acceso poniéndose en contacto con los servicios de google (llamada separada) para indicar que se ha autenticado.

Este es otro enlace que sirve para explicar el proceso: http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html

puede seguir los pasos a continuación para iniciar sesión en su aplicación

  1. enviará el token de acceso generado a su servidor back-end
  2. El servidor back-end verifica que el token de acceso sea válido o no contactando a los servicios de google mediante esta url ” https://www.googleapis.com/oauth2/v1/userinfo?access_token=ACCESS_TOKEN
  3. El servidor de Back-end siguiente responde a la aplicación, ya sea para hacer que el usuario inicie sesión o no.

A continuación se muestra el formato de respuesta de la llamada anterior “userinfo”

{ "id": "ID", "name": "NAME", "given_name": "GiVEN NAME", "family_name": "FAMILY_NAME", "link": "https://plus.google.com/ID", "picture": "http://sofes.miximages.com/android/PHOTO.jpg", "gender": "GENDER", "locale": "LOCALE" } 

Si desea una ID de correo electrónico junto con esa respuesta, debe modificar

SCOPE = “oauth2: https://www.googleapis.com/auth/userinfo.profile “;

a

SCOPE = “oauth2: https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email “;

en esa muestra

Eche un vistazo a http://developer.android.com/training/id-auth/index.html Allí encontrará un tutorial sobre cómo usar el Administrador de cuentas. (Más específicamente http://developer.android.com/reference/android/accounts/AccountManager.html )

Primero inserta la siguiente línea en tus dependencias build.gradle

 compile 'com.google.android.gms:play-services:7.5.0' 

Ahora necesitamos la huella digital SHA-1 que tenemos que dar en Google Developers Console.

Java keytool se utiliza para generar huella digital SHA-1. Abra su símbolo del sistema [Abra C: \ Archivos de progtwig \ Java \ jdk \ bin y luego presione Mayús + Clic derecho] y ejecute el siguiente comando para generar la huella digital SHA-1 y para la contraseña ingrese android si se le solicita.

 keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android 

Para autenticarse y comunicarse con las API de Google+, debe crear un proyecto de Google Developers Console donde tenga que habilitar la API de Google+ y crear una ID de cliente de OAuth 2.0.

  1. Ir a Google Developers Console . y crea un nuevo proyecto
  2. Una vez que haya terminado de crear un proyecto, haga clic en API debajo de la sección de API y autenticación. Busque la API de Google+ y seleccione la que he mostrado en la imagen a continuación.
  3. Habilite la API de Google+ seleccionando el botón Habilitar API disponible.
  4. Después de habilitar vaya a la sección Credenciales bajo la API y cree una nueva ID de cliente.
  5. Seleccione la aplicación instalada como tipo y configure la pantalla de consentimiento
  6. Ahora complete el nombre del paquete de su proyecto, pegue la huella digital SHA1, active la opción Enlace profundo para activar las publicaciones interactivas y todos los demás parámetros como se muestra en la imagen a continuación.

Ahora es el momento de declarar permisos para su archivo mainfest. Así es como se verá el archivo de manifiesto después de agregar los metadatos y todos los permisos.

               

Ahora nos dirigimos a nuestra clase MainActivity.java, donde haremos todo lo posible para iniciar sesión en Google+.

 package com.androstock.loginwithgoogle; import android.content.Intent; import android.content.IntentSender.SendIntentException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.common.SignInButton; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; import com.google.android.gms.plus.Plus; import com.google.android.gms.plus.model.people.Person; import java.io.InputStream; // A project by Ferdousur Rahman Shajib // www.androstock.com public class MainActivity extends AppCompatActivity implements OnClickListener, GoogleApiClient.ConnectionCallbacks, OnConnectionFailedListener { // Profile pic image size in pixels private static final int PROFILE_PIC_SIZE = 400; /* Request code used to invoke sign in user interactions. */ private static final int RC_SIGN_IN = 0; /* 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; private boolean mShouldResolve; private ConnectionResult connectionResult; private SignInButton signInButton; private Button signOutButton; private TextView tvName, tvMail, tvNotSignedIn; private ImageView imgProfilePic; private LinearLayout viewContainer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imgProfilePic = (ImageView) findViewById(R.id.imgProfilePic); signInButton = (SignInButton) findViewById(R.id.sign_in_button); signOutButton = (Button) findViewById(R.id.sign_out_button); tvName = (TextView) findViewById(R.id.tvName); tvMail = (TextView) findViewById(R.id.tvMail); tvNotSignedIn = (TextView) findViewById(R.id.notSignedIn_tv); viewContainer = (LinearLayout) findViewById(R.id.text_view_container); signInButton.setOnClickListener(this); signOutButton.setOnClickListener(this); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Plus.API) .addScope(Plus.SCOPE_PLUS_LOGIN) .build(); } protected void onStart() { super.onStart(); mGoogleApiClient.connect(); } protected void onStop() { super.onStop(); if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } } private void resolveSignInError() { if (connectionResult.hasResolution()) { try { mIntentInProgress = true; connectionResult.startResolutionForResult(this, RC_SIGN_IN); } catch (SendIntentException e) { mIntentInProgress = false; mGoogleApiClient.connect(); } } } /* When the GoogleApiClient object is unable to establish a connection onConnectionFailed() is called */ @Override public void onConnectionFailed(ConnectionResult result) { if (!result.hasResolution()) { GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show(); return; } if (!mIntentInProgress) { connectionResult = result; if (mShouldResolve) { resolveSignInError(); } } } /* onConnectionFailed() was started with startIntentSenderForResult and the code RC_SIGN_IN, we can capture the result inside Activity.onActivityResult. */ @Override protected void onActivityResult(int requestCode, int responseCode, Intent intent) { if (requestCode == RC_SIGN_IN) { if (responseCode != RESULT_OK) { mShouldResolve = false; } mIntentInProgress = false; if (!mGoogleApiClient.isConnecting()) { mGoogleApiClient.connect(); } } } @Override public void onConnected(Bundle arg0) { mShouldResolve = false; try { if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) { Person person = Plus.PeopleApi .getCurrentPerson(mGoogleApiClient); String personName = person.getDisplayName(); String personPhotoUrl = person.getImage().getUrl(); String email = Plus.AccountApi.getAccountName(mGoogleApiClient); tvName.setText(personName); tvMail.setText(email); personPhotoUrl = personPhotoUrl.substring(0, personPhotoUrl.length() - 2) + PROFILE_PIC_SIZE; new LoadProfileImage(imgProfilePic).execute(personPhotoUrl); Toast.makeText(getApplicationContext(), "You are Logged In " + personName, Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "Couldnt Get the Person Info", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } signOutUI(); } private void signOutUI() { signInButton.setVisibility(View.GONE); tvNotSignedIn.setVisibility(View.GONE); signOutButton.setVisibility(View.VISIBLE); viewContainer.setVisibility(View.VISIBLE); } private void signInUI() { signInButton.setVisibility(View.VISIBLE); tvNotSignedIn.setVisibility(View.VISIBLE); signOutButton.setVisibility(View.GONE); viewContainer.setVisibility(View.GONE); } /** * Fetching user's information name, email, profile pic */ private void getProfileInformation() { } @Override public void onConnectionSuspended(int arg0) { mGoogleApiClient.connect(); signInUI(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.sign_in_button: onSignInClicked(); break; case R.id.sign_out_button: onSignOutClicked(); break; } } private void onSignInClicked() { if (!mGoogleApiClient.isConnecting()) { mShouldResolve = true; resolveSignInError(); } } private void onSignOutClicked() { if (mGoogleApiClient.isConnected()) { Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); mGoogleApiClient.disconnect(); signInUI(); } } /** * Background Async task to load user profile picture from url * */ private class LoadProfileImage extends AsyncTask { ImageView bmImage; public LoadProfileImage(ImageView bmImage) { this.bmImage = bmImage; } protected Bitmap doInBackground(String... urls) { String urldisplay = urls[0]; Bitmap mIcon11 = null; try { InputStream in = new java.net.URL(urldisplay).openStream(); mIcon11 = BitmapFactory.decodeStream(in); } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return mIcon11; } protected void onPostExecute(Bitmap result) { bmImage.setImageBitmap(result); } } } 

Crea activity_main.xml que contendrá nuestro inicio de sesión y el diseño de cierre de sesión.

           

Eso es amigos. Has terminado con el inicio de sesión de Google+. Para más detalles, puede visitar aquí .

Claro que es posible que desee comenzar con esto:

Los sitios web y las aplicaciones de terceros ahora pueden permitir que los visitantes inicien sesión con sus cuentas de usuario de Google. El inicio de sesión federado, basado en el estándar OpenID, libera a los usuarios de tener que configurar cuentas de inicio de sesión separadas para diferentes sitios web y libera a los desarrolladores de sitios web de la tarea de implementar medidas de autenticación de inicio de sesión. OpenID logra este objective al proporcionar un marco en el que los usuarios pueden establecer una cuenta con un proveedor de OpenID, como Google, y usar esa cuenta para iniciar sesión en cualquier sitio web que acepte OpenID. Esta página describe cómo integrar el inicio de sesión federado de Google para un sitio web o aplicación.

https://developers.google.com/accounts/docs/OpenID

¡Vuelve cuando te quedes atascado!

No puede iniciar sesión exactamente en una aplicación de Android utilizando una cuenta de Google. Utiliza una cuenta de Google para iniciar sesión en un sitio web o servicio web, como GMail, Calendar, etc., o un sitio web de un tercero si usa OpenID. Como su aplicación no es un sitio web, esto no funcionará. Puede hacer uno de los siguientes:

  • compruebe si el usuario ha registrado una cuenta de Google (usando AccountManager ) en su teléfono, y solo déjelos usar la aplicación si tienen una. Si se registra una cuenta, puede estar razonablemente seguro de que conoce la contraseña (o le robaron el teléfono a alguien …)
  • crea tu propio servicio web (por ejemplo, usando App Engine) que usa tu aplicación, y usa las cuentas de Google para iniciar sesión en él

Aquí es cómo integro el inicio de sesión de google con la última y más suave manera.

De esta referencia: google login android studio

primero crea la aplicación en la consola de Google developer y descarga el archivo de configuración y copia en la carpeta de la aplicación.

luego agrega following en build.gradle(Project: project_name)

 classpath 'com.google.gms:google-services:1.5.0-beta2' maven { url 'https://jitpack.io' } allprojects { repositories { } } 

agregar código en build.gradle(Module:app)

 compile 'com.google.android.gms:play-services-auth:9.0.2' compile 'com.google.android.gms:play-services:9.0.2' compile 'com.github.androidquery:androidquery:0.26.9' 

agregar siguiente en activity_main.xml

        

agregue abajo en MainActivity.java

 import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.androidquery.AQuery; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.auth.api.signin.GoogleSignInResult; 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.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.google.android.gms.plus.People; import com.google.android.gms.plus.Plus; import com.google.android.gms.plus.model.people.Person; public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener{ private SignInButton signInButton; private GoogleSignInOptions gso; private GoogleApiClient mGoogleApiClient; private int SIGN_IN = 30; private TextView tv; private ImageView iv; private AQuery aQuery; private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); signInButton = (SignInButton) findViewById(R.id.sign_in_button); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addApi(Plus.API) .build(); signInButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, SIGN_IN); } }); tv = (TextView) findViewById(R.id.text); iv = (ImageView) findViewById(R.id.iv); btn = (Button) findViewById(R.id.btn); aQuery = new AQuery(this); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback() { @Override public void onResult(Status status) { Toast.makeText(MainActivity.this, "Logout Successfully!", Toast.LENGTH_SHORT).show(); } }); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //If signin if (requestCode == SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); //Calling a new function to handle signin handleSignInResult(result); } } private void handleSignInResult(GoogleSignInResult result) { //If the login succeed if (result.isSuccess()) { //Getting google account final GoogleSignInAccount acct = result.getSignInAccount(); //Displaying name and email String name = acct.getDisplayName(); final String mail = acct.getEmail(); // String photourl = acct.getPhotoUrl().toString(); final String givenname="",familyname="",displayname="",birthday=""; Plus.PeopleApi.load(mGoogleApiClient, acct.getId()).setResultCallback(new ResultCallback() { @Override public void onResult(@NonNull People.LoadPeopleResult loadPeopleResult) { Person person = loadPeopleResult.getPersonBuffer().get(0); Log.d("GivenName ", person.getName().getGivenName()); Log.d("FamilyName ",person.getName().getFamilyName()); Log.d("DisplayName ",person.getDisplayName()); Log.d("gender ", String.valueOf(person.getGender())); //0 = male 1 = female String gender=""; if(person.getGender() == 0){ gender = "Male"; }else { gender = "Female"; } if(person.hasBirthday()){ tv.setText(person.getName().getGivenName()+" \n"+person.getName().getFamilyName()+" \n"+gender+"\n"+person.getBirthday()); }else { tv.setText(person.getName().getGivenName()+" \n"+person.getName().getFamilyName()+" \n"+gender); } aQuery.id(iv).image(acct.getPhotoUrl().toString()); Log.d("Uriddd",acct.getPhotoUrl().toString()); /* Log.d(TAG,"CurrentLocation "+person.getCurrentLocation()); Log.d(TAG,"AboutMe "+person.getAboutMe());*/ // Log.d("Birthday ",person.getBirthday()); // Log.d(TAG,"Image "+person.getImage()); } }); } else { //If login fails Toast.makeText(this, "Login Failed", Toast.LENGTH_LONG).show(); } } @Override public void onConnectionFailed(ConnectionResult connectionResult) { } } 
  **Dependency** **Need Internet Permission** **Working Code see Link on play Store** https://play.google.com/store/search?q=com.codecube.airbucks compile 'com.google.android.gms:play-services:8.3.0'      package com.keshav.geofencing; import android.Manifest; import android.annotation.TargetApi; import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import com.facebook.CallbackManager; import com.facebook.FacebookCallback; import com.facebook.FacebookException; import com.facebook.FacebookSdk; import com.facebook.GraphRequest; import com.facebook.GraphResponse; import com.facebook.login.LoginManager; import com.facebook.login.LoginResult; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.auth.api.signin.GoogleSignInResult; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.OptionalPendingResult; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import org.json.JSONException; import org.json.JSONObject; import java.util.Arrays; import utilities.CommonMethod; import utilities.LoginPreferences; public class LoginWithGmail extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener { private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; private static final String TAG = "LoginActivity"; private static final int RC_SIGN_IN = 9001; Button loginSub; LinearLayout signInButton; String gmailId; String gmailName; String gmailUserEmailId; Uri gmailUserPhoto; String savePassword; LinearLayout btnlogin; TextView btnsigning; ProgressDialog prgDialog; private CallbackManager callbackManager; private BroadcastReceiver mRegistrationBroadcastReceiver; private LinearLayout fbloginButton; // private CallbackManager callbackManager; private ProgressDialog mProgressDialog; private GoogleApiClient mGoogleApiClient; EditText edtEmail; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login1); checkPermission(); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addApi(AppIndex.API).build(); // Google Sign up Button signInButton = (LinearLayout) findViewById(R.id.sign_in_button); signInButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int permissionCheck = ContextCompat.checkSelfPermission(LoginWithGmail.this, Manifest.permission.CAMERA); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { //showing dialog to select image Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); signInIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivityForResult(signInIntent, RC_SIGN_IN); Log.e("permission", "granted"); } else { ActivityCompat.requestPermissions(LoginWithGmail.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1); } } else { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); signInIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivityForResult(signInIntent, RC_SIGN_IN); } } }); } public void checkPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int permissionCheck = ContextCompat.checkSelfPermission(LoginWithGmail.this, Manifest.permission.CAMERA); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { //showing dialog to select image if (CommonMethod.isNetworkAvailable(LoginWithGmail.this)) { Log.e("keshav", "Permission if part marsh"); } else { CommonMethod.showAlert("Internet Connectivity Failure", LoginWithGmail.this); } Log.e("keshav", "permission granted"); } else { ActivityCompat.requestPermissions(LoginWithGmail.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1); } } } @Override protected void onResume() { super.onResume(); // LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, // new IntentFilter(QuickstartPreferences.REGISTRATION_COMPLETE)); } @Override protected void onPause() { LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver); super.onPause(); } @Override public void onBackPressed() { super.onBackPressed(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } } // TODO ADD ME @Override public void onStart() { super.onStart(); OptionalPendingResult opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); if (opr.isDone()) { // If the user's cached credentials are valid, the OptionalPendingResult will be "done" // and the GoogleSignInResult will be available instantly. Log.e(TAG, "Got cached sign-in"); GoogleSignInResult result = opr.get(); handleSignInResult(result); } else { // If the user has not previously signed in on this device or the sign-in has expired, // this asynchronous branch will attempt to sign in the user silently. Cross-device // single sign-on will occur in this branch. showProgressDialog(); opr.setResultCallback(new ResultCallback() { @Override public void onResult(GoogleSignInResult googleSignInResult) { hideProgressDialog(); handleSignInResult(googleSignInResult); } }); } } // [START signOut] private void signOut() { Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback() { @Override public void onResult(Status status) { // [START_EXCLUDE] // updateUI(false); // [END_EXCLUDE] } }); } // [END signOut] // [START revokeAccess] private void revokeAccess() { Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback( new ResultCallback() { @Override public void onResult(Status status) { // [START_EXCLUDE] // updateUI(false); // [END_EXCLUDE] } }); } // [END revokeAccess] @Override public void onConnectionFailed(ConnectionResult connectionResult) { // An unresolvable error has occurred and Google APIs (including Sign-In) will not // be available. Log.e(TAG, "onConnectionFailed:" + connectionResult); } private void showProgressDialog() { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("Loading..."); mProgressDialog.setIndeterminate(true); } if (LoginWithGmail.this != null && mProgressDialog != null && !mProgressDialog.equals("null")) mProgressDialog.show(); } private void hideProgressDialog() { if (mProgressDialog != null && mProgressDialog.isShowing()&& !mProgressDialog.equals("null")) { mProgressDialog.hide(); } } // TODO ADD ME ENd private void handleSignInResult(GoogleSignInResult result) { Log.e("&&&s", "handleSignInResult:" + result.isSuccess()); if (result.isSuccess()) { // Signed in successfully, show authenticated UI. GoogleSignInAccount acct = result.getSignInAccount(); gmailId = acct.getId(); gmailName = acct.getDisplayName(); gmailUserEmailId = acct.getEmail(); gmailUserPhoto = acct.getPhotoUrl(); Log.e("gmailId", "is -->" + gmailId); Log.e("gmailName", "is -->" + gmailName); Log.e("gmailUserEmailId", "is -->" + gmailUserEmailId); Log.e("gmailUserPhoto", "is -->" + gmailUserPhoto); LoginPreferences.getActiveInstance(LoginWithGmail.this).setUserName(gmailName); LoginPreferences.getActiveInstance(LoginWithGmail.this).setProfileImage(""+gmailUserPhoto); Log.e("information", "using Gmail is > " + gmailId + " " + gmailName + "" + gmailUserEmailId + "" + gmailUserPhoto); if (CommonMethod.isNetworkAvailable(LoginWithGmail.this)) { Log.e("SignUp gmail", "Hit API.........................."); Intent i=new Intent(LoginWithGmail.this,DrawerActivity.class); LoginPreferences.getActiveInstance(LoginWithGmail.this).setIsLoggedIn(true); startActivity(i); finish(); // TODO Here Registered User in own Database call Volley Retrofit2 Api .... new SignUpSocialFacebookAsyncTask().execute(); } else { CommonMethod.showAlert("Intenet Connectivity Failure", LoginWithGmail.this); } } else { } // TODO ADD ME KESHAV Google GMail Logout Auth.GoogleSignInApi.signOut(mGoogleApiClient); } @Override public void onStop() { super.onStop(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "Login Page", // TODO: Define a title for the content shown. // TODO: If you have web page content that matches this app activity's content, // make sure this auto-generated web page URL is correct. // Otherwise, set the URL to null. Uri.parse("http://host/path"), // TODO: Make sure this auto-generated app deep link URI is correct. Uri.parse("android-app://com.keshav.geofencing/http/host/path") ); AppIndex.AppIndexApi.end(mGoogleApiClient, viewAction); mGoogleApiClient.disconnect(); } //Todo add new method for permission @TargetApi(Build.VERSION_CODES.M) @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == RC_SIGN_IN) { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); signInIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivityForResult(signInIntent, RC_SIGN_IN); } } } **Dependency** **Need Internet Permission** **Working Code see Link on play Store** https://play.google.com/store/search?q=com.codecube.airbucks