使用Google帐户登录Android应用程序
我正在Android上开发一个应用程序,我想允许用户使用他们的Google帐户登录。我如何才能做到这一点?当然,您可能希望从以下几点开始: 第三方网站和应用程序现在可以让访问者登录 使用他们的谷歌用户帐户。基于OpenID的联合登录 标准,用户无需设置单独的登录帐户 用于不同的网站--并将网站开发人员从该任务中解放出来 实现登录身份验证措施的方法。OpenID实现了这一点 目标是提供一个框架,用户可以在其中建立帐户 与OpenID提供商(如谷歌)合作,并使用该帐户进行签名 进入任何接受OpenID的网站。本页介绍如何 为网站或应用程序集成Google的联合登录使用Google帐户登录Android应用程序,android,authentication,login,google-account,Android,Authentication,Login,Google Account,我正在Android上开发一个应用程序,我想允许用户使用他们的Google帐户登录。我如何才能做到这一点?当然,您可能希望从以下几点开始: 第三方网站和应用程序现在可以让访问者登录 使用他们的谷歌用户帐户。基于OpenID的联合登录 标准,用户无需设置单独的登录帐户 用于不同的网站--并将网站开发人员从该任务中解放出来 实现登录身份验证措施的方法。OpenID实现了这一点 目标是提供一个框架,用户可以在其中建立帐户 与OpenID提供商(如谷歌)合作,并使用该帐户进行签名 进入任何接受OpenI
当你被卡住的时候回来 您不能使用Google帐户登录Android应用程序。您可以使用Google帐户登录网站或Web服务,如GMail、日历等,或者使用OpenID登录第三方网站。因为你的应用程序不是一个网站,所以这不起作用。您可以执行以下任一操作:
- 检查用户是否已在其手机上注册了Google帐户(使用
),并且仅允许他们使用应用程序(如果他们有)。如果注册了一个帐户,你可以合理地确定他们知道密码(或者他们偷了别人的电话…)AccountManager
- 构建应用程序使用的自己的Web服务(例如使用AppEngine),并使用Google帐户登录
(更具体地说)您可能希望像某些应用程序一样,使用您设备中已配置的谷歌帐户之一对用户进行身份验证,为此,请点击以下链接- “对OAuth2服务进行身份验证”—— 从谷歌下载示例-Android SDK管理器/Extras/Google Play Services 通过简单的步骤就可以做到
在该示例中,首先在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
<?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'