Использование google-аккаунта для входа в Android-приложение

Я разрабатываю приложение на Android, и я хочу разрешить пользователям входить в систему со своей учетной записью google, может ли кто-нибудь помочь мне PLZ?

Возможно, вы захотите аутентифицировать пользователя, используя одну из учетных записей google, уже настроенных на вашем устройстве, например, некоторые из приложений, для чего следуйте приведенной ниже ссылке –

«Аутентификация сервисов OAuth2» – http://developer.android.com/training/id-auth/authenticate.html

Скачать образец из Google – Android SDK Manager / Extras / Google Play Services

В простых шагах он делает

  1. Показывает список аккаунтов на вашем мобильном телефоне.
  2. Создает токен доступа из выбранных учетных записей
  3. Получает имя учетной записи из токена доступа, связываясь с сервисами google (отдельный звонок), чтобы просто сказать, что он аутентифицирован.

Это еще одна ссылка, которая хорошо объясняет процесс – http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html

Вы можете выполнить следующие шаги для входа в ваше приложение.

  1. Вы отправите сгенерированный токен доступа на ваш Back-end сервер
  2. Сервер back-end проверяет, что токен доступа действителен или нет, обратившись к службам google по этому URL- адресу « https://www.googleapis.com/oauth2/v1/userinfo?access_token=ACCESS_TOKEN »
  3. Следующий серверный сервер отвечает на вопрос, нужно ли вводить пользователя или нет.

Ниже приведен формат ответа вышеуказанного вызова «userinfo»

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

Если вам нужен идентификатор электронной почты вместе с этим ответом, вы должны изменить

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

в

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

В этом образце

Взгляните на http://developer.android.com/training/id-auth/index.html. Там вы найдете руководство по использованию Диспетчера учетных записей. (Более конкретно http://developer.android.com/reference/android/accounts/AccountManager.html )

Конечно, вы можете начать с этого:

Сторонние веб-сайты и приложения теперь могут позволить посетителям войти в систему, используя свои учетные записи пользователей Google. Federated Login, основанный на стандарте OpenID, освобождает пользователей от необходимости настраивать отдельные учетные записи для разных веб-сайтов – и освобождает разработчиков веб-сайтов от реализации мер аутентификации входа. OpenID достигает этой цели, предоставляя платформу, в которой пользователи могут устанавливать учетную запись с провайдером OpenID, например Google, и использовать эту учетную запись для входа на любой веб-сайт, который принимает OpenID. На этой странице описывается, как интегрировать федеративный вход Google для веб-сайта или приложения.

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

Вернись, когда ты застрял!

Вы не можете войти в приложение Android с помощью учетной записи Google. Вы используете учетную запись Google для входа на веб-сайт или веб-сервис, такой как GMail, Calendar и т. Д., Или сторонний веб-сайт при использовании OpenID. Поскольку ваше приложение не является веб-сайтом, это не сработает. Вы можете выполнить одно из следующих действий:

  • Проверьте, зарегистрировал ли пользователь учетную запись Google (используя AccountManager ) на своем телефоне и разрешил им использовать приложение, если оно есть. Если учетная запись зарегистрирована, вы можете быть уверены, что они знают пароль (или они украли чей-то телефон …)
  • Создайте собственный веб-сервис (например, используя AppEngine), который использует ваше приложение, и используйте учетные записи Google для входа в систему

Сначала вставьте приведенную ниже строку в свои зависимости build.gradle

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

Теперь нам нужен отпечаток SHA-1, который мы должны предоставить в Google Developers Console.

Java keytool используется для создания отпечатка SHA-1. Откройте свою командную строку [Открыть C: \ Program Files \ Java \ jdk \ bin, затем нажмите Shift + Right Click] и выполните следующую команду для создания отпечатка SHA-1 и для ввода пароля в андроид при появлении запроса.

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

Чтобы аутентифицироваться и общаться с API Google+, вы должны создать проект Google Developers Console, в котором необходимо включить API Google+ и создать идентификатор клиента OAuth 2.0.

  1. Откройте Google Developers Console . И создать новый проект
  2. После того, как вы закончите создание проекта, щелкните по API в разделе API и Auth. Найдите Google+ API и выберите тот, который я показал на изображении ниже.
  3. Включите API Google+, нажав кнопку «Включить API».
  4. После включения перейдите в раздел учетных данных в API и создайте новый идентификатор клиента.
  5. Выберите Установленное приложение в качестве типа и настройте экран согласия
  6. Теперь заполните имя пакета вашего проекта, вставьте отпечаток пальца SHA1, включите параметр Deep Linking, чтобы активировать интерактивные сообщения и все остальные параметры, как показано на рисунке ниже.

Теперь пришло время объявить разрешения для вашего файла mainfest. Так будет выглядеть ваш файл манифеста после добавления метаданных и всех разрешений.

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

Теперь мы направляемся к нашему классу MainActivity.java, где мы собираемся делать все, что нужно для входа в 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<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); } } } 

Создайте файл activity_main.xml, который будет содержать наш макет входа и выхода.

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

Это все. Вы закончили с Google+ Войти. Для более подробной информации вы можете посетить здесь .

Вот как я интегрирую логин google с последним и самым плавным способом.

Из этой справки: google login android studio

Сначала создайте приложение в консоли разработчика Google и загрузите файл конфигурации и скопируйте его в папку приложения.

Затем добавьте следующее в build.gradle(Project: project_name)

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

Добавить код в 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' 

Добавьте следующее в 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> 

Добавить ниже в 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) { } } 

Официальное пошаговое руководство от Google:

https://developers.google.com/identity/sign-in/android/start

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