الخميس، 16 نوفمبر 2023

Posteado por:
Marcos Admin

Auth con Google en Android Studio

 


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>




السبت، 11 أبريل 2020

Posteado por:
Marcos Admin

SharedPreferences - Guardar, Borrar y Obtener datos



Interfaz para acceder y modificar datos de preferencias devueltos por Context # getSharedPreferences. Para cualquier conjunto particular de preferencias, hay una única instancia de esta clase que comparten todos los clientes. Las modificaciones a las preferencias deben pasar por un objeto Editor para garantizar que los valores de preferencia permanezcan en un estado y control consistentes cuando se comprometan con el almacenamiento. Los objetos que se devuelven de los distintos métodos get deben ser tratados como inmutables por la aplicación. SharedPrerences

Como se explica más arriba, es una interface para acceder y modificar datos de preferencias.

Comencemos declarando SharedPreferences y instanciandolo de la siguiente manera.

SharedPreferences preferences;

@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    setContentView(R.layout.activity_main);
    preferences = getSharedPreferences("config", Context.MODE_PRIVATE); 

}

Guardar Datos en SharedPreferences

Para guardar datos en el SharedPreferences tenemos la opcion del Editor como veremos en el siguiente ejemplo:


SharedPreferences.Editor editor = preferences.edit();

Siguiendo con el Editor procederemos a guardar los datos de la siguiente forma: editor.putString(key, value);

editor.putString("user_id", "15081991");

Luego de asignarle una llave y un valor procedemos a aplicar los cambios con el metodo apply(); de la siguiente forma.

editor.apply();

De esta forma se guardaran los datos en el SharedPreferences.

Obtener datos del SharedPreferences

Para obtener datos del SharedPreferences utilizaremos la funcion getString(key, defaul); de la siguiente forma:

String resp;
resp = preferences.getString("user_id", "0");
//resp = 15081991

Donde key es la llave que declaramos al guardar los datos en el SharedPreferences y el default es un valor por defecto que por si no existen datos en las preferencias.

Borrar datos del SharedPreferences

Para borrar los datos que estan en nuestro shared preferences es muy facil, utilizando el metodo remove(key);

SharedPreferences.Editor editor = preferences.edit();
editor.remove("user_id").apply();


Solo tendriamos que ubicar el nombre de la linea a borrar y aplicamos!.

Con esto concluyo esta entrada, espero que te sirva y que puedas utilizar este codigo en tus proyectos futuros me despido, Marcos



Fuente: https://developer.android.com/reference/android/content/SharedPreferences

قراءة المزيد

عرض الكل
لم يتم العثور على أي نتائج

الخميس، 16 نوفمبر 2023


السبت، 11 أبريل 2020