Setmana 5 (18/5 - 24/5) - UD7 API REST II i UD8 Firebase I¶
Introducció¶
Durant aquesta setmana es treballaran dues eines molt habituals en el desenvolupament d'aplicacions Android: les peticions POST amb Retrofit i la configuració inicial de Firebase. L'objectiu és que l'alumnat sigui capaç d'enviar dades a un servidor, interpretar la resposta rebuda i entendre com es prepara una aplicació per utilitzar serveis de Firebase com Authentication.
Aquest dossier està organitzat per dies i combina teoria, exemples en Java i exercicis. El material està pensat perquè es pugui seguir de manera autònoma, amb explicacions progressives i vocabulari tècnic explicat dins el context.
Objectius d'aprenentatge¶
En acabar aquesta setmana, s'hauria de ser capaç de:
- Explicar què és una API REST i quin paper té una petició POST dins una aplicació client-servidor.
- Crear una petició POST amb Retrofit en una aplicació Android escrita en Java.
- Diferenciar una resposta HTTP correcta d'un error de xarxa o d'un error retornat pel servidor.
- Configurar un projecte Firebase i integrar-lo a Android Studio amb el fitxer
google-services.json. - Entendre el concepte d'autenticació d'usuaris i el funcionament bàsic de Firebase Authentication en Android.
- Enviar dades JSON al servidor amb
@POSTi@Body - Gestionar respostes HTTP (2xx, 4xx, 5xx) i errors de xarxa
- Registrar el tràfic de xarxa per depuració
- Entendre com Retrofit gestiona fils (threading) a Android
Conceptes clau¶
| Concepte | Explicació |
|---|---|
@POST("ruta") |
Indica a Retrofit que ha de fer una petició HTTP POST a la URL base + aquesta ruta. |
@Body Object |
Serialitza automàticament un objecte Java a JSON usant Gson. |
Call<T> |
Representa una petició HTTP que encara no s'ha executat. Per executar-la s'ha d'usar .enqueue() (asíncron) o .execute() (síncron, mai al fil principal). |
Callback<T> |
Interfície amb dos mètodes: onResponse() (èxit HTTP) i onFailure() (error de xarxa/connexió). |
Response<T> |
Conté isSuccessful(), code(), body() i errorBody(). Permet diferenciar errors del servidor de la resposta JSON. |
HttpLoggingInterceptor |
Eina d'OkHttp que imprimeix a Logcat les capçaleres, cos de la petició i resposta. Imprescindible per depurar. |
Vocabulari bàsic¶
| Terme | Explicació |
|---|---|
| API REST | Servei web que permet la comunicació entre un client i un servidor mitjançant HTTP. |
| POST | Mètode HTTP utilitzat per enviar dades al servidor, sovint per crear recursos nous o processar informació. |
| Retrofit | Biblioteca per Android que simplifica el consum d'APIs REST i la conversió de dades. |
| JSON | Format de text molt utilitzat per representar dades enviades i rebudes entre client i servidor. |
| Firebase | Plataforma de Google que ofereix serveis backend per a aplicacions, incloent autenticació i configuració de projectes mòbils. |
google-services.json |
Fitxer de configuració que connecta una app Android amb el seu projecte Firebase. |
| Authentication | Procés per verificar la identitat d'un usuari quan inicia sessió. |
Dia 1 — Sessió 1 (2 h)¶
Teoria: enviament de dades amb POST i Retrofit¶
Quan una aplicació necessita enviar informació a un servidor, una de les opcions més habituals és utilitzar una petició HTTP de tipus POST. Aquest tipus de petició s'utilitza quan el client ha d'enviar dades que el servidor ha de guardar, processar o validar, com ara formularis, registres d'usuaris o comentaris.
En una aplicació Android, Retrofit facilita aquesta comunicació perquè permet descriure els endpoints d'una API mitjançant interfícies Java amb anotacions com @POST. Això evita haver d'escriure manualment gran part de la lògica de connexió i ajuda a mantenir el codi ordenat i llegible.
Una petició POST amb Retrofit sol implicar tres peces principals:
- Una classe model que representa les dades que s'enviaran.
- Una interfície que descriu l'endpoint i el tipus de petició.
- Una crida des de l'activitat o fragment per enviar les dades i tractar la resposta.
Què passa quan s'envia una petició¶
El flux habitual és aquest:
- L'usuari introdueix dades en un formulari.
- L'aplicació crea un objecte Java amb aquestes dades.
- Retrofit transforma aquest objecte en una petició HTTP, normalment en format JSON.
- El servidor rep la informació i retorna una resposta.
- L'aplicació interpreta si la resposta és correcta o si s'ha produït algun error.
Diferència entre error HTTP i error de xarxa¶
Aquesta distinció és clau. Si el servidor respon amb un codi com 400, 401, 404 o 500, hi ha hagut comunicació amb el servidor però aquest ha rebutjat o no ha pogut processar correctament la petició. En canvi, si s'executa onFailure(), normalment es tracta d'un problema de connexió, DNS, timeout o indisponibilitat tècnica abans d'obtenir una resposta HTTP vàlida.
Exemple guiat¶
1. Classe model¶
public class Usuari {
private String nom;
private String correu;
public Usuari(String nom, String correu) {
this.nom = nom;
this.correu = correu;
}
public String getNom() {
return nom;
}
public String getCorreu() {
return correu;
}
}
Aquesta classe representa les dades que s'enviaran al servidor. Quan l'usuari escriu el seu nom i correu, l'aplicació pot crear un objecte Usuari amb aquesta informació.
2. Interfície Retrofit¶
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;
public interface ApiService {
@POST("usuaris")
Call<RespostaUsuari> crearUsuari(@Body Usuari usuari);
}
La línia @POST("usuaris") indica que la petició s'enviarà a l'endpoint usuaris. L'anotació @Body indica que l'objecte Usuari s'inclourà dins el cos de la petició.
3. Enviament de la petició¶
Usuari usuari = new Usuari("Anna", "anna@mail.com");
apiService.crearUsuari(usuari).enqueue(new Callback<RespostaUsuari>() {
@Override
public void onResponse(Call<RespostaUsuari> call, Response<RespostaUsuari> response) {
if (response.isSuccessful()) {
RespostaUsuari resultat = response.body();
// Tractament de l'èxit
} else {
int codi = response.code();
// Tractament d'error HTTP
}
}
@Override
public void onFailure(Call<RespostaUsuari> call, Throwable t) {
// Tractament d'error de xarxa
}
});
Aquest codi fa una crida asíncrona, és a dir, no bloqueja la interfície mentre espera la resposta. Això és especialment important en Android perquè les operacions de xarxa no s'han de fer al fil principal de la interfície.
Exercicis¶
Preparació prèvia: crea un projecte Android nou i prepara la configuració bàsica per poder enviar peticions POST amb Retrofit. Assegura't de tenir les dependències correctes i de configurar el plugin de Google Services per a la integració amb Firebase que es farà més endavant.
Configuració del projecte¶
- Android Studio: Versió 2023.2.1 o superior.
- Min SDK:
24(Android 7.0). - Permisos (
app/src/main/AndroidManifest.xml):<uses-permission android:name="android.permission.INTERNET" /> - Dependències (
app/build.gradle):
plugins {
alias(libs.plugins.android.application)
}
android {
namespace 'docencia.xaviersastre.dam.pmm.setmana51'
compileSdk 36
defaultConfig {
applicationId "docencia.xaviersastre.dam.pmm.setmana51"
minSdk 24
targetSdk 36
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
}
dependencies {
implementation libs.appcompat
implementation libs.material
implementation libs.activity
implementation libs.constraintlayout
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
// Retrofit + Gson + OkHttp
implementation 'com.squareup.retrofit2:retrofit:2.11.0'
implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
// Firebase BoM (gestiona versions automàticament)
implementation platform('com.google.firebase:firebase-bom:33.1.0')
implementation 'com.google.firebase:firebase-auth'
implementation 'com.google.firebase:firebase-analytics'
}
build.gradle del projecte, no de l'app):
buildscript {
repositories { google(); mavenCentral() }
dependencies {
classpath 'com.google.gms:google-services:4.4.2'
}
}
// Al final del mateix fitxer:
apply plugin: 'com.google.gms.google-services'
Utilitzarem el següent codi com a base:
1. Models de dades (PostRequest.java, PostResponse.java)
public class PostRequest {
private String title;
private String body;
private int userId;
public PostRequest(String title, String body, int userId) {
this.title = title;
this.body = body;
this.userId = userId;
}
// Getters i setters necessaris per Gson
}
public class PostResponse {
private int id;
private String title;
private String body;
private int userId;
// Getters i setters
}
2. Interfície de l'API (ApiService.java)
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.http.Body;
import retrofit2.http.POST;
public interface ApiService {
@POST("posts")
Call<PostResponse> createPost(@Body PostRequest post);
}
3. Client Retrofit (RetrofitClient.java)
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient {
private static final String BASE_URL = "https://jsonplaceholder.typicode.com/";
private static ApiService apiService;
public static ApiService getApiService() {
if (apiService == null) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(logging)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
apiService = retrofit.create(ApiService.class);
}
return apiService;
}
}
4. Ús a l'Activitat (MainActivity.java)
package docencia.xaviersastre.dam.pmm.setmana51;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity {
private EditText etTitle, etBody;
private Button btnSend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final android.view.View root = findViewById(R.id.main);
final int startPadding = root.getPaddingLeft();
final int topPadding = root.getPaddingTop();
final int endPadding = root.getPaddingRight();
final int bottomPadding = root.getPaddingBottom();
ViewCompat.setOnApplyWindowInsetsListener(root, (v, windowInsets) -> {
Insets bars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(startPadding, topPadding + bars.top, endPadding, bottomPadding + bars.bottom);
return windowInsets;
});
etTitle = findViewById(R.id.etTitle);
etBody = findViewById(R.id.etBody);
btnSend = findViewById(R.id.btnSend);
btnSend.setOnClickListener(v -> enviarPost());
}
private void enviarPost() {
String title = etTitle.getText().toString().trim();
String body = etBody.getText().toString().trim();
if (title.isEmpty() || body.isEmpty()) {
Toast.makeText(this, "Omple tots els camps", Toast.LENGTH_SHORT).show();
return;
}
PostRequest request = new PostRequest(title, body, 1);
Call<PostResponse> call = RetrofitClient.getApiService().createPost(request);
call.enqueue(new Callback<PostResponse>() {
@Override
public void onResponse(Call<PostResponse> call, Response<PostResponse> response) {
if (response.isSuccessful() && response.body() != null) {
Toast.makeText(MainActivity.this, "✅ Enviat correctament (ID: " + response.body().getId() + ")", Toast.LENGTH_LONG).show();
} else {
// Error HTTP (4xx, 5xx)
Log.e("RETROFIT", "Codi HTTP: " + response.code());
Toast.makeText(MainActivity.this, "❌ Error del servidor: " + response.code(), Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<PostResponse> call, Throwable t) {
// Error de xarxa, DNS, timeout, sense internet
Log.e("RETROFIT", "Error de xarxa", t);
Toast.makeText(MainActivity.this, "❌ Error de connexió: " + t.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
}
5.activity_main.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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/etTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:hint="Títol"
android:inputType="text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/etBody"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Cos del missatge"
android:inputType="textMultiLine"
android:minLines="3"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etTitle" />
<Button
android:id="@+id/btnSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enviar"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etBody" />
</androidx.constraintlayout.widget.ConstraintLayout>
Exercici pràctic¶
- Crea un layout amb dos
EditText(títol, cos) i unButton(Enviar). - Copia/adepta les classes Java anteriors.
- Executa l'app en un emulador/dispositiu amb internet.
- Fes clic a "Enviar" i verifica:
- Apareix un
Toastverd amb l'ID retornat per JSONPlaceholder. - A Logcat, filtra per
RETROFIToOkHttpi observa la petició/respuesta en JSON. - Desactiva temporalment el WiFi i comprova que salta
onFailure.
- Apareix un
Errors freqüents¶
| Problema | Causa | Solució |
|---|---|---|
NetworkOnMainThreadException |
Usar .execute() en lloc de .enqueue() |
Sempre usa .enqueue() a Android |
IllegalArgumentException: No Retrofit annotation found |
Falta @Body, @POST, o tipus de retorn incorrecte |
Revisa que el mètode retorna Call<T> i té @POST |
Resposta 400 o 422 |
El servidor espera un camp que no estàs enviant | Revisa la documentació de l'API o el HttpLoggingInterceptor |
| No es mostra el Toast | El callback s'executa en un thread secundari (en versions antigues) | Retrofit per defecte retorna al main thread a Android. Si fas servir execute(), usa runOnUiThread() |
Exercici 1¶
Explica amb paraules teves la diferència entre una petició GET i una petició POST. Inclou un exemple realista d'ús per a cada cas.
Exercici 2¶
Crea una classe Producte amb els atributs nom, preu i categoria. Després escriu la interfície Retrofit necessària per enviar aquest objecte a un endpoint productes amb una petició POST.
Exercici 3¶
Observa aquest fragment de codi i respon:
if (response.isSuccessful()) {
// ...
} else {
// ...
}
- Què vol dir que la resposta sigui satisfactòria?
- En quin bloc tractaries un error 404?
- En quin mètode tractaries un problema de connexió Wi‑Fi?
Exercici 4¶
Afegeix una validació prèvia perquè el nom i el correu no estiguin buits abans d'enviar la petició. Explica per què és important validar abans d'enviar dades al servidor.
Dia 2 — Sessió 2 (2 h)¶
Teoria: introducció a Firebase i configuració del projecte¶
Firebase és una plataforma de Google que ofereix serveis backend preparats per integrar-se amb aplicacions Android, incloent autenticació, bases de dades i altres funcionalitats habituals. Perquè una aplicació Android pugui utilitzar Firebase, primer s'ha de registrar a la consola i afegir la configuració corresponent al projecte.
El pas més visible d'aquesta integració és descarregar el fitxer google-services.json i col·locar-lo dins la carpeta app del projecte Android. Aquest fitxer conté la configuració que permet que l'aplicació es connecti amb el projecte Firebase correcte.
Per què és necessari google-services.json¶
Aquest fitxer identifica l'aplicació i la vincula amb el projecte creat a Firebase. Si el fitxer no correspon amb el paquet de l'aplicació o no es col·loca a la ubicació correcta, la integració pot fallar.
Procés general de configuració¶
- Crear un projecte a la consola de Firebase.
- Afegir una aplicació Android dins aquest projecte.
- Indicar el nom del paquet de l'app.
- Descarregar
google-services.json. - Copiar el fitxer dins la carpeta
app. - Afegir el plugin de Google Services i sincronitzar Gradle.
Configuració habitual de Gradle¶
// build.gradle del projecte
classpath 'com.google.gms:google-services:4.4.2'
// build.gradle del mòdul app
apply plugin: 'com.google.gms.google-services'
Aquesta configuració permet que Android Studio llegeixi el fitxer de serveis de Google i prepari el projecte per usar Firebase.
Conceptes clau¶
| Concepte | Explicació |
|---|---|
| BaaS | Backend-as-a-Service. Firebase ofereix serveis llests (Auth, Firestore, Storage, Analytics) sense configurar servidors propis. |
| Consola Firebase | Portal web (console.firebase.google.com) on es gestionen projectes, apps, regles de seguretat i mètriques. |
google-services.json |
Fitxer de configuració que conté l'ID del projecte, claus d'API i informació del client Android. Ha d'anar a app/, no a l'arrel del projecte. |
Plugin google-services |
Processa el JSON durant la compilació i genera recursos/manifests automàtics. S'aplica al final de app/build.gradle. |
| SHA-1 | Impressió digital de la clau de signatura. Necessària per a alguns serveis (Google Sign-In, Dynamic Links). Per a develop/debug, Android Studio ja en genera una automàticament. |
Passos pràctics (Seguir exactament)¶
-
Crear projecte:
- Ves a https://console.firebase.google.com
- Fes clic a
+ Afegeix un projecte→ Nom:UF5_FirebaseDemo→ Accepta termes → Continua → Desactiva Google Analytics (per simplificar) → Crea projecte.
-
Registrar app Android:
- Dins del projecte, fes clic a l'icona 🤖 Android.
- Nom del paquet: El mateix que té el teu
app/build.gradle(applicationId "com.elteu.paquet.firebase"). - Deixa en blanc el nom i SHA-1 (pots afegir-lo després si cal). Fes clic a
Registra l'app.
-
Descarregar configuració:
- Fes clic a
Descarrega google-services.json. - Mou el fitxer a:
app/google-services.json(dins la carpetaapp/, no a l'arrel). - Fes clic a
Següent→Següent→Continua fins a la consola.
- Fes clic a
-
Sincronitzar i verificar:
- Sincronitza Gradle a Android Studio.
- Afegeix aquest codi a
MainActivity.javadinsonCreate():import com.google.firebase.FirebaseApp; import android.util.Log; // ... FirebaseApp.initializeApp(this); Log.d("FIREBASE_CHECK", "Firebase inicialitzat: " + FirebaseApp.getApps(this).size() + " apps"); - Executa l'app i mira Logcat. Ha d'aparèixer:
Firebase inicialitzat: 1 appsi cap error vermell.
Errors freqüents¶
| Problema | Causa | Solució |
|---|---|---|
Failed to resolve: com.google.gms:google-services |
Versió incorrecta o falta repositori google() |
Assegura't que google() i mavenCentral() estan a buildscript.repositories |
google-services.json not found |
Fitxer a la carpeta equivocada | Ha d'estar a app/google-services.json |
minSdkVersion must be at least 19 |
Versió mínima massa baixa | Posa minSdk 24 a defaultConfig |
Default FirebaseApp is not initialized |
Plugin no aplicat o JSON corrupte | Revisa que apply plugin: 'com.google.gms.google-services' és al final de app/build.gradle |
Exemple guiat¶
Situació pràctica¶
Es vol preparar una aplicació Android buida per utilitzar Firebase Authentication en sessions posteriors. Per fer-ho, primer cal assegurar que el projecte està correctament registrat i que la configuració es carrega sense errors.
Passos detallats¶
- Crear un projecte Android nou amb un package name definitiu.
- Entrar a la consola de Firebase i crear un projecte nou.
- Registrar l'app Android indicant exactament el mateix package name.
- Descarregar
google-services.jsondes de la consola. - Copiar el fitxer a la carpeta
appdel projecte. - Afegir la configuració necessària de Gradle i sincronitzar.
Errors habituals de configuració¶
| Problema | Possibles causes |
|---|---|
| Firebase no es connecta | El package name de l'app no coincideix amb el registrat al projecte Firebase. |
| Error en sincronitzar Gradle | Falta el plugin de Google Services o no s'ha afegit correctament. |
| L'app no troba la configuració | El fitxer google-services.json no està dins la carpeta app. |
Exercicis del dia 2¶
Exercici 1¶
Explica què és Firebase amb una definició de tres o quatre línies. Després escriu dos exemples de serveis que pot oferir a una app Android.
Exercici 2¶
Descriu, pas a pas, el procés per integrar Firebase en un projecte Android Studio. El text ha d'indicar en quin moment es descarrega google-services.json i on s'ha de copiar.
Exercici 3¶
Respon aquestes preguntes:
- Què passaria si el nom del paquet de l'app fos diferent del registrat a Firebase?
- Per què no basta només amb crear el projecte a la consola?
- Quin paper té Gradle en aquesta integració?
Exercici 4¶
Imagina que una companya ha col·locat google-services.json a la carpeta arrel del projecte i no dins app. Escriu una breu explicació de quin és l'error i com s'ha de corregir.
Dia 3 — Sessió 3 (1 h)¶
Teoria: Firebase Authentication¶
Firebase Authentication és el servei de Firebase que permet identificar usuaris dins una aplicació Android mitjançant diferents mètodes d'inici de sessió, com correu i contrasenya o proveïdors externs. En una primera introducció, l'important és entendre què significa autenticar un usuari i quin és el flux bàsic que segueix l'aplicació.
Autenticar un usuari significa verificar qui és. Això és diferent d'autoritzar accions: primer el sistema comprova la identitat de la persona i després pot decidir quins recursos o funcionalitats li permet utilitzar.
Flux bàsic d'autenticació¶
- L'usuari obre la pantalla de login.
- Introdueix el correu i la contrasenya.
- L'aplicació envia aquestes credencials a Firebase Authentication.
- Firebase comprova si l'usuari existeix i si les dades són correctes.
- Si tot va bé, el sistema retorna un usuari autenticat.
- L'app pot mostrar una nova pantalla o habilitar funcionalitats privades.
Exemple en Java¶
FirebaseAuth auth = FirebaseAuth.getInstance();
auth.signInWithEmailAndPassword(correu, contrasenya)
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
FirebaseUser usuari = auth.getCurrentUser();
// Login correcte
} else {
String error = task.getException() != null
? task.getException().getMessage()
: "Error d'autenticació";
}
});
Aquest exemple mostra un inici de sessió bàsic amb correu i contrasenya, que és una de les opcions que Firebase Authentication ofereix a Android. El mètode comprova si l'operació s'ha completat correctament i, si és així, permet recuperar l'usuari autenticat actual.
Idees clau per retenir¶
- Firebase Authentication evita haver de crear des de zero tota la lògica bàsica de login.
- El servei pot mantenir informació de l'usuari autenticat dins l'app.
- L'autenticació és una base necessària per a aplicacions amb perfils, dades personals o funcionalitats restringides.
Exercicis del dia 3¶
Exercici 1¶
Defineix amb les teves paraules aquests conceptes:
- autenticació,
- usuari autenticat,
- sessió,
- error d'inici de sessió.
Exercici 2¶
Explica el flux d'inici de sessió d'una app amb Firebase Authentication en sis passos ordenats.
Exercici 3¶
Observa el codi següent i respon:
if (task.isSuccessful()) {
FirebaseUser usuari = auth.getCurrentUser();
}
- Què significa
task.isSuccessful()? - Per què és útil
getCurrentUser()? - Què hauria de fer l'app si l'autenticació falla?
Activitat final de la setmana¶
Redacta una mini pràctica on es descrigui una aplicació Android que:
- recull un nom i un correu en un formulari,
- envia les dades amb una petició POST,
- està connectada a Firebase,
- i incorpora un sistema bàsic d'autenticació.
La pràctica ha d'incloure una explicació del flux general i un petit fragment de codi per a cada part.
Criteris d'autoavaluació¶
Marca cada punt com a “sí”, “encara no” o “necessit repassar-lo”.
| Ítem | Autoavaluació |
|---|---|
| Entenc per a què serveix una petició POST. | |
| Sé crear una classe model senzilla en Java. | |
Sé interpretar response.isSuccessful() i distingir-lo d'un error de xarxa. |
|
Sé què és google-services.json i on s'ha de col·locar. |
|
| Entenc què és Firebase Authentication. | |
| Puc explicar el flux bàsic d'un login. |
Orientacions d'estudi¶
Per estudiar bé aquesta setmana convé seguir aquest ordre:
- Repassar la diferència entre client, servidor, API i HTTP.
- Entendre la lògica d'una petició POST abans de memoritzar el codi.
- Revisar la configuració de Firebase com un procés ordenat i no com una simple llista de passos.
- Relacionar l'autenticació amb casos reals d'apps que ja es coneixen, com xarxes socials, botigues o apps escolars.
Tancament¶
Aquesta setmana connecta dues idees importants del desenvolupament mòbil: la comunicació amb serveis externs i la gestió d'usuaris. Dominar aquestes bases permetrà avançar després cap a aplicacions més completes, amb persistència de dades i funcionalitats personalitzades segons l'usuari autenticat.
