0 Replies Latest reply on Sep 13, 2018 6:38 AM by Ifor Darby-Hoskin

    RFD2000 TC20 RFID TagData array null

    Ifor Darby-Hoskin

      Hi,

       

      I am using a modified version of the demo code from the rfid-sdk-for-android-dg-en.pdf documentation.

       

      I am having an interesting problem that the TagData[] myTags array is null but not always. I have included the code bellow if anyone can point me in the right direction i would be grateful.

       

      package uk.co.assettrac.rfd2000_tc20_example;

      import android.os.AsyncTask;
      import android.support.v7.app.AppCompatActivity;
      import android.os.Bundle;
      import android.util.Log;
      import android.widget.TextView;
      import android.widget.Toast;

      import com.zebra.rfid.api3.*;

      import java.util.ArrayList;

      public class MainActivity extends AppCompatActivity {

         private static Readers readers;
        private static ArrayList<ReaderDevice> availableRFIDReaderList;
        private static ReaderDevice readerDevice;
        private static RFIDReader reader;
        private static String TAG = "DEMO";
         TextView textView;
        private EventHandler eventHandler;

         @Override
         protected void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
      // UI
         textView = (TextView) findViewById(R.id.TagText);
      // SDK
         if (readers == null) {

         readers = new Readers(this, ENUM_TRANSPORT.SERVICE_SERIAL);
         }

         new AsyncTask<Void, Void, Boolean>() {

         @Override
         protected Boolean doInBackground(Void... voids) {

         try {

         if (readers != null) {

         if (readers.GetAvailableRFIDReaderList() != null) {

         availableRFIDReaderList =

         readers.GetAvailableRFIDReaderList();
        if (availableRFIDReaderList.size() != 0) {

      // get first reader from list
         readerDevice = availableRFIDReaderList.get(0);
         reader = readerDevice.getRFIDReader();
        if (!reader.isConnected()) {

      // Establish connection to the RFID Reader
         reader.connect();
         ConfigureReader();
        return true;
         }

        }

        }

        }

        } catch (InvalidUsageException e) {

        e.printStackTrace();
         } catch (OperationFailureException e) {

        e.printStackTrace();
         Log.d(TAG, "OperationFailureException " + e.getVendorMessage());
         }

         return false;
         }

         @Override
         protected void onPostExecute(Boolean aBoolean) {

         super.onPostExecute(aBoolean);
        if (aBoolean) {

        Toast.makeText(getApplicationContext(), "Reader Connected",
         Toast.LENGTH_LONG).show();
      //textView.setText("Reader connected");
         }

        }

        }.execute();
         }

       

         private void ConfigureReader() {

         if (reader.isConnected()) {

        TriggerInfo triggerInfo = new TriggerInfo();
         triggerInfo.StartTrigger.setTriggerType(START_TRIGGER_TYPE.START_TRIGGER_TYPE_IMMEDIATE);
         triggerInfo.StopTrigger.setTriggerType(STOP_TRIGGER_TYPE.STOP_TRIGGER_TYPE_IMMEDIATE);
        try {

      // receive events from reader
         if (eventHandler == null)

         eventHandler = new EventHandler();
         reader.Events.addEventsListener(eventHandler);
      // HH event
         reader.Events.setHandheldEvent(true);
      // tag event with tag data
         reader.Events.setTagReadEvent(true);
         reader.Events.setAttachTagDataWithReadEvent(true);
      // set trigger mode as rfid so scanner beam will not come
         reader.Config.setTriggerMode(ENUM_TRIGGER_MODE.RFID_MODE, true);
      // set start and stop triggers
         reader.Config.setStartTrigger(triggerInfo.StartTrigger);
         reader.Config.setStopTrigger(triggerInfo.StopTrigger);
         } catch (InvalidUsageException e) {

        e.printStackTrace();
         } catch (OperationFailureException e) {

        e.printStackTrace();
         }

        }

        }

         @Override
         protected void onDestroy() {

         super.onDestroy();
        try {

         if (reader != null) {

         reader.Events.removeEventsListener(eventHandler);
         reader.disconnect();
         Toast.makeText(getApplicationContext(), "Disconnecting reader",
         Toast.LENGTH_LONG).show();
         reader = null;
         readers.Dispose();
         readers = null;
         }

        } catch (InvalidUsageException e) {

        e.printStackTrace();
         } catch (OperationFailureException e) {

        e.printStackTrace();
         } catch (Exception e) {

        e.printStackTrace();
         }

        }

       

         // Read/Status Notify handler
      // Implement the RfidEventsLister class to receive event notifications
         public class EventHandler implements RfidEventsListener {

         // Read Event Notification
         public void eventReadNotify(RfidReadEvents e) {

      // Recommended to use new method getReadTagsEx for better performance in case of large tag population
         TagData[] myTags = reader.Actions.getReadTags(100);
        if (myTags != null) {

         for (int index = 0; index < myTags.length; index++) {

        Log.d(TAG, "Tag ID " + myTags[index].getTagID());
        if (myTags[index].getOpCode() ==

        ACCESS_OPERATION_CODE.ACCESS_OPERATION_READ &&

        myTags[index].getOpStatus() ==

        ACCESS_OPERATION_STATUS.ACCESS_SUCCESS) {

         if (myTags[index].getMemoryBankData().length() > 0) {

        Log.d(TAG, " Mem Bank Data " + myTags[index].getMemoryBankData());
         }

        }

        }

        } else {

        Log.d(TAG, "TagData Array Null");
         }

        }

         // Status Event Notification
         public void eventStatusNotify(RfidStatusEvents rfidStatusEvents) {

        Log.d(TAG, "Status Notification: " +

        rfidStatusEvents.StatusEventData.getStatusEventType());
        if (rfidStatusEvents.StatusEventData.getStatusEventType() ==

        STATUS_EVENT_TYPE.HANDHELD_TRIGGER_EVENT) {

         if
         (rfidStatusEvents.StatusEventData.HandheldTriggerEventData.getHandheldEvent() ==

        HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_PRESSED) {

         new AsyncTask<Void, Void, Void>() {

         @Override
         protected Void doInBackground(Void... voids) {

         try {

         reader.Actions.Inventory.perform();
         } catch (InvalidUsageException e) {

        e.printStackTrace();
         } catch (OperationFailureException e) {

        e.printStackTrace();
         }

         return null;
         }

        }.execute();
         }

       

         if (rfidStatusEvents.StatusEventData.HandheldTriggerEventData.getHandheldEvent() ==

        HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_RELEASED) {

         new AsyncTask<Void, Void, Void>() {

         @Override
         protected Void doInBackground(Void... voids) {

         try {

         reader.Actions.Inventory.stop();
         } catch (InvalidUsageException e) {

        e.printStackTrace();
         } catch (OperationFailureException e) {

        e.printStackTrace();
         }

         return null;
         }

        }.execute();
         }

        }

        }

        }

      }