Search code examples
androidnfc

How to write multiple strings in to NFC tag in android


I am new to android, i am trying to write six separate strings in nfc tag using separate edittext field. while i am running the app. i try to write six strings at the same time.. after writing, while reading the tag i can see only the lost string. how can i see all off the strings seperately.. below is my code.

public class MainActivity extends Activity{

    NfcAdapter adapter;
    PendingIntent pendingIntent;
    IntentFilter writeTagFilters[];
    boolean writeMode;
    Tag mytag;
    Context ctx;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ctx=this;
        Button btnWrite = (Button) findViewById(R.id.button);
        final TextView plateno = (TextView)findViewById(R.id.plate_no);
        final TextView model = (TextView)findViewById(R.id.model);
        final TextView chasis = (TextView)findViewById(R.id.chasis_no);
        final TextView engine = (TextView)findViewById(R.id.engine_no);
        final TextView duedate = (TextView)findViewById(R.id.due_date);
        final TextView rotexno = (TextView)findViewById(R.id.rotex_no);

        btnWrite.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {
                try {
                    if(mytag==null){
                        Toast.makeText(ctx, ctx.getString(R.string.error_detected), Toast.LENGTH_LONG ).show();
                    }else{
                        write(plateno.getText().toString(),mytag);
                        write(model.getText().toString(),mytag);
                        write(chasis.getText().toString(),mytag);
                        write(engine.getText().toString(),mytag);
                        write(duedate.getText().toString(),mytag);
                        write(rotexno.getText().toString(),mytag);
                        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();
                }
            }
        });

        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 };

    }



    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 lang       = "en";
        byte[] textBytes  = text.getBytes();
        byte[] langBytes  = lang.getBytes("US-ASCII");
        int    langLength = langBytes.length;
        int    textLength = textBytes.length;
        byte[] payload    = new byte[1 + langLength + textLength];

        // set status byte (see NDEF spec for actual bits)
        payload[0] = (byte) langLength;

        // copy langbytes and textbytes into payload
        System.arraycopy(langBytes, 0, payload, 1,              langLength);
        System.arraycopy(textBytes, 0, payload, 1 + langLength, textLength);

        NdefRecord recordNFC = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,  NdefRecord.RTD_TEXT,  new byte[0], payload);

        return recordNFC;
    }


    @Override
    protected void onNewIntent(Intent intent){
        if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){
            mytag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);    
            Toast.makeText(this, this.getString(R.string.ok_detection) + mytag.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);
    }


}

Layout file

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Write you message: ">
    </TextView>

        <EditText
            android:id="@+id/plate_no"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:hint="PlateNumber" />
         <EditText
            android:id="@+id/model"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:hint="Model" />
          <EditText
            android:id="@+id/chasis_no"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:hint="Chasis Number" />
           <EditText
            android:id="@+id/engine_no"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:hint="Engine Number" />
            <EditText
            android:id="@+id/due_date"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:hint="Due Date" />
            <EditText
            android:id="@+id/rotex_no"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:hint="Rotex Number" />

 <Button
     android:id="@+id/button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_gravity="center"
     android:layout_weight="1"
     android:text="Write!!" />

</LinearLayout>

Solution

  • You are using your function write() separetely for each string you try to store on the NFC tag. In your write() function you create a NDEFmessage with only that one string and you store that message to the tag.

    That means that each time you call write() you overwrite the previous NDEFmessage with a new NDEFmessage. The result is that you only see the last string on the tag.

    To store more than one string on the tag (provided that the tags memory is large enough), you need to put all strings into one NDEFmessage and store that one message to the tag.

    That means that you should create a NDEFrecord for each string (e.g. via createTextRecord(String languageCode, String text)) and put all of them in your records array. Now when you create the NDEFmessage, all strings are included in the NDEFmessage.