Utilisation de SharedPreferences : andoid partage de session

Résolu
Silver - 13 déc. 2018 à 13:09
 Silver - 14 déc. 2018 à 22:23
Bonjour,
Je suis sur un projet qui me demande de partager des données d'une activity avec une autre activity. J'ai utilisé une base de données SQLite, mais, ça n'a pas résout mon problème. J'ai pensé maintenant utiliser quelque chose du genre comme on le fait en PHP
$_SESSION['variable']
. Après mes recherche dans Google, je suis tombé sur < SharedPreferences >. J'ai essayé ça aussi, mais, c'est comme les données ne se transmettent pas d'une activity à une autre.
Bref, voici comment je veux mon code marche:
Une fois l'utilisateur valide le formulaire, les information sont enregistrées en premier dans une base de données SQLite et en second, en session < SharedPreferences >.
L'enregistrement dans la base de données marche très bien, sauf, la session < SharedPreferences > qui ne marche pas. Puis que je reçois rien de < SharedPreferences > dans une autre activity.

Voici mon code :


> Mon activity de connexion :

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.text.SimpleDateFormat;
import java.util.Date;




public class Identification extends Activity implements View.OnClickListener {

    EditText nom_prenom, telephone, mot_de_passe;
    Button envoyer;
    String moment_actuel, id_cle;
    public String val_nom_prenom, val_telephone, val_mot_de_passe;
    SQLiteDatabase bd_foto;
    Cursor c1;
    SharedPreferences shared;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_identification);

        shared = getSharedPreferences("maSession", Context.MODE_PRIVATE);

        telephone = (EditText) findViewById(R.id.telephone);
        mot_de_passe = (EditText) findViewById(R.id.mot_de_passe);
        nom_prenom = (EditText) findViewById(R.id.nom_prenom);

        if(shared.contains("telephone")){
            telephone.setText(String.valueOf(shared.getString("telephone", null)));
        }
        if(shared.contains("mot_de_passe")){
            mot_de_passe.setText(String.valueOf(shared.getString("mot_de_passe", null)));
        }
        if(shared.contains("nom_prenom")){
            nom_prenom.setText(String.valueOf(shared.getString("nom_prenom", null)));
        }

        envoyer = (Button) findViewById(R.id.envoyer);
        envoyer.setOnClickListener(this);


        moment_actuel = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date());
        id_cle = new SimpleDateFormat("ddMMyyyyHHmmss").format(new Date());


        bd_foto = openOrCreateDatabase("foto", Context.MODE_PRIVATE,null);
        bd_foto.execSQL("CREATE TABLE IF NOT EXISTS Compte(cle VARCHAR, nom_prenom VARCHAR, telephone VARCHAR, mot_de_passe VARCHAR, moment_actuel VARCHAR);");

        Cursor c = bd_foto.rawQuery("SELECT * FROM Compte ORDER BY moment_actuel DESC", null);
        while (c.moveToNext()) {
            String user_nom_prenom = c.getString(1);
            String user_telephone = c.getString(2);
            String user_pass = c.getString(3);
            if (user_nom_prenom != "" && user_telephone != "" && user_pass != "") {
                //**********************************************
                Intent intent_accueil = new Intent(Identification.this, Bienvenu.class);
                startActivity(intent_accueil);
                //Toast.makeText(Identification.this, "Vous êtes bien connectés", Toast.LENGTH_LONG).show();
            }
            else {
                Intent intent_accueil = new Intent(Identification.this, Identification.class);
                startActivity(intent_accueil);
                Toast.makeText(Identification.this, "Vous devez créer un compte pour continuer", Toast.LENGTH_LONG).show();
            }
        }
        c.close();
    }
    public void onClick(View view) {
        if (view == envoyer) {
            if (
                    (nom_prenom.getText().toString().trim().length() <= 5) &&
                            (telephone.getText().toString().trim().length() != 8) &&
                            (mot_de_passe.getText().toString().trim().length() <= 4)){
                AfficheMessage("Erreur", "Vous devez entrer correctement les informations");
                return;
            }
            else if (nom_prenom.getText().toString().trim().length() >= 6 && telephone.getText().toString().trim().length() == 8 && mot_de_passe.getText().toString().trim().length() >= 4){
                bd_foto_prints.execSQL(String.format("INSERT INTO Compte(cle, nom_prenom, telephone, mot_de_passe, moment_actuel) VALUES('%s', '%s', '%s', '%s', '%s');", id_cle, nom_prenom.getText(), telephone.getText(), mot_de_passe.getText(), moment_actuel));
                Toast.makeText(Identification.this, "Votre compte est bien créé.", Toast.LENGTH_SHORT).show();
                videTexte();
                finish();
                startActivity(getIntent());
            }
        }
    }
    public void AfficheMessage(String titre, String message) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setCancelable(true);
        builder.setTitle(titre);
        builder.setMessage(message);
        builder.show();
    }
    public void videTexte(){
        nom_prenom.setText("");
        telephone.setText("");
        mot_de_passe.setText("");
    }


    public void getResults(View view){
        val_telephone = String.valueOf(telephone.getText().toString());
        val_mot_de_passe = String.valueOf(mot_de_passe.getText().toString());
        val_nom_prenom = String.valueOf(nom_prenom.getText().toString());

        final SharedPreferences.Editor editor = shared.edit();

        editor.putString("telephone", val_telephone);
        editor.putString("mot_de_passe", val_mot_de_passe);
        editor.putString("nom_prenom", val_nom_prenom);

        editor.commit();

    }
}


> Mon activity où je veux utiliser les variables sessions :


import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.HashMap;

public class Bienvenu extends AppCompatActivity {

    // User Session Manager Class
    // UserSessionManager session;
    SQLiteDatabase bd_foto_prints;
    Cursor c1;
    SharedPreferences shared;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bienvenu);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        //**********************************************
        bd_foto = openOrCreateDatabase("foto", Context.MODE_PRIVATE, null);
        Cursor c = bd_foto.rawQuery("SELECT * FROM Compte ORDER BY moment_actuel DESC LIMIT 1", null);
        while (c.moveToNext()) {
            String telephone2 = c.getString(2);
            String user_pass2 = c.getString(3);
            if (telephone2 != "" && user_pass2 != "") {

                shared = getSharedPreferences("maSession", Context.MODE_PRIVATE);

                String telephone_2 = shared.getString("telephone", null);
                String mot_de_passe_2 = shared.getString("mot_de_passe", null);
                String nom_prenom_2 = shared.getString("nom_prenom", null);
                TextView id_password1 = (TextView)findViewById(R.id.id_password);
                id_password1.setText(mot_de_passe_2);

            } else {
                Intent intent_accueil = new Intent(Bienvenu.this, Identification.class);
                startActivity(intent_accueil);
                Toast.makeText(Bienvenu.this, "Vous devez créer un compte pour continuer", Toast.LENGTH_LONG).show();
            }
        }
        c.close();
    }
}



Je veux passer de variables en session et les partager dans n'importe quelle autre activity.

J'ai tout fait mais, en vain. Aidez-moi s'il vous plaît.
Merci

1 réponse

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
14 déc. 2018 à 08:08
Salut,


getResults n'est pas appelé donc tes valeurs ne sont pas enregistrées, donc pas accessibles depuis tes autres activités.
Pour être plus safe utilise le context applicatif pour le shared pref à la place du context de ton activity, soit getApplicationContext().getSharedPreferences(..)

Pour passer des informations à une activity tu peux également passer des paramètres à l'activity de destination au niveau de la construction de l'Intent qui sera passé à startActivity (ou service).
Apres si tu veux partager un context(variables/objets sans refaire les instances) entre tes activités tu peux également passer par une création de context d'application (EXEMPLE)

0
Bonsoir Twinuts,

Merci pour votre réponse, mais, je n'ai pas compris votre réponse.
Est-ce que vous pouvez me corriger le code ci-dessus avec ce que vous proposer ?

Merci d'avance
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
14 déc. 2018 à 21:00
Salut,

au plus simple
/* Utilise AppCompatActivity à la place de Activity. */
public class Identification extends AppCompatActivity implements View.OnClickListener {

  @Override
   protected void onCreate(Bundle savedInstanceState) {
    ...
    shared = getApplicationContext().getSharedPreferences("maSession", Context.MODE_PRIVATE);
    ...
  }

 public void onClick(View view) {
    if (view.equals(envoyer)) {
      if (...){
        ...
      }
      /* le elseif n'est pas nécessaire */
      ...
      saveForm(); /* Sauvegarde des params */
      finish();
      startActivity(getIntent());
    }
  }
  ...
  /*public void getResults(View view){*/
  private void saveForm() {
    String val_telephone = String.valueOf(telephone.getText().toString());
    String val_mot_de_passe = String.valueOf(mot_de_passe.getText().toString());
    String val_nom_prenom = String.valueOf(nom_prenom.getText().toString());
    final SharedPreferences.Editor editor = shared.edit();
    editor.putString("telephone", val_telephone);
    editor.putString("mot_de_passe", val_mot_de_passe);
    editor.putString("nom_prenom", val_nom_prenom);
    //editor.commit();/* apply est préférable. */
    editor.apply();
  }
}
.....
public class Bienvenu extends AppCompatActivity {
  ...
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    ...
    while (c.moveToNext()) {
      ...
      if (telephone2 != "" && user_pass2 != "") {
        ...
        shared = getApplicationContext().getSharedPreferences("maSession", Context.MODE_PRIVATE);
        ...
      }
      ...
    }
    ...
  }
  ...
}
0
Enfin, je suis sauvé. Ça a bien marché.
Merci Twinuts toujours pour votre disponibilité pour nous.
0
Rejoignez-nous