funziona egregiamente con un lettore di smartcard per le tessere solo che per quelle di nuova emissione non estrae i dati. Secondo me devono avere cambiato la posizione dell' EF contenente i dati personali oppure hanno messo un blocco di pin, ma non credo
// show the list of available terminals
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
// get the first terminal
CardTerminal terminal = terminals.get(0);
// establish a connection with the card
//stabiliamo un canale di comunicazione con il terminale
Card card = terminal.connect("*");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();
//chiediamo al canale di comunicazione di darci il num di byte dell'atr
ATR atr = card.getATR();
System.out.println("numero byte di "+atr);
System.out.println("");
//ci facciamo dare l'array di byte dell'atr in stringa
byte[] bytes = atr.getBytes();
String atrbin = Arrays.toString(bytes);
System.out.println(" insieme dei numeri di atr "+ atrbin);
System.out.println("");
String s = new String(bytes);
// scriviamo decifrandoli in caratteri anche se tuttavia non hanno senso in quanto hanno altri significati
System.out.println("i byte decodificati in stringa "+s);
// diamo un comando apdu alla smart di selezionare il MF
byte[] apdu = new byte[7];
apdu[0]=(byte)0x00;
apdu[1]=(byte)0xa4;
apdu[2]=(byte)0x00;
apdu[3]=(byte)0x00;
apdu[4]=(byte)0x00;
apdu[5]=(byte)0x3F;
apdu[6]=(byte)0x00;
ResponseAPDU r = channel.transmit(new CommandAPDU(apdu));
// diamo un comando apdu alla smart di selezionare il DF
byte[] apdu1 = new byte[7];
apdu1[0]=(byte)0x00;
apdu1[1]=(byte)0xa4;
apdu1[2]=(byte)0x00;
apdu1[3]=(byte)0x00;
apdu1[4]=(byte)0x02;
apdu1[5]=(byte)0x11;
apdu1[6]=(byte)0x00;
ResponseAPDU r1 = channel.transmit(new CommandAPDU(apdu1));
// diamo un comando apdu alla smart di selezionare EF
byte[] apdu2 = new byte[7];
apdu2[0]=(byte)0x01;
apdu2[1]=(byte)0xa4;
apdu2[2]=(byte)0x00;
apdu2[3]=(byte)0x00;
apdu2[4]=(byte)0x02;
apdu2[5]=(byte)0x11;
apdu2[6]=(byte)0x02;
ResponseAPDU r2 = channel.transmit(new CommandAPDU(apdu2));
// diamo un comando apdu alla smart di leggere ET
byte[] apdu3 = new byte[7];
apdu3[0]=(byte)0x01;
apdu3[1]=(byte)0xB0;
apdu3[2]=(byte)0x00;
apdu3[3]=(byte)0x00;
apdu3[4]=(byte)0x00;
apdu3[5]=(byte)0x00;
apdu3[6]=(byte)0x190;
ResponseAPDU r3 = channel.transmit(new CommandAPDU(apdu3));
//scrivo il numero di byte della apdu e la risposta sw
System.out.println(Arrays.toString(r3.getBytes()));
System.out.println(r3.toString());
// scrivo il risultato tradotto in stringa dell'array della apdu
String s1 = new String(r3.getData());
System.out.println(s1);
// levo i primi 6 caratteri che indicano il totale dei caratteri in esadecimale
//per comodità chiamo i bytes caratteri
String s2 = s1.substring(6);
System.out.println(s2);
//trasformo in int i successivi due caratteri
String s221 = s1.substring(6, 8);
int dec = Integer.parseInt(s221,16);
System.out.println(dec);
//scrivo la substringa da 8 a 8+dec
String codemett = s1.substring(8, (8+dec));
System.out.println("codice emettitore: "+codemett);
//trasformo in int gli ulteriori due caratteri esadecimali
String s222 = s1.substring((8+dec), (10+dec));
int dec1 = Integer.parseInt(s222,16);
System.out.println(dec1);
// scrivo la substringa della data di emissione da 8+2+dec a 8+2+dec+dec1
String dataemis = s1.substring((10+dec), (14+dec1));
System.out.println("data di emissione: "+dataemis);
//trasformo in int gli ulteriori due caratteri esadecimali indicanti byte scadenza
String s223 = s1.substring((10+dec+dec1), (12+dec+dec1));
int dec2 = Integer.parseInt(s223,16);
System.out.println(dec2);
// scrivo la substringa data scadenza da 12+dec+dec1 a 12+dec+dec1+dec2
String datascad = s1.substring((12+dec+dec1), (12+dec+dec1+dec2));
System.out.println("data di scadenza: "+datascad);
//trasformo in int gli ulteriori due caratteri esadecimali indicanti cognome
String s224 = s1.substring((12+dec+dec1+dec2), (14+dec+dec1+dec2));
int dec3 = Integer.parseInt(s224,16);
System.out.println(dec3);
// scrivo la substringa cognome da 14+dec+dec1+dec2 a 12+dec+dec1+dec2
String cognome = s1.substring((14+dec+dec1+dec2), (14+dec+dec1+dec2+dec3));
System.out.println("cognome: "+ cognome);
//trasformo in int gli ulteriori due caratteri esadecimali del nome
String s225 = s1.substring((14+dec+dec1+dec2+dec3), (16+dec+dec1+dec2+dec3));
int dec4 = Integer.parseInt(s225,16);
System.out.println(dec4);
// scrivo la substringa cognome da 16+dec+dec1+dec2+dec3 a 16+dec+dec1+dec2+dec3+dec4
String nome = s1.substring((16+dec+dec1+dec2+dec3), (16+dec+dec1+dec2+dec3+dec4));
System.out.println("nome: "+ nome);
//trasformo in int gli ulteriori due caratteri esadecimali della data nascita
String s226 = s1.substring((16+dec+dec1+dec2+dec3+dec4),(18+dec+dec1+dec2+dec3+dec4));
int dec5 = Integer.parseInt(s226,16);
System.out.println(dec5);
// scrivo la substringa cognome da 18+dec+dec1+dec2+dec3+dec4 a 18+dec+dec1+dec2+dec3+dec4+dec5
String datanascita = s1.substring((18+dec+dec1+dec2+dec3+dec4),(18+dec+dec1+dec2+dec3+dec4+dec5));
System.out.println("data di nascita: "+ datanascita);
//trasformo in int gli ulteriori due caratteri esadecimali del sesso
String s227 =s1.substring((18+dec+dec1+dec2+dec3+dec4+dec5),(20+dec+dec1+dec2+dec3+dec4+dec5));
int dec6 = Integer.parseInt(s227,16);
System.out.println(dec6);
// scrivo la substringa cognome da 20+dec+dec1+dec2+dec3+dec4 a 20+dec+dec1+dec2+dec3+dec4+dec5+dec6
String sesso = s1.substring((20+dec+dec1+dec2+dec3+dec4+dec5),(20+dec+dec1+dec2+dec3+dec4+dec5+dec6));
System.out.println("sesso: "+ sesso);
//trasformo in int gli ulteriori due caratteri esadecimali del codice fiscale
String s228 =s1.substring((20+dec+dec1+dec2+dec3+dec4+dec5+dec6),(24+dec+dec1+dec2+dec3+dec4+dec5+dec6));
int dec7 = Integer.parseInt(s228,16);
System.out.println(dec7);
// scrivo la substringa codice fiscale da 22+dec+dec1+dec2+dec3+dec4+dec5+dec6 a 22+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7
String codfisc = s1.substring((24+dec+dec1+dec2+dec3+dec4+dec5+dec6),(24+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7));
System.out.println("codice fiscale: "+ codfisc);
//trasformo in int gli ulteriori due caratteri esadecimali del comune di nascita
String s229 =s1.substring((24+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7),(28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7));
int dec8 = Integer.parseInt(s229,16);
System.out.println(dec8);
// scrivo la substringa cognome da 28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7 a 28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8
String comunasc = s1.substring((28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7),(28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8));
System.out.println("comune di nascita: "+ comunasc);
//trasformo in int gli ulteriori due caratteri esadecimali del comune di residenza
String s230 = s1.substring((32+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8),(34+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8));
int dec9 = Integer.parseInt(s230,16);
System.out.println(dec9);
// scrivo la substringa comures da 32+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8 a 32+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8+dec9
String comures = s1.substring((34+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8),(34+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8+dec9));
System.out.println("comune di residenza: "+ comures);
surname.setText(cognome);
name.setText(nome);
String datanascita1 =datanascita.substring(0, 2) + "-" + datanascita.substring(2, 4) + "-" + datanascita.substring(4, 8);
birth.setText(datanascita1);
sex.setText(sesso);
codfiscale.setText(codfisc);
townbirth.setText(comunasc);
townstay.setText(comures);
cem.setText(codemett);
String dataemis1 = dataemis.substring(0, 2)+ "-"+dataemis.substring(2, 4)+ "-"+dataemis.substring(4, 8);
dem.setText(dataemis1);
String datascad1 = datascad.substring(0, 2)+ "-"+datascad.substring(2, 4)+ "-"+datascad.substring(4, 8);
dts.setText(datascad1);