Goldenscorpio Posté(e) 14 novembre 2013 Share Posté(e) 14 novembre 2013 Bonsoir à tous, En ce moment, je programme une application pour terminal android et le principe de cette appli. serait de juste de lire un tag NFC. Mais voila le problème, étant donné que je suis ultra-novice dans ce langage de programmation, je n'ai aucune idée de comment m'y prendre pour simplement lancer la lecture sur mon téléphone. Donc je me rabat sur ce forum pour peut être me renseigner et m'aider. Je ne joint pas de morceau de mon code car pour le moment je suis sur la case départ. Je vous remercie d'avance et vous souhaite une bonne soirée Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lannig Posté(e) 14 novembre 2013 Share Posté(e) 14 novembre 2013 Déplacé dans la section développement > autres (faute de mieux). Cette section-ci sert à présenter des applis. 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nhi Posté(e) 14 novembre 2013 Share Posté(e) 14 novembre 2013 Tu branche ton téléphone et normalement Eclipse le reconnait automatiquement, ensuite il n'y a qu'à cliqué sur Run Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Goldenscorpio Posté(e) 14 novembre 2013 Auteur Share Posté(e) 14 novembre 2013 Mais je n'ai rien coder encore, il faut que je le fasse mais je n'ai aucune idée de comment faire. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lannig Posté(e) 14 novembre 2013 Share Posté(e) 14 novembre 2013 La question n'était pas sur l'outil de développement mais sur le code à écrire pour que son appli fasse ce qu'il désire, je pense. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nhi Posté(e) 14 novembre 2013 Share Posté(e) 14 novembre 2013 (modifié) Va voir ici : http://fr.openclassrooms.com/informatique/cours/creez-des-applications-pour-android C'est un très bon tuto pour apprendre. et ici pour les tag NFC :http://fr.openclassrooms.com/informatique/cours/aller-plus-loin-dans-le-developpement-android/les-differents-tags-existants Modifié 14 novembre 2013 par Nhi 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Goldenscorpio Posté(e) 14 novembre 2013 Auteur Share Posté(e) 14 novembre 2013 (modifié) @Lannig : Oui voila, pardon si je me suis mal exprimer @NHI : Merci je vais voir tout de suite En tout cas merci pour vos réponses rapides et efficaces Modifié 15 novembre 2013 par Goldenscorpio Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Goldenscorpio Posté(e) 15 novembre 2013 Auteur Share Posté(e) 15 novembre 2013 Re-salut tout le monde, à nouveau des problèmes avec mon NFC. Comment programmer un lancement lecture NFC sur mon terminal android ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Goldenscorpio Posté(e) 18 novembre 2013 Auteur Share Posté(e) 18 novembre 2013 Bonjour à tous, je pense avoir fait quelque chose de pas mal concernant mon application pour la lecture des tags NFC, mais le problème c'est que quand je lance mon application sur mon téléphone, elle s’arrête (Elle ne crash pas, elle s’arrête juste). Donc je requiert votre aide pour m'éclairer :) . Voici mon code : package com.example.apptestalex; //import java.text.BreakIterator; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.content.IntentFilter; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.tech.Ndef; import android.os.Bundle; import android.os.Parcelable; import android.os.PatternMatcher; import android.view.Menu; import android.widget.EditText; import android.widget.TextView; import android.widget.Button; import android.widget.Toast; //import java.awt.*; import android.view.MotionEvent; import android.view.View; //public class MainActivity extends Activity { public class MainActivity extends Activity implements View.OnTouchListener, View.OnClickListener { Button b1 = null; Button b2 = null; Button b3 = null; TextView tv = null; TextView tv2 = null; TextView tv3 = null; TextView tv4 = null; TextView tv5 = null; EditText et1 = null; String txt = null; NdefMessage[] messages = null; NfcAdapter mAdapter = null; Intent intent = null; int i; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.tv5 = (TextView) findViewById(R.id.tv5); this.mAdapter = NfcAdapter.getDefaultAdapter(this); if (mAdapter == null || !mAdapter.isEnabled()) { Toast.makeText(this, "Erreur NFC non activé", Toast.LENGTH_SHORT).show(); finish(); return; } tv = (TextView)findViewById(R.id.textView2); tv2 = (TextView)findViewById(R.id.textView3); //b1 = (Button) findViewById(R.id.b1); //b2 = (Button) findViewById(R.id.b2); b3 = (Button) findViewById (R.id.b3); //tv3 = (TextView) findViewById (R.id.tv3); tv4 = (TextView) findViewById (R.id.tv4); tv5 = (TextView) findViewById (R.id.tv5); et1 = (EditText) findViewById (R.id.et1); /* b1.setOnTouchListener(this); b1.setOnClickListener(this); b2.setOnTouchListener(this); b2.setOnClickListener(this); */ super.onCreate(savedInstanceState); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override protected void onResume() { super.onResume(); Intent intent = new Intent(this, this.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0); IntentFilter ndefFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); ndefFilter.addDataScheme("vnd.android.nfc"); ndefFilter.addDataAuthority("ext", null); //ndefFilter.addDataPath("/zenika.com:zenwifi", PatternMatcher.PATTERN_LITERAL); IntentFilter[] filters = {ndefFilter}; String[][] techs = {{Ndef.class.getName()}}; mAdapter.enableForegroundDispatch(this, pIntent, filters, techs); //IntentFilter[] ndefFilter = null; String[][] techListArray = null; mAdapter.enableForegroundDispatch(this, pIntent, filters, techListArray); } @Override protected void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this); } private void resolveIntent(Intent intent) { String action = intent.getAction(); if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null) { NdefMessage[] messages = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { messages = (NdefMessage) rawMsgs; } // Exemple basique de récupération des données dans le tableau String str = new String(messages[0].getRecords()[0].getPayload()); tv5.setText(str); } } } @Override public void onClick(View v) { // TODO Auto-generated method stub } public void click1(View parView) { //tv.append("\nSalut1"); tv3.setText("Click"); } public void click2 (View parView) { tv2.append("\nSalut2"); } public void click3 (View parView) { //txt=et1.getText().toString(); tv4.setText(et1.getText().toString()); } @Override public boolean onTouch(View arg0, MotionEvent arg1) { int id = arg0.getId(); switch(id){ } return false; } } En vous souhaitant une bonne journée ^_^ Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 18 novembre 2013 Share Posté(e) 18 novembre 2013 Bonjour, Tu as deux appels à super.onCreate dans ta méthode onCreate. Un seul est nécessaire, tu peux enlever le dernier. C'est peut être la cause du comportement de ton appli PS: merci d'utiliser les balises [ code ] pour le formatage de ton code, ça aiderait à la lisibilité de ton post Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Goldenscorpio Posté(e) 18 novembre 2013 Auteur Share Posté(e) 18 novembre 2013 (modifié) D'accord merci, je vais essayer tout de suite et je vous tiens au courant ! Me revoila, alors j'ai essayé d'enlever le super.onCreate mais cela ne change pas (peut-être parce que après avoir écrit mon ancien post, j'ai changer des parties de mon code). Mon appli s’arrête car elle exécute tout le programme. J'ai mis un while mais rien n'y fait, je ne comprend pas. Mon souci maintenant est que j'aimerai que lorsque le programme détecte quelque chose, elle l'affiche dans un TextView, comment faire ? :huh: package com.example.apptestalex; //import java.text.BreakIterator; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.content.IntentFilter; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.Ndef; import android.os.Bundle; import android.os.Parcelable; import android.os.PatternMatcher; import android.view.Menu; import android.widget.EditText; import android.widget.TextView; import android.widget.Button; import android.widget.Toast; //import java.awt.*; import android.view.MotionEvent; import android.view.View; //public class MainActivity extends Activity { public class MainActivity extends Activity implements View.OnTouchListener, View.OnClickListener { boolean clickb3 = false; Button b1 = null; Button b2 = null; Button b3 = null; TextView tv = null; TextView tv2 = null; TextView tv3 = null; TextView tv4 = null; TextView tv5 = null; TextView tv6 = null; EditText et1 = null; String txt = null; NdefMessage[] messages = null; NfcAdapter mAdapter = null; Intent intent = null; int i; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.tv5 = (TextView) findViewById(R.id.tv5); this.mAdapter = NfcAdapter.getDefaultAdapter(this); if (mAdapter == null || !mAdapter.isEnabled()) { Toast.makeText(this, "Erreur NFC non activé", Toast.LENGTH_SHORT).show(); finish(); resolveIntent(intent); return; } tv = (TextView)findViewById(R.id.textView2); tv2 = (TextView)findViewById(R.id.textView3); //b1 = (Button) findViewById(R.id.b1); //b2 = (Button) findViewById(R.id.b2); b3 = (Button) findViewById (R.id.b3); //tv3 = (TextView) findViewById (R.id.tv3); tv4 = (TextView) findViewById (R.id.tv4); tv5 = (TextView) findViewById (R.id.tv5); et1 = (EditText) findViewById (R.id.et1); tv6 = (TextView) findViewById (R.id.tv6); //super.onCreate(savedInstanceState); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } //@Override /*protected void onResume() { super.onResume(); Intent intent = new Intent(this, this.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0); IntentFilter ndefFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); ndefFilter.addDataScheme("vnd.android.nfc"); ndefFilter.addDataAuthority("ext", null); //ndefFilter.addDataPath("/zenika.com:zenwifi", PatternMatcher.PATTERN_LITERAL); IntentFilter[] filters = {ndefFilter}; String[][] techs = {{Ndef.class.getName()}}; mAdapter.enableForegroundDispatch(this, pIntent, filters, techs); String[][] techListArray = null; mAdapter.enableForegroundDispatch(this, pIntent, filters, techListArray); }*/ @Override protected void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this); } private void resolveIntent(Intent intent) { if (clickb3 = true) { String action = intent.getAction(); while (action == "") { if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (rawMsgs != null) { tv6.setTag(rawMsgs); NdefMessage[] messages = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { messages = (NdefMessage) rawMsgs; } // Exemple basique de récupération des données dans le tableau String str = new String(messages[0].getRecords()[0].getPayload()); tv6.setText(str); } } } } } @Override public void onClick(View v) { // TODO Auto-generated method stub } public void click1(View parView) { //tv.append("\nSalut1"); tv3.setText("Click"); } public void click2 (View parView) { tv2.append("\nSalut2"); } public void click3 (View parView) { clickb3 = true ; tv4.setText("Lecture activée"); //txt=et1.getText().toString(); //tv4.setText(et1.getText().toString()); } @Override public boolean onTouch(View arg0, MotionEvent arg1) { int id = arg0.getId(); switch(id){ } return false; } } Par contre, comment utilise-on les balises ? :huh: :) Modifié 18 novembre 2013 par Goldenscorpio Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 18 novembre 2013 Share Posté(e) 18 novembre 2013 Essaye de rajouter des logs, ou d'exécuter au debugger ton appli, pour voir où tu passes. PS: pour les balises code, il suffit, soit de les saisir, soit d'utiliser l'icone dans l'éditeur de texte Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Goldenscorpio Posté(e) 18 novembre 2013 Auteur Share Posté(e) 18 novembre 2013 Ok, merci je vais voir ! Un dernier détail, j'ai mis un bouton, et que la lecture NFC ne se lance uniquement si j'appuie sur ce bouton mais cela ne fonctionne pas, comment cela ce fait-il ? package com.example.apptestalex; //import java.text.BreakIterator; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.content.IntentFilter; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.Ndef; import android.os.Bundle; import android.os.Parcelable; import android.os.PatternMatcher; import android.view.Menu; import android.widget.EditText; import android.widget.TextView; import android.widget.Button; import android.widget.Toast; import android.view.MotionEvent; import android.view.View; //public class MainActivity extends Activity { public class MainActivity extends Activity implements View.OnTouchListener, View.OnClickListener { boolean clickb3 = false; Button b1 = null; Button b2 = null; Button b3 = null; TextView tv = null; TextView tv2 = null; TextView tv3 = null; TextView tv4 = null; TextView tv5 = null; TextView tv6 = null; EditText et1 = null; String txt = null; NdefMessage[] messages = null; NfcAdapter mAdapter = null; Intent intent = null; int i; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.tv5 = (TextView) findViewById(R.id.tv5); this.mAdapter = NfcAdapter.getDefaultAdapter(this); if (mAdapter == null || !mAdapter.isEnabled()) { Toast.makeText(this, "Erreur NFC non activé", Toast.LENGTH_SHORT).show(); finish(); resolveIntent(intent); //return; } tv = (TextView)findViewById(R.id.textView2); tv2 = (TextView)findViewById(R.id.textView3); //b1 = (Button) findViewById(R.id.b1); //b2 = (Button) findViewById(R.id.b2); b3 = (Button) findViewById (R.id.b3); //tv3 = (TextView) findViewById (R.id.tv3); tv4 = (TextView) findViewById (R.id.tv4); tv5 = (TextView) findViewById (R.id.tv5); et1 = (EditText) findViewById (R.id.et1); tv6 = (TextView) findViewById (R.id.tv6); //super.onCreate(savedInstanceState); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } /*@Override protected void onResume() { super.onResume(); Intent intent = new Intent(this, this.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0); IntentFilter ndefFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); ndefFilter.addDataScheme("vnd.android.nfc"); ndefFilter.addDataAuthority("ext", null); //ndefFilter.addDataPath("/zenika.com:zenwifi", PatternMatcher.PATTERN_LITERAL); IntentFilter[] filters = {ndefFilter}; String[][] techs = {{Ndef.class.getName()}}; mAdapter.enableForegroundDispatch(this, pIntent, filters, techs); String[][] techListArray = null; mAdapter.enableForegroundDispatch(this, pIntent, filters, techListArray);*/ @Override protected void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this); } private void resolveIntent(Intent intent) { if (clickb3 = true) { String action = intent.getAction(); while (action == "") { if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (rawMsgs != null) { tv6.setTag(rawMsgs); NdefMessage[] messages = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { messages[i] = (NdefMessage) rawMsgs[i]; } } } } } } @Override public void onClick(View v) { // TODO Auto-generated method stub } public void click1(View parView) { //tv.append("\nSalut1"); tv3.setText("Click"); } public void click2 (View parView) { tv2.append("\nSalut2"); } public void click3 (View parView) { clickb3 = true ; tv4.setText("Lecture activée"); //txt=et1.getText().toString(); //tv4.setText(et1.getText().toString()); } @Override public boolean onTouch(View arg0, MotionEvent arg1) { int id = arg0.getId(); switch(id){ } return false; } } PS : Voila les balises :P B) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 18 novembre 2013 Share Posté(e) 18 novembre 2013 Un test d'égalité se fait avec ==, pas = (dans ta méthode resolveIntent) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Goldenscorpio Posté(e) 18 novembre 2013 Auteur Share Posté(e) 18 novembre 2013 (modifié) Et comment régler le problème de " 'MonApplication' c'est malheureusement arrêtée" ? C'est bon, j'ai trouvé, il fallait juste que je rajoute une permission :lol: Une dernière question : Comment faire pour que lorsque je lis un tag un message s'affiche dans un EditText et que donc il soit modifiable ? Modifié 18 novembre 2013 par Goldenscorpio Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 18 novembre 2013 Share Posté(e) 18 novembre 2013 Il te suffit de renseigner le message dans l'EditText (méthode setText, comme pour un TextView) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Goldenscorpio Posté(e) 18 novembre 2013 Auteur Share Posté(e) 18 novembre 2013 Oui d'accord, mais par éxemple, dans mon code si je veux que quand mon tag est lu, cela s'affiche dans un TextView avec l'id "tv6", je procède comment ? package com.example.apptestalex; //import java.text.BreakIterator; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.content.IntentFilter; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.Ndef; import android.os.Bundle; import android.os.Parcelable; import android.os.PatternMatcher; import android.view.Menu; import android.widget.EditText; import android.widget.TextView; import android.widget.Button; import android.widget.Toast; import android.view.MotionEvent; import android.view.View; //public class MainActivity extends Activity { public class MainActivity extends Activity { boolean clickb3 = false; Button b1 = null; Button b2 = null; Button b3 = null; TextView tv = null; TextView tv2 = null; TextView tv3 = null; TextView tv4 = null; TextView tv5 = null; TextView tv6 = null; EditText et1 = null; String txt = null; NdefMessage[] messages = null; NfcAdapter mAdapter = null; Intent intent = null; int i; NdefRecord record; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.tv5 = (TextView) findViewById(R.id.tv5); this.mAdapter = NfcAdapter.getDefaultAdapter(this); if (mAdapter == null || !mAdapter.isEnabled()) { Toast.makeText(this, "Erreur NFC non activé", Toast.LENGTH_SHORT).show(); finish(); resolveIntent(intent); return; } tv = (TextView) findViewById(R.id.textView2); tv2 = (TextView) findViewById(R.id.textView3); // b1 = (Button) findViewById(R.id.b1); // b2 = (Button) findViewById(R.id.b2); b3 = (Button) findViewById(R.id.b3); // tv3 = (TextView) findViewById (R.id.tv3); tv4 = (TextView) findViewById(R.id.tv4); tv5 = (TextView) findViewById(R.id.tv5); et1 = (EditText) findViewById(R.id.et1); tv6 = (TextView) findViewById(R.id.tv6); // super.onCreate(savedInstanceState); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override protected void onResume() { super.onResume(); Intent intent = new Intent(this, this.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0); IntentFilter[] filters = null; String[][] techListArray = null; mAdapter.enableForegroundDispatch(this, pIntent, filters, techListArray); } @Override protected void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this); } private void resolveIntent(Intent intent) { if (clickb3 == true) { String action = intent.getAction(); while (action == "") { if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); byte[] Tag = record.getPayload(); if(Tag != null) { NdefMessage message = (NdefMessage) rawMsgs[0]; NdefRecord[] records = message.getRecords(); if(records.length > 0) { record = records[0]; } } } } } } public void click1(View parView) { // tv.append("\nSalut1"); tv3.setText("Click"); } public void click2(View parView) { tv2.append("\nSalut2"); } public void click3(View parView) { clickb3 = true; tv4.setText("Lecture activée"); // txt=et1.getText().toString(); // tv4.setText(et1.getText().toString()); } } Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 19 novembre 2013 Share Posté(e) 19 novembre 2013 Qu'est-ce que tu ne comprends pas ? Il te suffit de faire un tv6.setText( chaine_a_afficher ); avec le contenu que tu souhaites afficher lorsque tu as lu ton tag... PS: si le test d'égalité est bien ==, il n'est valable que pour les types primitifs, et ne fonctionnera pas comme attendu pour une chaine. Dans ta méthode resolveIntent, le ' while (action == "") ' retournera toujours false, il faut écrire ' while (action.equals("")) ' à la place... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Goldenscorpio Posté(e) 19 novembre 2013 Auteur Share Posté(e) 19 novembre 2013 Ok, je comprends mieux, je vais rectifier tout de suite. Merci beaucoup Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.