2012-04-01 21 views

Odpowiedz

1

pewno warto zacząć od tego:

stron internetowych i aplikacji innych firm mogą teraz pozwolić odwiedzającym zalogować używając swoich kont Google. Logowanie stowarzyszone, oparte na standardzie OpenID , zwalnia użytkowników z konieczności konfigurowania oddzielnych kont logowania dla różnych witryn internetowych - i zwalnia twórców stron internetowych z zadania wprowadzania środków uwierzytelniania logowania. OpenID osiąga ten cel , zapewniając ramy, w których użytkownicy mogą założyć konto z dostawcą OpenID, takim jak Google, i użyć tego konta do podpisania do dowolnej strony internetowej, która akceptuje OpenID. Na tej stronie opisano, jak zintegrować Federacyjne logowanie Google dla witryny internetowej lub aplikacji.

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

Wróć, kiedy utkniesz!

+0

OpenID 2.0 została zaniechana, sprawdź https://developers.google.com/accounts/docs/OAuth2Login – mjn

1

Nie można dokładnie zalogować się do aplikacji na Androida przy użyciu konta Google. Używasz konta Google do logowania się do strony internetowej lub usługi internetowej, takiej jak Gmail, Kalendarz itp., Lub strony trzeciej, jeśli korzystasz z OpenID. Ponieważ Twoja aplikacja nie jest witryną internetową, nie będzie działać. Można to zrobić albo jedno z:

  • sprawdzić, czy użytkownik zarejestrowany konto Google (przy użyciu AccountManager) na swoim telefonie, a niech tylko im korzystać z aplikacji, jeśli mają jeden. Jeśli konto jest zarejestrowane, możesz mieć pewność, że zna hasło (lub ukradł czyjś telefon ...)
  • zbudować własną usługę internetową (na przykład za pomocą AppEngine), z której korzysta twoja aplikacja, i używać kont Google do logowania na to:
47

Możesz chcieć uwierzytelnienia użytkownika przy użyciu jednego konta Google już skonfigurowane w urządzeniu jak w niektórych aplikacjach nie, za to poniższy link -

„Uwierzytelnianie do OAuth2 Usługi”- http://developer.android.com/training/id-auth/authenticate.html

pobierania próbek z Google - Android SDK Menedżer/Dodatki/Usługi Google Play

W prostych krokach robi

  1. Pokazuje listę kont w telefonie
  2. generuje token dostępu z wybranych rachunków
  3. Pobiera nazwę konta z tokenem dostępu kontaktując usług Google (call indywidualne), aby po prostu powiedzieć, że został uwierzytelniony.

Jest to kolejny związek, który jest dobry w wyjaśnianiu tego procesu - http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html

można wykonać poniższe kroki do logowania w aplikacji

  1. będzie wysłać wygenerowany token dostępu do pleców Serwer końcowy
  2. Serwer zaplecza sprawdza, czy token dostępu jest ważny, czy nie, kontaktując się z usługami Google za pomocą tego adresu URL: "https://www.googleapis.com/oauth2/v1/userinfo?access_token=ACCESS_TOKEN"
  3. Następny Serwer zaplecza odpowiada na pytanie, czy dokonać logowania użytkownika, czy nie.

Poniżej Format odpowiedź powyżej "userinfo" call

{ 
"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" 
} 

Jeśli chcesz Email id wraz z tej odpowiedzi trzeba zmienić

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

do

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

w tej próbce

+0

muszę spróbować powyżej zakresu dostać GIVEN_NAME, FAMILY_NAME jak opisują w swojej odpowiedzi, ale mam tylko poniżej odpowiedzi { "id": "105024889100906846764" "e-mail": "[email protected]" "verified_email": true, "locale": "en" } – Herry

+0

@Herry nie wiem dlaczego nie zwróci użytkownikowi 'given_name' i' family_name', ale jestem pewien, że dostałem te szczegóły podczas próby próbki z google, lepiej spróbuj z innym adresem e-mail. – Balaji

+0

Dziękuję, to jest dla mnie pomocne. –

2

Najpierw wstaw poniższy wiersz w zależności build.gradle

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

Teraz musimy odcisk palca SHA-1, które musimy dać w Google Developers Console.

Java keytool służy do generowania odcisków palców SHA-1. Otwórz wiersz polecenia [Otwórz C: \ Program Files \ Java \ jdk \ bin, a następnie naciśnij Shift + prawy przycisk myszy] i wykonaj następujące polecenie, aby wygenerować odcisk palca SHA-1, a w razie potrzeby wpisz hasło do systemu Android.

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

Aby uwierzytelnić i komunikować się z API Google+, należy utworzyć projekt Google Developers Console, gdzie trzeba włączyć interfejs API Google+ i utworzyć OAuth 2.0 identyfikator klienta.

  1. Przejdź do Google Developers Console. i utwórz nowy projekt
  2. Po zakończeniu tworzenia projektu kliknij opcję Interfejsy API w sekcji API i Auth. Wyszukaj interfejs Google+ API i wybierz ten, który pokazałem na poniższym obrazku.
  3. Włącz interfejs API Google+, wybierając przycisk Włącz dostępny interfejs API.
  4. Po włączeniu funkcji goto w sekcji Credentials w obszarze API i Utwórz nowy identyfikator klienta.
  5. Wybierz opcję Zainstalowana aplikacja jako typ i ekran zgody na zgodę
  6. Teraz Wypełnij nazwę pakietu projektu, wklej odcisk palca SHA1, włącz opcję Głębokie łączenie, aby aktywować posty interaktywne i wszystkie pozostałe parametry, jak pokazano w obraz poniżej.

Teraz należy zadeklarować uprawnienia do pliku głównego. Tak będzie wyglądać plik manifestu po dodaniu metadanych i wszystkich uprawnień.

<?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> 

Teraz zmierzamy w kierunku naszej klasie MainActivity.java gdzie mamy zamiar zrobić wszystkie nasze rzeczy do Google+ zalogować.

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



} 

Utwórz plik activity_main.xml, który będzie zawierał nasz układ logowania i wylogowania.

<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> 

To ludzie. Skończyłeś z Logowaniem do Google+. Aby uzyskać więcej informacji, odwiedź stronę here.

1

Oto jak mogę zintegrować logowanie google z najnowszym i najłagodniejszym sposobem.

Od tego odniesienia: google login android studio

najpierw utworzyć aplikację w google konsoli deweloper i pobierz plik konfiguracyjny i skopiuj do folderu aplikacji.

następnie dodać podążając build.gradle(Project: project_name)

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

kodu Dodać IN 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' 

dodatku podążając 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> 

dodać poniżej 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 
Powiązane problemy