
In this tutorial, we are going to learn how to integrate Google+ for Android application login and also we will retrieve and display Google+ user profile information. Using the latest version of Google Plus for Android, it takes only a few minutes to add this feature to your app.
By integrating Google Plus in your android app, you can create a simple authentication process where user can directly login to your app using their Google Plus credentials. We can also fetch various user information such as user email, name, profile info etc. Other than authentication process, we can use Google Plus integration for fetching friend list, sharing content from Google Plus and posting purposes also.
Google Sign-In for Android has the following requirements:
Creating a project at Google Developers Console
Before moving ahead to the android project, we have to create a project on Google Developers Console.
Step 1. Log in to Google Plus account and go to this dashboard and click on Create project (top left corner). Step 2. Now fill the details and click on Create. Step 3. Now we need a configuration file for our Android app. So go to this link. Select your app we just created on developer console. And write the package name of your Android studio project. Finally choose country and click on continue. Step 4. In the next screen you will asked for SHA-1. To get SHA-1 Certificate. Open command prompt and navigate to jdk/bin folder. Write the following command and hit enter
# on MAC and any Linux OS keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v
Step 5. Copy the SHA1 and paste it to the Enable Google Services Page. Step 6. Now click on Enable Google Signin. And click on Continue to Generate Configuration Files. Step 7. Now click on Download google-services.json to get your configuration file and save it to app/ directory of your project. Now come to Android studio.
Creating Login activity
Open AndroidManifest.xml file and ddd a uses-permission element to the manifest.
<uses-permission android:name="android.permission.INTERNET"/>
Add the dependency to your project-level build.gradle:
classpath 'com.google.gms:google-services:3.0.0'
Add the plugin to your app-level build.gradle:
apply plugin: 'com.google.gms.google-services'
...
dependencies {
...
compile 'com.google.android.gms:play-services-auth:9.0.0'
compile 'com.google.android.gms:play-services:9.0.0'
}
After that we will make activity for signing in and showing profile info.
Below is activity_main.xml layout.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<com.google.android.gms.common.SignInButton
android:id="@+id/btnLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
<TextView
android:id="@+id/tvStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"/>
</LinearLayout>
As you can see I have created a SignInButton button with one TextView (to show name and email).
Now come to MainActivity.java and write the following code.
public class MainActivity extends AppCompatActivity implements View.OnClickListener,
GoogleApiClient.OnConnectionFailedListener {
private SignInButton btnLogin;
private GoogleSignInOptions gso;
private GoogleApiClient gac;
// signin constant to check the activity result
private int RC_SIGN_IN = 100;
private TextView tvStatus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvStatus = (TextView) findViewById(R.id.tvStatus);
// initializing google signin option
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
// initializing SignInButton
btnLogin = (SignInButton) findViewById(R.id.btnLogin);
btnLogin.setSize(SignInButton.SIZE_WIDE);
// initializing GoogleApiClient
gac = new GoogleApiClient.Builder(MainActivity.this)
.enableAutoManage(MainActivity.this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
// setting onClick listener to SignInButton
btnLogin.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v == btnLogin) {
Intent i = Auth.GoogleSignInApi.getSignInIntent(gac);
startActivityForResult(i, RC_SIGN_IN);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
}
}
// after the signing we are calling this function
private void handleSignInResult(GoogleSignInResult result) {
// if the login succeed
if (result.isSuccess()) {
// getting google account
GoogleSignInAccount acct = result.getSignInAccount();
// displaying name and email
tvStatus.setText(String.format("Name: %s\nEMail: %s", acct.getDisplayName(), acct.getEmail()));
// profile photo
Log.d("DBG", acct.getPhotoUrl().toString());
} else {
Toast.makeText(this, "Login Failed", Toast.LENGTH_LONG).show();
}
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d("DBG", "onConnectionFailed:" + connectionResult);
}
@Override
protected void onStart() {
super.onStart();
OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(gac);
if (opr.isDone()) {
Log.d(TAG, "Got cached sign-in");
GoogleSignInResult result = opr.get();
handleSignInResult(result);
} else {
opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(GoogleSignInResult googleSignInResult) {
handleSignInResult(googleSignInResult);
}
});
}
}
}
The class implements GoogleApiClient.OnConnectionFailedListener. We also instantiate an object of GoogleApiClient class. The connect and disconnect method is called on this object in the Activity onStart and onStop methods.
Result
Creating Share activity
Let's add to activity_main.xml layout Button widget.
<Button
android:id="@+id/btnShare"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Share"
android:onClick="share"
android:visibility="gone"/>
New share() method will make the action
public void share(View v) {
Intent shareIntent = new PlusShare.Builder(this)
.setType("text/plain")
.setText("Hello from Android!")
.getIntent();
startActivityForResult(shareIntent, 0);
}
Full code of MainActivity.
public class MainActivity extends AppCompatActivity implements View.OnClickListener,
GoogleApiClient.OnConnectionFailedListener {
private SignInButton btnLogin;
private GoogleSignInOptions gso;
private GoogleApiClient gac;
private Button btnShare;
// signin constant to check the activity result
private int RC_SIGN_IN = 100;
private TextView tvStatus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvStatus = (TextView) findViewById(R.id.tvStatus);
// initializing SignInButton
btnLogin = (SignInButton) findViewById(R.id.btnLogin);
btnLogin.setSize(SignInButton.SIZE_WIDE);
btnShare = (Button) findViewById(R.id.btnShare);
// initializing GoogleApiClient
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(new Scope(Scopes.PLUS_LOGIN))
.requestEmail()
.build();
gac = new GoogleApiClient.Builder(MainActivity.this)
.enableAutoManage(MainActivity.this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.addApi(Plus.API)
.build();
// setting onClick listener to SignInButton
btnLogin.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v == btnLogin) {
Intent i = Auth.GoogleSignInApi.getSignInIntent(gac);
startActivityForResult(i, RC_SIGN_IN);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
}
}
// after the signing we are calling this function
private void handleSignInResult(GoogleSignInResult result) {
// if the login succeed
if (result.isSuccess()) {
// getting google account
GoogleSignInAccount acct = result.getSignInAccount();
// displaying name and email
tvStatus.setText(String.format("Name: %s\nEMail: %s", acct.getDisplayName(), acct.getEmail()));
btnShare.setVisibility(View.VISIBLE);
// profile photo
Log.d("DBG", acct.getPhotoUrl().toString());
} else {
Toast.makeText(this, "Login Failed", Toast.LENGTH_LONG).show();
}
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {}
@Override
protected void onStart() {
super.onStart();
OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(gac);
if (opr.isDone()) {
Log.d("DBG", "Got cached sign-in");
GoogleSignInResult result = opr.get();
handleSignInResult(result);
} else {
opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(GoogleSignInResult googleSignInResult) {
handleSignInResult(googleSignInResult);
}
});
}
}
public void share(View v) {
Intent shareIntent = new PlusShare.Builder(this)
.setType("text/plain")
.setText("Hello from Android!")
.getIntent();
startActivityForResult(shareIntent, 0);
}
}
Result