web-dev-qa-db-fra.com

Exemple et explication: Android (Studio) Login Activity Template généré activité

Je voulais implémenter un formulaire de connexion dans mon application, j'ai donc essayé d'utiliser le code généré par le Android Studio Wizard pour une nouvelle activité de type Formulaire de connexion) Je pense que le code généré par Eclipse est presque le même.

Malheureusement, le code généré n'a pas fourni le résultat attendu: j'ai créé un formulaire de connexion simple et agréable, mais avec un mot de passe correct ou incorrect, il ne se déplace pas du formulaire de connexion.

J'ai également remarqué qu'aucun formulaire "S'inscrire" n'a été créé.

Après avoir regardé un peu et analysé le code, j'ai finalement réussi à le faire fonctionner :)

Voir ma réponse ci-dessous.

20
Cedric Simon

Étape 1: réussir la connexion et passer à l'activité principale

Pour que l'activité de connexion échoue en cas d'utilisation d'un mauvais utilisateur/mot de passe et passe à l'activité principale en cas de succès, vous devez apporter les corrections suivantes au code généré:

AndroidManifest.xml:

Déplacez le code suivant de votre activité principale vers la section LoginActivity:

<intent-filter>
    <action Android:name="Android.intent.action.MAIN" />
    <category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>

Modifiez ensuite le LoginActivity.Java Et effectuez les modifications suivantes:

Dans la méthode doInBackground, à la fin, remplacez la valeur retournée de true par false

@Override
protected Boolean doInBackground(Void... params) {
    for (String credential : DUMMY_CREDENTIALS) {
        String[] pieces = credential.split(":");
        if (pieces[0].equals(mEmail)) {
             // Account exists, return true if the password matches.
             return pieces[1].equals(mPassword);
        }
    }
        // TODO: register the new account here.
    return false;
}

Ensuite, sur la méthode onPostExecute, ajoutez une nouvelle intention après la finish();:

@Override
protected void onPostExecute(final Boolean success) {
    mAuthTask = null;
    showProgress(false);
    if (success) {
        finish();
        Intent myIntent = new Intent(LoginActivity.this,MyMainActivity.class);
        LoginActivity.this.startActivity(myIntent);
    } else {
        mPasswordView.setError(getString(R.string.error_incorrect_password));
        mPasswordView.requestFocus();
    }
}

La connexion doit maintenant réussir avec l'une des informations d'identification user:password Suivantes:

Un autre essai de user:password Devrait indiquer un mot de passe incorrect et rester sur la page de connexion.

Étape 2: autoriser l'enregistrement, stocker la connexion dans la base de données et vérifier les informations d'identification par rapport à la base de données

Nous allons maintenant obtenir les informations de connexion de la base de données (SQLite) au lieu de la variable statique. Cela nous permettra d'avoir plus d'un utilisateur enregistré sur l'appareil.

Créez d'abord une nouvelle classe User.Java:

package com.clinsis.onlineresults.utils;

/**
 * Created by csimon on 5/03/14.
 */
public class User {
    public long userId;
    public String username;
    public String password;

    public User(long userId, String username, String password){
        this.userId=userId;
        this.username=username;
        this.password=password;
    }

}

Ensuite, créez ou mettez à jour votre classe d'aide SQLite (DBTools.Java Dans mon cas):

package com.clinsis.onlineresults.utils;

import Android.content.ContentValues;
import Android.content.Context;
import Android.database.Cursor;
import Android.database.sqlite.SQLiteDatabase;
import Android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by csimon on 12/11/13.
 */
public class DBTools extends SQLiteOpenHelper {

    private final static int    DB_VERSION = 10;

    public DBTools(Context context) {
        super(context, "myApp.db", null,DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String query = "create table logins (userId Integer primary key autoincrement, "+
                          " username text, password text)";
                  sqLiteDatabase.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
          try{
              System.out.println("UPGRADE DB oldVersion="+oldVersion+" - newVersion="+newVersion);
              onCreate(sqLiteDatabase);
              if (oldVersion<10){
                  String query = "create table logins (userId Integer primary key autoincrement, "+
                          " username text, password text)";
                  sqLiteDatabase.execSQL(query);
              }
            }
        catch (Exception e){e.printStackTrace();}
    }

    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       // super.onDowngrade(db, oldVersion, newVersion);
        System.out.println("DOWNGRADE DB oldVersion="+oldVersion+" - newVersion="+newVersion);
    }

    public User insertUser (User queryValues){
        SQLiteDatabase database = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("username", queryValues.username);
        values.put("password", queryValues.password);
        queryValues.userId=database.insert("logins", null, values);
        database.close();
        return queryValues;
    }

    public int updateUserPassword (User queryValues){
        SQLiteDatabase database = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("username", queryValues.username);
        values.put("password", queryValues.password);
        queryValues.userId=database.insert("logins", null, values);
        database.close();
        return database.update("logins", values, "userId = ?", new String[] {String.valueOf(queryValues.userId)});
    }

    public User getUser (String username){
        String query = "Select userId, password from logins where username ='"+username+"'";
        User myUser = new User(0,username,"");
        SQLiteDatabase database = this.getReadableDatabase();
        Cursor cursor = database.rawQuery(query, null);
        if (cursor.moveToFirst()){
            do {
                myUser.userId=cursor.getLong(0);
                myUser.password=cursor.getString(1);
            } while (cursor.moveToNext());
        }
        return myUser;
    }
}

Remarque: DB_VERSION Est utilisé pour détecter la mise à niveau/rétrogradation du schéma DB;)

Modifiez ensuite LoginActivity.Java comme suit:

Ajoutez les importations suivantes:

import Android.widget.Toast;
import com.clinsis.onlineresults.utils.DBTools;
import com.clinsis.onlineresults.utils.User;

Ajoutez une nouvelle variable:

private User myUser;

Supprimez la déclaration de variable DUMMY_CREDENTIALS.

Dans la méthode attemptLogin, ajoutez du contexte lors de l'appel de UserLoginTask:

mAuthTask = new UserLoginTask(email, password, this);

Remplacez la classe UserLoginTask interne par le code suivant:

/**
     * Represents an asynchronous login/registration task used to authenticate
     * the user.
     */
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {

    private final String mEmail;
    private final String mPassword;
    private final Context mContext;

    UserLoginTask(String email, String password, Context context) {
        mEmail = email;
        mPassword = password;
        mContext= context;
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        DBTools dbTools=null;
        try{
            dbTools = new DBTools(mContext);
            myUser = dbTools.getUser(mEmail);

            if (myUser.userId>0) {
                // Account exists, check password.
                if (myUser.password.equals(mPassword))
                    return true;
                else
                    return false;
            } else {
                myUser.password=mPassword;
                return true;
        }
        } finally{
            if (dbTools!=null)
                dbTools.close();
        }
        // return false if no previous checks are true
        return false;
    }

    @Override
    protected void onPostExecute(final Boolean success) {
        mAuthTask = null;
        showProgress(false);

        if (success) {
            if (myUser.userId>0){
                finish();
                Intent myIntent = new Intent(LoginActivity.this,ReportListActivity.class);
                LoginActivity.this.startActivity(myIntent);
            } else {
                DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which){
                            case DialogInterface.BUTTON_POSITIVE:
                                DBTools dbTools=null;
                                try{
                                    finish();
                                    dbTools = new DBTools(mContext);
                                    myUser=dbTools.insertUser(myUser);
                                    Toast myToast = Toast.makeText(mContext,R.string.updatingReport, Toast.LENGTH_SHORT);
                                    myToast.show();
                                    Intent myIntent = new Intent(LoginActivity.this,ReportListActivity.class);
                                    LoginActivity.this.startActivity(myIntent);
                                } finally{
                                    if (dbTools!=null)
                                        dbTools.close();
                                }
                                break;

                            case DialogInterface.BUTTON_NEGATIVE:
                                mPasswordView.setError(getString(R.string.error_incorrect_password));
                                mPasswordView.requestFocus();
                                break;
                        }
                    }
                };

                AlertDialog.Builder builder = new AlertDialog.Builder(this.mContext);
                builder.setMessage(R.string.confirm_registry).setPositiveButton(R.string.yes, dialogClickListener)
                        .setNegativeButton(R.string.no, dialogClickListener).show();
            }
        } else {
            mPasswordView.setError(getString(R.string.error_incorrect_password));
            mPasswordView.requestFocus();
        }
    }

    @Override
    protected void onCancelled() {
        mAuthTask = null;
        showProgress(false);
    }
}

Dans strings.xml, Ajoutez:

<string name="confirm_registry">Email not found. You want to create a new user with that email and password?</string>
<string name="yes">Yes</string>
<string name="no">No</string>

J'espère que je n'ai rien oublié ... Ça a bien fonctionné pour moi: D

Si le courrier électronique n'est pas présent dans la base de données, il proposera de l'enregistrer, sinon il vérifiera le courrier électronique par rapport au mot de passe.

Amusez-vous avec Android: D

43
Cedric Simon