Commit 9e7a63d8f7d94bf7bbc18accf1e64c20bbbb44a4
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
Showing
1 changed file
with
60 additions
and
4 deletions
Show diff stats
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 | } | ... | ... |