2012-04-01 18 views

Respuesta

1

Claro es posible que desee comenzar con esto:

sitios web de terceros y aplicaciones ahora pueden permitir a los visitantes firman en usando 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 objetivo 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 firmar 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

volver cuando te quedas atascado!

+0

OpenID 2.0 se ha quedado en desuso, comprobar https://developers.google.com/accounts/docs/OAuth2Login – mjn

1

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á. Usted puede hacer cualquiera de:

  • de verificación si el usuario ha registrado una cuenta de Google (utilizando AccountManager) en su teléfono, y sólo dejar que utilizar la aplicación, si lo tiene. Si se registra una cuenta, puede estar razonablemente seguro de que conoce la contraseña (o le robaron el teléfono a alguien ...)
  • construya su propio servicio web (por ejemplo, usando App Engine) que usa su aplicación, y use las cuentas de Google para iniciar sesión a ella
47

Es posible que desee autenticar al usuario usando uno de la cuenta de Google ya configurada en el dispositivo como si algunas de las aplicaciones lo hacen, para que siga el siguiente enlace -

"Autenticación en OAuth2 servicios" - http://developer.android.com/training/id-auth/authenticate.html

Descargar muestra de Google - Android SDK Gerente/Extras/Google Play servicios

En sencillos pasos lo hace

  1. lista de cuentas de espectáculos en su móvil
  2. Genera token de acceso de las cuentas seleccionadas
  3. Obtiene el nombre de la cuenta de token de acceso poniéndose en contacto con los servicios de Google (llamada por separado) para decir simplemente que se ha autenticado.

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

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

  1. le enviará el token de acceso generado en la espalda -end server
  2. El servidor back-end comprueba que el token de acceso es válido o no contactando a servicios de google por esta url "https://www.googleapis.com/oauth2/v1/userinfo?access_token=ACCESS_TOKEN"
  3. Siguiente El servidor de fondo 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 del anterior "userinfo" llamar

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

Si desea correo electrónico de identificación junto con la respuesta tiene que modificar

ALCANCE = "OAuth2: https://www.googleapis.com/auth/userinfo.profile";

a

SCOPE = "OAuth2: https://www.googleapis.com/auth/userinfo.profilehttps://www.googleapis.com/auth/userinfo.email";

en esa muestra

+0

tengo tratar por encima de alcance para conseguir given_name, FAMILY_NAME como se describe en su respuesta, pero tengo solamente a continuación la respuesta { "id": "105024889100906846764", "e-mail": "[email protected]", "verified_email": true, "locale": "en" } – Herry

+0

@Herry idea de por qué no está devolviendo 'given_name' y' family_name' por ti, pero estoy seguro de que obtuve esos detalles cuando ejecuto sample from google, mejor intento con otro correo electrónico. – Balaji

+0

Gracias, esto es tan útil para mí. –

2

Primero inserte la línea de abajo en sus dependencias build.gradle

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

Ahora tenemos que SHA-1 de huellas dactilares, 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 programa \ 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 autenticar y comunicarse con el API de Google+, se debe crear un proyecto de Google Developers Console, donde tiene que habilitar la API de Google+ y crear un ID de cliente de OAuth 2.0.

  1. Goto Google Developers Console. y cree un nuevo proyecto
  2. Una vez que haya terminado con la creación de 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 ir a la sección Credenciales en la API y Crear 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, habilite la opción Enlace profundo para activar las publicaciones interactivas y todos los demás parámetros como se muestra en la imagen de abajo

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

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.androstock.loginwithgoogle" > 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

Ahora nos dirigimos hacia nuestra clase MainActivity.java donde vamos a hacer todas nuestras cosas para Google+ Login.

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<String, Void, Bitmap> { 
    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); 
    } 
} 



} 

Crear activity_main.xml que contendrá nuestra entrada y el diseño de cierre de sesión.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:gravity="center"> 

<LinearLayout 
    android:id="@+id/text_view_container" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:visibility="gone" 
    android:gravity="center"> 

    <ImageView 
     android:id="@+id/imgProfilePic" 
     android:layout_width="80dp" 
     android:layout_height="wrap_content"/> 

    <TextView 
     android:id="@+id/tvName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="5dp" 
     android:textSize="20dp" /> 

    <TextView 
     android:id="@+id/tvMail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="5dp" 
     android:textSize="18dp" /> 

</LinearLayout> 

<Button 
    android:id="@+id/sign_out_button" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="10dp" 
    android:background="@android:color/holo_red_light" 
    android:layout_marginLeft="19dp" 
    android:layout_marginRight="19dp" 
    android:text="LOGOUT" 
    android:textColor="#fff" 
    android:textStyle="bold" 
    android:visibility="gone" /> 

<TextView 
    android:id="@+id/notSignedIn_tv" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:layout_marginBottom="30dp" 
    android:text="You are not Signed In" 
    android:textSize="20sp" /> 

<com.google.android.gms.common.SignInButton 
    android:id="@+id/sign_in_button" 
    android:layout_width="220dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" /> 

</LinearLayout> 

Eso es todo. Has terminado con el inicio de sesión de Google+. Para obtener más información, puede visitar here.

1

Así es como integro el inicio de sesión de Google de la manera más reciente y sencilla.

De esta referencia: google login android studio

primero cree aplicación en el archivo de la consola de desarrollo y configuración de descarga de Google y de la copia en la carpeta de aplicaciones.

luego añadir siguiente en build.gradle(Project: project_name)

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

código de complemento 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' 

complemento siguiente en activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context="com.exampledemo.parsaniahardik.google_login_demonuts.MainActivity"> 

    <ImageView 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:scaleType="fitXY" 
     android:layout_marginTop="20dp" 
     android:layout_gravity="center_horizontal" 
     android:id="@+id/iv"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/text" 
     android:textColor="#000" 
     android:layout_marginTop="20dp" 
     android:textAppearance="?android:attr/textAppearanceMedium"/> 

    <com.google.android.gms.common.SignInButton 
     android:id="@+id/sign_in_button" 
     android:layout_width="200dp" 
     android:layout_marginTop="20dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" /> 
    <Button 
     android:layout_width="200dp" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="20dp" 
     android:layout_gravity="center_horizontal" 
     android:text="Logout" 
     android:id="@+id/btn"/> 
</LinearLayout> 

añadir a continuación 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<Status>() { 
          @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<People.LoadPeopleResult>() { 
       @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) { 

    } 
} 
0
**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' 


    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 


     <com.google.android.gms.common.SignInButton 
      android:id="@+id/sign_in_button" 
      android:layout_width="200dp" 
      android:layout_marginTop="20dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" /> 
     <Button 
      android:layout_width="200dp" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="20dp" 
      android:layout_gravity="center_horizontal" 
      android:text="Logout" 
      android:id="@+id/btn"/> 
    </LinearLayout> 

    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<GoogleSignInResult> 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<GoogleSignInResult>() { 
        @Override 
        public void onResult(GoogleSignInResult googleSignInResult) { 
         hideProgressDialog(); 
         handleSignInResult(googleSignInResult); 
        } 
       }); 
      } 
     } 

     // [START signOut] 
     private void signOut() { 
      Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
        new ResultCallback<Status>() { 
         @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<Status>() { 
         @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 
Cuestiones relacionadas