1 Agregar las dependencias:
Archivo: buid.gralalde (Module:app)
plugins {
//bajo los demas
id("com.google.gms.google-services")
}
dependencies {
implementation("com.google.android.gms:play-services-auth:20.7.0")
}
Archivo: buid.gralalde (Proyect)
plugins {
//bajo los demas
id("com.google.gms.google-services") version "4.4.0" apply false
}
El Archivo LoginActivity:
package app.myapp.preubaloginaapp;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.google.android.gms.auth.api.Auth;
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.GoogleApi;
import com.google.android.gms.common.api.GoogleApiClient;
public class LoginActivity extends AppCompatActivity
implements GoogleApiClient.OnConnectionFailedListener {
public static final int SIGN_IN_CODE = 2;
private GoogleApiClient googleApi;
SignInButton signInButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
GoogleSignInOptions gso = new GoogleSignInOptions
.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
googleApi = new GoogleApiClient.Builder(this)
.enableAutoManage(this,this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
signInButton = findViewById(R.id.signinbutton);
signInButton.setOnClickListener(view -> {
Intent intent = Auth.GoogleSignInApi
.getSignInIntent(googleApi);
startActivityForResult(intent, SIGN_IN_CODE);
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == SIGN_IN_CODE){
GoogleSignInResult result = Auth.GoogleSignInApi
.getSignInResultFromIntent(data);
HandleSignInResult(result);
}
}
private void HandleSignInResult(GoogleSignInResult result) {
if(result.isSuccess()){
GoHome();
}
}
private void GoHome(){
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
El Archivo activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LoginActivity">
<com.google.android.gms.common.SignInButton
android:id="@+id/signinbutton"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
El archivo MainActivity:
package app.myapp.preubaloginaapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
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.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;
public class MainActivity extends AppCompatActivity implements
GoogleApiClient.OnConnectionFailedListener {
ImageView imagen_usuario;
TextView nombre_usuario, correo_usuario, id_usuario;
Button logout, revoke;
private GoogleApiClient googleApi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imagen_usuario = findViewById(R.id.imagen_usuario);
nombre_usuario = findViewById(R.id.nombre_usuario);
correo_usuario = findViewById(R.id.correo_usuario);
id_usuario = findViewById(R.id.id_usuario);
logout = findViewById(R.id.logout);
revoke = findViewById(R.id.revoke);
logout.setOnClickListener(view -> Logout());
revoke.setOnClickListener(view -> Revoke());
GoogleSignInOptions gso = new GoogleSignInOptions
.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
googleApi = new GoogleApiClient.Builder(this)
.enableAutoManage(this,this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}
@Override
protected void onStart() {
super.onStart();
OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi
.silentSignIn(googleApi);
if(opr.isDone()){
GoogleSignInResult gsr = opr.get();
HandleSignResult(gsr);
}else{
opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(@NonNull GoogleSignInResult googleSignInResult) {
HandleSignResult(googleSignInResult);
}
});
}
}
private void HandleSignResult(GoogleSignInResult gsr) {
if(gsr.isSuccess()){
GoogleSignInAccount account = gsr.getSignInAccount();
assert account != null;
nombre_usuario.setText(account.getDisplayName());
correo_usuario.setText(account.getEmail());
id_usuario.setText(account.getId());
Glide.with(this).load(account.getPhotoUrl()).into(imagen_usuario);
}else{
GoLoginScreen();
}
}
private void GoLoginScreen(){
Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
private void Logout(){
Auth.GoogleSignInApi.signOut(googleApi).setResultCallback(status -> {
if(status.isSuccess()){
GoLoginScreen();
}else{
Toast.makeText(getApplicationContext(),
"Error al cerrar sesión", Toast.LENGTH_SHORT).show();
}
});
}
private void Revoke(){
Auth.GoogleSignInApi.revokeAccess(googleApi).setResultCallback(status -> {
if(status.isSuccess()){
GoLoginScreen();
}else{
Toast.makeText(getApplicationContext(),
"Error al revocar sesión", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onConnectionFailed(@NonNull
ConnectionResult connectionResult) {
}
}
El archivo activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imagen_usuario"
android:layout_width="100dp"
android:layout_height="100dp"/>
<TextView
android:textStyle="bold"
android:textSize="18sp"
android:id="@+id/nombre_usuario"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name" />
<TextView
android:textSize="16sp"
android:id="@+id/correo_usuario"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name" />
<TextView
android:textSize="12sp"
android:id="@+id/id_usuario"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name" />
</LinearLayout>
<Button
android:id="@+id/logout"
android:textColor="#c54f43"
android:text="Logout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.AppCompat.Button.Borderless.Colored"/>
<Button
android:id="@+id/revoke"
android:textColor="@color/black"
android:text="Revoke"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
