Bonjour, Je suis actuellement en stage pour ma dernière année d'étude. Pour ce stage je doit réaliser une application Android utilisant des tag NFC, plus précisément des NTAG216.
Ces tag sont protégés en lecture et en écriture par un mot de passe. Lorsqu'un tag est a porté, je doit lire son contenu puis ensuite réécrire par dessus. Voici actuellement mon code :
Activity
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 @Override protected void onNewIntent(Intent intent){ String tagUID = ""; if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())&&connect&&rondeEnCours&&!scanEnCours){ scanEnCours=true; mytag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); try { TagTypeFound tagType = new TagTypeFound(mytag);//récupération du type de tag int nombrePage=tagType.getNombrePage();//récupération du nombre de pages EcritureLectureTag ecritureLectureTag=new EcritureLectureTag(mytag,nombrePage); calendrier.miseAJourCalendrier();//mise à jour de l'heure String dateEtHeure=client.getLogin()+"/"+calendrier.getJour()+"/"+calendrier.getMois()+"/"+calendrier.getAnnee()+"/"+calendrier.getHeure()+"/"+calendrier.getMin(); String allHistorique = ecritureLectureTag.read();//lecture du contenu du tag ecritureLectureTag.writeHistorique(allHistorique,dateEtHeure);//enregistrement du nouvelle historique tagUID = ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID));//récupération de l'uid } catch (Exception e) { error(e.toString()); } scanEnCours=false; } }
Classe EcritureLectureTag
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 public class EcritureLectureTag { Tag tag; int nombrePage; boolean flagEnCours = false; public EcritureLectureTag(Tag mytag, int nbPage) { tag = mytag; nombrePage = nbPage; } public void write(String message) { MifareUltralight mifare = MifareUltralight.get(tag); int nombreCaractètre = message.length(); try { mifare.connect(); //authentification byte[] response = mifare.transceive(new byte[]{ (byte) 0x1B, // PWD_AUTH 0x10, 0x10, 0x10, 0x10 }); for (int i = 0; i <= (nombreCaractètre / 4) && i < nombrePage; i++) { int end = (i + 1) * 4; if (end > nombreCaractètre) { end = nombreCaractètre; } String stringMessage = message.substring(i * 4, end); while (stringMessage.length() < 4) { stringMessage = stringMessage + " "; } byte[] byteMessage = stringMessage.getBytes(Charset.forName("US-ASCII")); if (mifare.isConnected()) { mifare.writePage(i + 4, byteMessage); } } mifare.close(); } catch (IOException e) { Log.i("WRITE", e.getMessage()); } catch (InterruptedException e) { Log.i("WRITE", e.getMessage()); } } public String read() { MifareUltralight mifare = MifareUltralight.get(tag); String message = ""; try { mifare.connect(); //authentification byte[] response = mifare.transceive(new byte[]{ (byte) 0x1B, // PWD_AUTH 0x10, 0x10, 0x10, 0x10 }); for (int i = 1; i < (nombrePage / 4); i++) { byte[] ligne = mifare.readPages(i * 4); String nouvelleLigne = new String(ligne, Charset.forName("US-ASCII")); message = message + nouvelleLigne; } mifare.close(); } catch (IOException e) { e.printStackTrace(); } return message; } public void writeHistorique(String allHistorique, String dateEtHeure) { String[] mess = allHistorique.split(":"); String nouveauMessage = ""; int nombreHistoriqe = 0; for (String historique : mess) { nombreHistoriqe = nombreHistoriqe + 1; nouveauMessage = nouveauMessage + ":" + historique; } nouveauMessage = dateEtHeure + nouveauMessage; write(nouveauMessage); } }
problème
Le code fonctionne dans le sens ou j'arrive à récupérer la valeur et à l'enregistrer. Cependant cella ne fonctionne qu'une foi sur 2, dans les cas ou cela ne fonctionne pas, lorsqu'un tag est détecté l'application va dans le try catch et j’obtiens l'erreur suivante : java.lang.illegalStateException : Close other technology first!. Quelqu'un saurait-il pourquoi j'obtiens cette erreur ou aurait une piste de résolution ?
Partager