Commit 9e7a63d8f7d94bf7bbc18accf1e64c20bbbb44a4

Authored by marianne-butaye
1 parent 01212adb

Version avec la technologie Mifare Classic pour la lecture du login

(fonctionne quand même sur les tablettes non-compatibles, mais le login récupéré sera égal à null).

Pas testé (si quelqu'un a les moyens de le faire, n'hésitez pas!)

- Modification de MainActivity.java
App10p5/app/src/main/java/net/plil/clubinfo/app10p5/MainActivity.java
... ... @@ -4,16 +4,21 @@ import android.app.PendingIntent;
4 4 import android.content.Intent;
5 5 import android.content.IntentFilter;
6 6 import android.nfc.NfcAdapter;
  7 +import android.nfc.Tag;
  8 +import android.nfc.tech.MifareClassic;
7 9 import android.nfc.tech.NfcA;
8 10 import android.os.Bundle;
9 11 import android.support.design.widget.FloatingActionButton;
10 12 import android.support.design.widget.Snackbar;
11 13 import android.support.v7.app.AppCompatActivity;
12 14 import android.support.v7.widget.Toolbar;
  15 +import android.util.Log;
13 16 import android.view.Menu;
14 17 import android.view.MenuItem;
15 18 import android.view.View;
16 19  
  20 +import java.io.IOException;
  21 +
17 22 public class MainActivity extends AppCompatActivity {
18 23  
19 24 private NfcAdapter mNfcAdapter;
... ... @@ -27,7 +32,7 @@ public class MainActivity extends AppCompatActivity {
27 32 mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);
28 33 }
29 34  
30   - // Convertit l'array de byte en chaîne hexadécimale.
  35 + // Convertit l'array de byte en chaîne hexadécimale (si le byte = 0x63, str = "63").
31 36 private String ByteArrayToHexString(byte [] inarray) {
32 37 int i, j, in;
33 38 String [] hex = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
... ... @@ -78,7 +83,7 @@ public class MainActivity extends AppCompatActivity {
78 83 };
79 84  
80 85 // Setup a tech list for all NfcF tags
81   - mTechLists = new String[][]{new String[]{NfcA.class.getName()}};
  86 + mTechLists = new String[][]{new String[]{NfcA.class.getName(), MifareClassic.class.getName()}};
82 87 }
83 88  
84 89 @Override
... ... @@ -86,11 +91,62 @@ public class MainActivity extends AppCompatActivity {
86 91 if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {
87 92 String id_carte = ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID));
88 93 System.out.println("NFC Tag : " + id_carte);
89   - taFonction(id_carte);
  94 +
  95 + //Lecture des données
  96 + Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  97 + MifareClassic mfc = MifareClassic.get(tag);
  98 + byte[] data;
  99 + String prenom = null, nom = null, login = null;
  100 +
  101 + if(mfc != null) {
  102 + try {
  103 + mfc.connect();
  104 + String cardData = null;
  105 +
  106 + //Clé A
  107 + byte[] cleA = new byte[] { (byte)0xa0, (byte)0xa1, (byte)0xa2,
  108 + (byte)0xa3, (byte)0xa4, (byte)0xa5 };
  109 + //On veut juste lire le secteur 12
  110 + boolean estConnecte = mfc.authenticateSectorWithKeyA(12, cleA);
  111 + if (estConnecte) {
  112 + //Il y a 4 blocs dans le secteur 12 -> INE, numéro étudiant, prénom, nom
  113 + //On ne veut que prénom et nom, donc on passe les deux premiers
  114 + for (int i = 2, bIndex = mfc.sectorToBlock(12) + i; i < 4; i++, bIndex++) {
  115 + //sectorToBlock : Renvoie l'indice (global, parmis tous les blocs de
  116 + // tous les secteurs) du premier bloc du secteur 12
  117 + //Lit les données du bloc
  118 + data = mfc.readBlock(bIndex);
  119 +
  120 + //Convertit les bytes en String
  121 + String dataStr = new String(data);
  122 + if (i == 2) //Prénom
  123 + prenom = dataStr;
  124 + else if (i == 3) //Nom
  125 + nom = dataStr;
  126 + System.out.println("Données lues : " + dataStr);
  127 + }
  128 + } else {
  129 + System.out.println("Erreur lors de la connection au secteur 12.");
  130 + }
  131 + mfc.close();
  132 + } catch (IOException e) {
  133 + System.out.println(e.getLocalizedMessage());
  134 + }
  135 +
  136 + //Concaténation des données récupérées en login
  137 + login = prenom;
  138 + login.concat(".");
  139 + login.concat(nom);
  140 + }
  141 + else
  142 + System.out.println("Pas de connection possible à la technologie Mifare Classic.");
  143 +
  144 + //Éxécution de la fonction
  145 + taFonction(id_carte, login);
90 146 }
91 147 }
92 148  
93   - public void taFonction(String id_carte)
  149 + public void taFonction(String id_carte, String login)
94 150 {
95 151 //code fonction
96 152 }
... ...