How to make vcard / vcal Ndef message on Android

I'm new to Android coding, I'm interested in NFC technology. My first steps are focused on reading / writing tags, currently I don’t see much information on how to work with Vcard / Vcal MIME and NDEF Records / Messages types.

It would be nice if someone could post some sample code or better point to a learning resource!

EDIT: This is the code I used, it messed up. With some changes, I was able to write plain text and smart posters / urse data. Also, remember that I use NFC tags of type 2, since the storage capacity is limited, I just want to save the name and phone number on Vcards, or the name of the event and date on Vcal records. Thanks!

the public class VcardActivity extends the action {

NfcAdapter adapter; PendingIntent pendingIntent; IntentFilter writeTagFilters[]; Tag tag; Context ctx; boolean writeMode; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text); getActionBar().setDisplayHomeAsUpEnabled(true); ctx = this; Switch swWrite = (Switch) findViewById(R.id.switchWriteText); //final TextView msg = (TextView) findViewById(R.id.editText1); final String msg = "BEGIN:VCARD\n" + "VERSION:2.1\n" + "N:Gump;Forrest\n" + "FN:Forrest Gump\n" + "ORG:Bubba Gump Shrimp Co.\n" + "TITLE:Shrimp Man\n" + "TEL;WORK;VOICE111) 555-1212\n" + "TEL;HOME;VOICE404) 555-1212\n" + "ADR;WORK:;;100 Edge;Baytown;United\n" + "EMAIL;PREF;INTERNET: forrestgump@example.com \n " + "END:VCARD"; swWrite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { try { if (tag == null) { Toast.makeText(ctx, ctx.getString(R.string.error_detected), Toast.LENGTH_SHORT).show(); } else { write(msg, tag); Toast.makeText(ctx, ctx.getString(R.string.ok_writing), Toast.LENGTH_LONG).show(); } } catch (IOException e) { Toast.makeText(ctx, ctx.getString(R.string.error_writing), Toast.LENGTH_LONG).show(); e.printStackTrace(); } catch (FormatException e) { Toast.makeText(ctx, ctx.getString(R.string.error_writing), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } } }); /* INTENT FILTER */ adapter = NfcAdapter.getDefaultAdapter(this); pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter tagDetected = new IntentFilter( NfcAdapter.ACTION_TAG_DISCOVERED); tagDetected.addCategory(Intent.CATEGORY_DEFAULT); writeTagFilters = new IntentFilter[] { tagDetected }; } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_text, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } private void write(String text, Tag tag) throws IOException, FormatException { NdefRecord[] records = { createRecord(text) }; NdefMessage message = new NdefMessage(records); // Get an instance of Ndef for the tag. Ndef ndef = Ndef.get(tag); // Enable I/O ndef.connect(); // Write the message ndef.writeNdefMessage(message); // Close the connection ndef.close(); } private NdefRecord createRecord(String text) throws UnsupportedEncodingException { String msg = "BEGIN:VCARD\n" + "VERSION:2.1\n" + "N:Gump;Forrest\n" + "FN:Forrest Gump\n" + "ORG:Bubba Gump Shrimp Co.\n" + "TITLE:Shrimp Man\n" + "TEL;WORK;VOICE:55-1212\n" + "TEL;HOME;VOICE:55-1212\n" + "ADR;WORK:;;100 Edge;Ban;United\n" + "EMAIL;PREF;INTERNET: p@example.com \n " + "END:VCARD"; byte[] textBytes = msg.getBytes(); NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/x-vCard".getBytes(), new byte[] {}, textBytes); return textRecord; } @Override protected void onNewIntent(Intent intent) { if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); Toast.makeText(this, this.getString(R.string.ok_detection) + tag.toString(), Toast.LENGTH_LONG).show(); } } @Override public void onPause() { super.onPause(); WriteModeOff(); } @Override public void onResume() { super.onResume(); WriteModeOn(); } private void WriteModeOn() { writeMode = true; adapter.enableForegroundDispatch(this, pendingIntent, writeTagFilters, null); } private void WriteModeOff() { writeMode = false; adapter.disableForegroundDispatch(this); } 

}

+4
source share
1 answer

I wrote an NDEF library that provides a high-level (i.e. not a byte array) representation of the NDEF record / message, it also comes with a template project that demonstrates usage on Android.

To get familiar with the NDEF format itself, I also wrote the Eclipse plugin , which provides a file-based graphical editor.

Greetings :-)

+2
source

Source: https://habr.com/ru/post/1442893/


All Articles