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 ?