Mi primer proyecto de app (Desarrollo android studio)

0nLy

Hola! Es de las primeras veces que me paso por este subforo a pedir una ayudita, os comento rápidamente.
Estoy acabando el grado superior de DAM, y tengo que hacer un proyecto de final de grado (tengo casi 4 meses para hacerlo).

Al tema, he pensado en hacer una app para Android, a grandes rasgos es una app para salir de fiesta por mi pueblo y alrededores.
Básicamente quiero que se logeen/registren usuarios, con su foto, nombre, poblacion, etc (lo típico) y haya varias pestañas con perfil, historia y demás. (es una idea muy vaga que tampoco tengo muchas esperazas en que salga adelante pero bueno, para proyecto final me gustaría hacer algo así, así voy pillando el tema.

Pues me puse ayer a hacer el tema del login y del registro, decir que no tengo mucha idea (llevamos 4-5 meses dando android y la profesora ha sido un poco negada en exigirnos cosas), el caso es que para hacer el login y registro con lo que sé de BBDD y demás he pensado en que la gente se registre, y los datos que pido (usuario, nombre, apellidos, fecha nacimiento, email y poblacion) se guarden en una base de datos MYSQL (ahora mismo estoy trabajando en local con XAMPP), y cuando quieran loguearse después de hacer la cuenta recorrer los usuarios en la base de datos y mirar si el Password coincide con el usuario que han puesto. (Todo esto en teoría, no tengo ni puta idea si hay una forma mejor y más eficiente de gestionar las cuentas de usuario de programas).

He conseguido hacerlo usando la librería Volley, pido datos, el usuario los pone y le da a un botón de aceptar y se guardan en la base de datos, pero claro, yo siendo el admin puedo ver todo el tema de contraseñas de los usuarios y demás, y lo veo un poco engorro para lo que quiero (básicamente loguearte con cuentas y crearlas).
Os dejo el código que he visto por internet para hacerlo, por si os sirve de algo:

Método insertar en Android Studio:

spoiler

PHP para procesar el insert:

spoiler

Alguien puede iluminarme y decirme si lo estoy haciendo bien o si existe algún tipo de gestor de cuentas para apps de android y tal?
Recalco que soy totalmente nub en este tema, pero no quiero hacer un puto churro de proyecto final y me encantaría aprender a hacer cosas en línea y demás.

Me gustaría tambien dejar este tema abierto para más adelante si me surgen más dudas poder preguntaros y ver si me las podeis resolver.
Muchas gracias! ^^

s4suk3

#1 Yo que tú me hacía una cuenta en Firebase y te ahorras el 60% del trabajo, que seguro que tendrá fallos de seguridad por todos lados.
Con esto tienes login, backend, y mucho andando en la conexión con este.

Ejemplos: https://firebase.google.com/docs/samples/

2 respuestas
B

#1 Te recomendaria usar algun framework para el backend si vas a estar haciendo peticiones HTTP, (yo en su dia hice un proyecto para el grado superior android con un backend php como tu, eran scripts php que se les pasaban parametros como tu y listo), después de acabar el grado superior y ver alternativas, me di cuenta que hay frameworks y demás que te ahorran trabajo y además suelen tener una estructura para el codigo bastante organizada. (Si lo haces a pelo como lo estas haciendo, deberás controlar como mínimo SQL Injection).

0nLy

#2 Ostias, estoy mirando el Firebase y es una burrada la cantidad de cosas que tiene, llevo como 2 horas leyendo y me está entrando un subidón brutal XD

Eso si, perdidísimo estoy, a ver si puedo sacar algo decente de aquí a unos días xD

Muchas gracias por descubrirme esto!

0nLy

Hola! después de varios días peleandome a muerte con FireBase como me dijo #2, POR FIN he conseguido hacer un formulario de registro y otro para loguearse. Como curiosidad decir que me fallaba el emulador del android studio y me dio por probar mi movil conectado al PC y bum! funcionó.

Bueno, el caso es que estoy bloqueado en el siguiente punto, que sería almacenar más datos de un usuario (Ahora mismo solo me guarda en el firebase email y contraseña). Y esos datos llevarlos a otra pagina para mostrarlos.

Y otra cosa es, como paso un usuario a través del putExtra del Intent? puedo pasar sus datos sencillos, pero no sé como pasar el user entero a la otra actividad para mostrar ahí los datos que me interesen. Os dejo el código por si acaso:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                        if (user != null) {
                            
Intent i = new Intent(MainActivity.this,datosUsuario.class); i.putExtra("email",user.getEmail()); i.putExtra("uid",user.getUid()); startActivity(i); }else{ Toast.makeText(MainActivity.this, "El user es nulo", Toast.LENGTH_SHORT).show(); }

Pues si pudierais echarme una mano con eso y almacenar más datos de los usuarios (como nombre, dirección, y demás) por ahora me valdría.

pd: muchas gracias again #2 por descubrirme el firebase^^

4 respuestas
B

#5 Mira, hace mucho que no toco android, pero lo que tienes que hacer que tu clase de Java implemente la interfaz Parcelable, por lo menos hace tiempo era asi...

https://developer.android.com/reference/android/os/Parcelable.html
http://stackoverflow.com/questions/7181526/how-can-i-make-my-custom-objects-parcelable

Te dejo un ejemplo mio propio de hace tiempo.

package com.alvaromerino.tracker.app.data;

import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;

public abstract class Track implements Parcelable {

protected String unique_id, created_at;
protected Bitmap photo;
public static final String TRACK_TAG = "track";
public static final String TRACKLIST_TAG = "tracklist";

protected Track(String unique_id, String created_at) {
    this.unique_id = unique_id;
    this.created_at = created_at;
}

protected Track(String unique_id, String created_at, Bitmap photo) {
    this.unique_id = unique_id;
    this.created_at = created_at;
    this.photo = photo;
}

protected Track() {
}

public String getUnique_id() {
    return unique_id;
}

public void setUnique_id(String unique_id) {
    this.unique_id = unique_id;
}

public String getCreated_at() {
    return created_at;
}

public void setCreated_at(String created_at) {
    this.created_at = created_at;
}

public Bitmap getPhoto() {
    return photo;
}

public void setPhoto(Bitmap photo) {
    this.photo = photo;
}

public static String getTrackTag() {
    return TRACK_TAG;
}

public static String getTracklistTag() {
    return TRACKLIST_TAG;
}

@Override
public String toString() {
    return "Track{" +
            "unique_id='" + unique_id + '\'' +
            ", created_at='" + created_at + '\'' +
            ", photo='" + photo + '\'' +
            '}';
}

/** PARCELABLE **/

public void writeToParcel(Parcel out, int flags) {
    out.writeString(unique_id);
    out.writeString(created_at);
    out.writeValue(photo);
}

protected Track(Parcel in) {
    unique_id = in.readString();
    created_at = in.readString();
    photo = in.readParcelable(Bitmap.class.getClassLoader());
}

}
B

#5 Por cierto que estas usando en el backend al final, lenguaje?

s4suk3

#5 evita mandar objetos grandes en intents, ya sea serializable o parcelable, seguro que firebase tiene una función del tipo FireAuth.getCurrentUser() que te da los datos ya "cacheados" en cualquier lugar de tu app
en los intents solo se debería de pasar un id para hacer una nueva consulta en el siguiente activity

buscando un poco encontré lo que te comentaba:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // Name, email address, and profile photo Url
    String name = user.getDisplayName();
    String email = user.getEmail();
    Uri photoUrl = user.getPhotoUrl();

// The user's ID, unique to the Firebase project. Do NOT use this value to
// authenticate with your backend server, if you have one. Use
// FirebaseUser.getToken() instead.
String uid = user.getUid();
}

https://firebase.google.com/docs/auth/android/manage-users#get_the_currently_signed-in_user

Y para lo de guardar más datos, pues si ya tienes el ID del usuario, puedes crear un pointer con ese objectId a una nueva tabla y ahí guardar datos "relacionados" a ese user id

1 respuesta
B

#8 efectivamente, el paso de información cuanto más ligera, mejor.

varuk

#5 Una sugerencia, para tener un código más ordenado. Es sobre temas de tener la aplicación bien organizada en cuanto a código. No es la solución más perfecta que conozco, yo hago otra incluso, pero creo que es mejor que lo que has hecho.

ara manejar los cambios de actividad, no metas el código ahí a pelo en las Activity. Haz una clase Singleton que tenga los métodos que lanzarás al hacer los cambios de actividad. Te quedará todo más ordenado y localizado en un punto.

public class CambiarDeActividad {
    private static CambiarDeActividad INSTANCE = null;

// Private constructor suppresses 
private CambiarDeActividad(){}

// creador sincronizado para protegerse de posibles problemas  multi-hilo
// otra prueba para evitar instanciación múltiple 
private static void createInstance() {
    if (INSTANCE == null) {
        // Sólo se accede a la zona sincronizada
        // cuando la instancia no está creada
        synchronized(CambiarDeActividad.class) {
            // En la zona sincronizada sería necesario volver
            // a comprobar que no se ha creado la instancia
            if (INSTANCE == null) { 
                INSTANCE = new CambiarDeActividad();
            }
        }
    }
}

public static Singleton getInstance() {
    if (INSTANCE == null) createInstance();
    return INSTANCE;
}


/* Los métodos que te llevarán a otras actividades */
public void datosUsuario(Activity activityOrigen, String usuarioEmail, String usuarioId){
	Intent i = new Intent(activityOrigen, datosUsuario.class);
    i.putExtra("email",usuarioEmail));
    i.putExtra("uid",usuarioId);
	startActivity(i);
}

}

Y ahora llamas desde tu actividad así:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
 if (user != null) 
    CambiarDeActividad.getInstance().datosUsuario(this, user.getEmail(), user.getUid());               
else Toast.makeText(MainActivity.this, "El user es nulo", Toast.LENGTH_SHORT).show();
1 respuesta
0nLy

#10 muchas gracias Lo tendré en cuenta! ^^
Y gracias a todos en general por los consejos.
Ahora tengo esto un poco parado por diversos motivos pero en nada tendré que ponerme a seguir haciendolo así que en breves os volveré a dar el coñazo xDD