使用Google帐户登录Android应用程序

使用Google帐户登录Android应用程序,android,authentication,login,google-account,Android,Authentication,Login,Google Account,我正在Android上开发一个应用程序,我想允许用户使用他们的Google帐户登录。我如何才能做到这一点?当然,您可能希望从以下几点开始: 第三方网站和应用程序现在可以让访问者登录 使用他们的谷歌用户帐户。基于OpenID的联合登录 标准,用户无需设置单独的登录帐户 用于不同的网站--并将网站开发人员从该任务中解放出来 实现登录身份验证措施的方法。OpenID实现了这一点 目标是提供一个框架,用户可以在其中建立帐户 与OpenID提供商(如谷歌)合作,并使用该帐户进行签名 进入任何接受OpenI

我正在Android上开发一个应用程序,我想允许用户使用他们的Google帐户登录。我如何才能做到这一点?

当然,您可能希望从以下几点开始:

第三方网站和应用程序现在可以让访问者登录 使用他们的谷歌用户帐户。基于OpenID的联合登录 标准,用户无需设置单独的登录帐户 用于不同的网站--并将网站开发人员从该任务中解放出来 实现登录身份验证措施的方法。OpenID实现了这一点 目标是提供一个框架,用户可以在其中建立帐户 与OpenID提供商(如谷歌)合作,并使用该帐户进行签名 进入任何接受OpenID的网站。本页介绍如何 为网站或应用程序集成Google的联合登录


当你被卡住的时候回来

您不能使用Google帐户登录Android应用程序。您可以使用Google帐户登录网站或Web服务,如GMail、日历等,或者使用OpenID登录第三方网站。因为你的应用程序不是一个网站,所以这不起作用。您可以执行以下任一操作:

  • 检查用户是否已在其手机上注册了Google帐户(使用
    AccountManager
    ),并且仅允许他们使用应用程序(如果他们有)。如果注册了一个帐户,你可以合理地确定他们知道密码(或者他们偷了别人的电话…)
  • 构建应用程序使用的自己的Web服务(例如使用AppEngine),并使用Google帐户登录
看一看 在这里,您将找到一个关于如何使用客户经理的教程。
(更具体地说)

您可能希望像某些应用程序一样,使用您设备中已配置的谷歌帐户之一对用户进行身份验证,为此,请点击以下链接-

“对OAuth2服务进行身份验证”——

从谷歌下载示例-Android SDK管理器/Extras/Google Play Services

通过简单的步骤就可以做到

  • 显示手机中的帐户列表
  • 从所选帐户生成访问令牌
  • 通过联系google services(单独呼叫)从access token获取帐户名,告知其已通过身份验证
  • 这是另一个很好地解释过程的链接-

    您可以按照以下步骤登录应用程序

  • 您将向后端服务器发送生成的访问令牌
  • 后端服务器通过此url联系google services来检查访问令牌是否有效“”
  • 下一个后端服务器响应应用程序是否让用户登录
  • 下面是上述“用户信息”呼叫的响应格式

    如果您想要电子邮件id以及该回复,您必须修改

    SCOPE=“oauth2:”

    SCOPE=“oauth2:”


    在该示例中,首先在build.gradle依赖项中插入以下行

    compile 'com.google.android.gms:play-services:7.5.0'
    
    现在我们需要SHA-1指纹,我们必须在谷歌开发者控制台中提供

    Java keytool用于生成SHA-1指纹。打开命令提示符[打开C:\Program Files\Java\jdk\bin,然后按Shift+右键单击]并执行以下命令以生成SHA-1指纹,如果提示,请输入android作为密码

    keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
    
    要验证Google+API并与之通信,必须创建一个Google开发者控制台项目,在该项目中必须启用Google+API并创建OAuth 2.0客户端ID

  • 后藤。并创建一个新项目
  • 创建完项目后,单击API和Auth部分下的API。搜索Google+API并选择我在下图中显示的那个
  • 通过选择可用的EnableAPI按钮来启用Google+API
  • 启用后,转到API下的凭据部分并创建新的客户端ID
  • 选择已安装的应用程序作为“类型和配置同意”屏幕
  • 现在填写项目的包名,粘贴SHA1指纹,启用深度链接选项以激活交互式帖子和所有其他参数,如下图所示
  • 现在是向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>
    
    
    
    .

    以下是我如何将谷歌登录与最新、最流畅的方式相结合

    根据此参考:

    首先在google开发者控制台中创建应用程序,下载配置文件并复制到应用程序文件夹中

    然后在
    build.gradle(项目:项目名称)

    在build.gradle(模块:app)中添加代码

    在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) {
    
        }
    }
    
    导入android.content.Intent;
    导入android.support.annotation.NonNull;
    导入android.support.v7.app.AppActivity;
    导入android.os.Bundle;
    导入android.util.Log;
    导入android.view.view;
    导入android.widget.Button;
    导入android.widget.ImageView;
    导入android.widget.TextView;
    导入android.widget.Toast;
    导入com.androidquery.AQuery;
    导入com.google.android.gms.auth.api.auth;
    导入com.google.android.gms.auth.api.signin.GoogleSignInAccount;
    导入com.google.android.gms.auth.api.signin.GoogleSignInOptions;
    导入com.google.android.gms.auth.api.signin.GoogleSignInResult;
    导入com.google.android.gms.common.ConnectionResult;
    导入com.google.android.gms.common.SignInButton;
    导入com.google.android.gms.common.api.GoogleAppClient;
    导入com.google.android.gms.common.api.ResultCallback;
    导入com.google.android.gms.common.api.Status;
    导入com.google.android.gms.plus.People;
    导入com.google.android.gms.plus.plus;
    导入com.google.android.gms.plus.model.people.Person;
    公共类MainActivity扩展AppCompatActivity实现GoogleAppClient.OnConnection
    
    <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>
    
    classpath 'com.google.gms:google-services:1.5.0-beta2'
     maven { url 'https://jitpack.io' }
    allprojects {
        repositories {
     }
    }
    
    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'
    
    <?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>
    
    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) {
    
        }
    }
    
        **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
    
        public class GooglePlusSignInHelper {
        private final static String TAG = "GooglePlusSignInHelper";
            private final static int RC_SIGN_IN = 100;
            private static GoogleSignInOptions gso;
    
            private static GooglePlusSignInHelper sInstance;
            private static String webClientID;
            public GoogleApiClient googleApiClient;
            private Context context;
            private OnGoogleSignInListener loginResultCallback;
            private ResultCallback<Status> logoutResultCallback;
    
            public String signOutType ="";
        /**
         * This method should be called before calling any instance.
         * This is neccessary to get access token and id of user.
         * @param googleClientId
         */
        public static void setClientID(String googleClientId) {
            webClientID = googleClientId;
        }
    
        /**
         * Interface to listen to the Google login
         */
        public interface OnGoogleSignInListener {
            void OnGSignSuccess(GoogleSignInAccount googleSignInAccount, @Nullable Person person);
    
            void OnGSignError(GoogleSignInResult errorMessage);
        }
    
            public static GooglePlusSignInHelper getInstance() {
                if (sInstance == null) {
                    sInstance = new GooglePlusSignInHelper();
                }
                return sInstance;
            }
    
            private GooglePlusSignInHelper() {
                // Configure sign-in to request the user's ID, email address, and basic
                // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
                gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestScopes(new Scope(Scopes.PLUS_LOGIN))
                        .requestProfile() //for profile related info
                        .requestEmail() //for email
                        .requestIdToken(webClientID) //for accessToken and id
                        .build();
            }
    
            public void initialize(FragmentActivity activity, OnGoogleSignInListener onGoogleSignInListener)
            {
                loginResultCallback = onGoogleSignInListener;
                context = activity;
                googleApiClient = new GoogleApiClient.Builder(activity)
                        .enableAutoManage(activity /* FragmentActivity */, new GoogleApiClient.OnConnectionFailedListener() {
                            @Override
                            public void onConnectionFailed(ConnectionResult connectionResult) {
                                Log.e(TAG, "onConnectionFailed: " + connectionResult);
                            }
                        } /* OnConnectionFailedListener */)
                        .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                        .addApi(Plus.API)
                        .build();
    
                googleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                    @Override
                    public void onConnected(Bundle bundle) {
                        Log.i(TAG, "onConnected");
                    }
    
                    @Override
                    public void onConnectionSuspended(int i) {
                        Log.i(TAG, "onConnectionSuspended");
                    }
                });
    
                googleApiClient.registerConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(ConnectionResult connectionResult) {
                        Log.i(TAG, "onConnectionFailed");
                    }
                });
    
            }
    
            public boolean isConnected() {
                boolean isConnected = googleApiClient.isConnected();
    
                Log.i(TAG, "isConnected()" + isConnected);
                return isConnected;
            }
    
            public void signIn(Activity activity) {
    
                if (googleApiClient.isConnected()) {
                    if (!googleApiClient.hasConnectedApi(Auth.GOOGLE_SIGN_IN_API)) {
                        googleApiClient.clearDefaultAccountAndReconnect();
                    }
                    Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback(
                            new ResultCallback<Status>() {
                                @Override
                                public void onResult(Status status) {
                                    if (!signOutType.equals("silent")) {
                                        Toast.makeText(activity, "Logged Out", Toast.LENGTH_SHORT).show();
                                    }
                                    signOutType="";
                                    startActivity(activity);
                                }
                            });
                } else {
                    googleApiClient.connect();
                    startActivity(activity);
                }
            }
    
            private void startActivity(Activity activity){
                Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
                activity.startActivityForResult(signInIntent, RC_SIGN_IN);
            }
    
            public void signOut() {
                if (!isConnected())
                    return;
    
                Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback(
                        new ResultCallback<Status>() {
                            @Override
                            public void onResult(Status status) {
                                if (logoutResultCallback != null) {
                                    logoutResultCallback.onResult(status);
                                }
                            }
                        });
            }
    
            private void handleSignInResult(GoogleSignInResult result) {
                Log.d(TAG, "handleSignInResult:" + result.isSuccess());
                if (result.isSuccess()) {
                    Log.i(TAG, "Signed in");
                    // Signed in successfully, show authenticated UI.
                    final GoogleSignInAccount acct = result.getSignInAccount();
    
                    //This code is just for getting google plus information like gender, birthday, aboutme etc
                    final Person[] person = {null};
                    if(acct!=null) {
                        Plus.PeopleApi.load(googleApiClient, acct.getId()).setResultCallback(new ResultCallback<People.LoadPeopleResult>() {
                            @Override
                            public void onResult(@NonNull People.LoadPeopleResult loadPeopleResult) {
                                try {
                                    person[0] = loadPeopleResult.getPersonBuffer().get(0);
                                    loadPeopleResult.getPersonBuffer().release();
                                } catch (Exception e){
                                    if (loginResultCallback != null) {
                                        loginResultCallback.OnGSignError(result);
                                    }
                                }
                                finally {
                                    if (loginResultCallback != null) {
                                        loginResultCallback.OnGSignSuccess(acct, person[0]);
                                    }
                                }
                            }
                        });
                    }
    //                If you don't want google+ related info, just comment above code, uncomment below callback
    //                if (loginResultCallback != null) {
    //                    //In this case, person object will always be null
    //                    loginResultCallback.OnGSignSuccess(acct, null);
    //                }
    
                } else {
                    Log.i(TAG, "Signed out");
    
                    if (loginResultCallback != null) {
                        loginResultCallback.OnGSignError(result);
                    }
                }
            }
    
            public void onActivityResult(int requestCode, int resultCode, Intent data) {
                // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
                if (requestCode == RC_SIGN_IN) {
                    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
                    handleSignInResult(result);
                }
            }
    
            public void setLogoutResultCallback(ResultCallback<Status> callback) {
                logoutResultCallback = callback;
            }
    }
    
       @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            FragmentCreateAccount fragmentCreateAccount = (FragmentCreateAccount) getSupportFragmentManager().findFragmentById(R.id.frgament_settings_content_frame);
            if(fragmentCreateAccount!=null)
            {
                fragmentCreateAccount.onActivityResult(requestCode, resultCode, data);
            }
        }
    
    private ImageButton googleSignInButton;
    private GooglePlusSignInHelper gSignInHelper;
    
    ProgressBar progressBar;
    
       @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
           // ...
    
            googleSignInButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    progressBar.setVisibility(View.VISIBLE);
                    gSignInHelper.signOutType="silent";
                    gSignInHelper.signIn(getActivity());
                }
            });
    
            GooglePlusSignInHelper.setClientID(ADD_YOUR_OWN_CLIENT_ID);
            gSignInHelper = GooglePlusSignInHelper.getInstance();
            gSignInHelper.initialize(getActivity(),  this);
            gSignInHelper.signOutType="silent";
    
    // ...
    
        }
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        gSignInHelper.onActivityResult(requestCode, resultCode, data);
        progressBar.setVisibility(View.GONE);
    
    }
    
    /****************** Google Sign In *******************************************/
    @Override
    public void OnGSignSuccess(GoogleSignInAccount acct, Person person) {
        try {
            String GuserName = (acct.getDisplayName()==null)?"":acct.getDisplayName();
            String Gemail = acct.getEmail();
    
            email.setText(Gemail);
            String[] params= new String[4];
            params[0]=GuserName;
            params[1]=Gemail;
            params[2]="";
            params[3]="";
    
            if (person != null) {
                int gender = person.getGender();
                String sGender="";
                if (gender == 0)
                    sGender = "MALE";
                else if (gender == 1)
                    sGender = "FEMALE";
                else
                    sGender = "OTHERS";
    
                String GpersonName = person.getDisplayName();
                String GpersonPhotoUrl = person.getImage().getUrl();
    
                Log.e(TAG, "Name: " + GpersonName + ", email: " + Gemail + ", Image: " + GpersonPhotoUrl);
    
                params[2]=GpersonName;
                params[3]=GpersonPhotoUrl;
    
                //personPhotoUrl = personPhotoUrl.substring(0, personPhotoUrl.length() - 2)  + PROFILE_PIC_SIZE;
                //new LoadProfileImage(imgProfilePic).execute(personPhotoUrl);
            } else if(SessionData.System.isDebugEnabled) {
                Toast.makeText(getActivity(), "Couldnt Get the Person Info", Toast.LENGTH_SHORT).show();
            }
            Toast.makeText(getActivity(), "You are Logged In " + GuserName,Toast.LENGTH_LONG).show();
            
            // ...
        } catch (Exception e) {
            CrashReports crashReports = new CrashReports();
            crashReports.SaveCrash(e, getActivity());
        }
    }
    
    @Override
    public void OnGSignError(GoogleSignInResult errorMessage) {
        // status code 12501 : canceled by user
        if (errorMessage.getStatus().getStatusCode()==12501){
            // TODO: language translation
            Toast.makeText(getActivity(), "Google auth canceled", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(getActivity(), errorMessage.getStatus().zzg(), Toast.LENGTH_SHORT).show();
        }
    }
    
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    
    implementation 'com.google.android.gms:play-services-auth:19.0.0'
    implementation 'com.google.android.gms:play-services-plus:17.0.0'