How to Configure Flutter app with Zebra Device MC3300R

68 Views Asked by At

I'm trying to configure flutter app (Android) with Zebra Device MC3300R for RFID tag Scan, I have already configured RFD8500, which is working fine Below is the code. I'm able to run the flutter application on the Device MC3300R because it is a mobile computer so I have used .aar file. Also Able to run it by connecting to USB. Once I try to configure the app with Zebra MC3300R, I'm getting this: I/flutter ( 8933): Bluetooth permissions granted. D/RFIDAPI3Error( 8933): RfidUsbMgr: connection failed: device not found E/MainActivity( 8933): Number of available RFID readers: 0 Is there any different way to configure MC3300R ?

package com.apptricity.asset_mobile;

import android.os.Bundle;
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import com.zebra.rfid.api3.*;
import android.util.Log;
import java.util.ArrayList;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "com.apptricity.asset_mobile/zebra_rfid";
    private Readers readers;
    private RFIDReader rfidReader;
    private EventHandler eventHandler;
    private static final String TAG = "MainActivity";
    private MethodChannel channel;

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        
        channel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL);
        channel.setMethodCallHandler(
            (call, result) -> {
                switch (call.method) {
                    case "initializeAndConnect":
                        initializeAndConnect(result);
                        // result.success(null);
                        break;
                    case "startInventory":
                        startInventory();
                        result.success(null);
                        break;
                    case "stopInventory":
                        stopInventory();
                        result.success(null);
                        break;
                    default:
                        result.notImplemented();
                        break;
                }
            }
        );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        try {
            if (rfidReader != null) {
                rfidReader.Events.removeEventsListener(eventHandler);
                rfidReader.disconnect();
                rfidReader = null;
                readers.Dispose();
                readers = null;
            }
        } catch (InvalidUsageException e) {
            e.printStackTrace();
        } catch (OperationFailureException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void initializeAndConnect(MethodChannel.Result result) {
        try {
            readers = new Readers(this, ENUM_TRANSPORT.BLUETOOTH); // Or SERVICE_USB for USB
            ArrayList<ReaderDevice> availableRFIDReaderList = readers.GetAvailableRFIDReaderList();
                Log.e(TAG, "Number of available RFID readers: " + availableRFIDReaderList.size());
        
        // Log details of each available reader
        for (ReaderDevice readerDevice : availableRFIDReaderList) {
            String deviceInfo = "Reader Device: " + readerDevice.getName() + ", Address: " + readerDevice.getAddress();
            Log.e(TAG, deviceInfo);
        }

            if (!availableRFIDReaderList.isEmpty()) {
                ReaderDevice readerDevice = availableRFIDReaderList.get(0);
                
                    // Connect to the first available reader
                rfidReader = readerDevice.getRFIDReader();
                if (!rfidReader.isConnected()) {
                    rfidReader.connect();
                    ConfigureReader();
                    result.success(true); 
                    
                } else {
                    result.success(true);
                }
                // channel.invokeMethod("onReaderConnected", null);
            } else {
            // No available readers
            result.success(false); // Indicate failure
        }

        } catch (Exception e) {
            Log.e(TAG, "Error initializing RFID reader", e);
        }
    }

    private void ConfigureReader() {
        if (rfidReader.isConnected()) {
            TriggerInfo triggerInfo = new TriggerInfo();
            triggerInfo.StartTrigger.setTriggerType(START_TRIGGER_TYPE.START_TRIGGER_TYPE_HANDHELD);
            triggerInfo.StartTrigger.Handheld.setHandheldTriggerEvent(HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_PRESSED);
            triggerInfo.StopTrigger.setTriggerType(STOP_TRIGGER_TYPE.STOP_TRIGGER_TYPE_IMMEDIATE);
            triggerInfo.StopTrigger.setTriggerType(STOP_TRIGGER_TYPE.STOP_TRIGGER_TYPE_HANDHELD_WITH_TIMEOUT);
// Stop Inventory when the Handheld trigger is released

triggerInfo.StopTrigger.Handheld.setHandheldTriggerEvent(HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_RELEASED);
    triggerInfo.StopTrigger.Handheld.setHandheldTriggerTimeout(0);
            try {
                if (eventHandler == null) {
                    eventHandler = new EventHandler(channel, rfidReader);
                }
                rfidReader.Events.addEventsListener(eventHandler);
                rfidReader.Events.setHandheldEvent(true);
                rfidReader.Events.setTagReadEvent(true);
                rfidReader.Events.setAttachTagDataWithReadEvent(false);
                rfidReader.Config.setTriggerMode(ENUM_TRIGGER_MODE.RFID_MODE, true);
                rfidReader.Config.setStartTrigger(triggerInfo.StartTrigger);
                rfidReader.Config.setStopTrigger(triggerInfo.StopTrigger);
            } catch (InvalidUsageException | OperationFailureException e) {
                Log.e(TAG, "Error configuring RFID reader", e);
            }
        }
    }

private void startInventory() {
    if (rfidReader != null) {
        Log.d(TAG, "RFIDReader is not null. Checking connection...");
        if (rfidReader.isConnected()) {
            Log.d(TAG, "RFIDReader is connected. Attempting to start inventory.");
            try {
                rfidReader.Actions.Inventory.perform();
            } catch (InvalidUsageException | OperationFailureException e) {
                Log.e(TAG, "Error starting inventory", e);
            }
        } else {
            Log.e(TAG, "RFIDReader is not initialized or connected.");
            // Optionally, you could also inform the Flutter side about this state.
        }
    } else {
        Log.e(TAG, "RFIDReader is null.");
        // Optionally, you could also inform the Flutter side about this state.
    }
}



    private void stopInventory() {
        try {
            rfidReader.Actions.Inventory.stop();
        } catch (InvalidUsageException | OperationFailureException e) {
            Log.e(TAG, "Error stopping inventory", e);
        }
    }

    public class EventHandler implements RfidEventsListener {
        private MethodChannel channel;
        private RFIDReader rfidReader;

        public EventHandler(MethodChannel channel, RFIDReader rfidReader) {
            this.channel = channel;
            this.rfidReader = rfidReader;
        }

        /*   @Override
        public void eventReadNotify(RfidReadEvents e) {
            final ArrayList<String> tagIds = new ArrayList<>();
            TagData[] myTags = rfidReader.Actions.getReadTags(100);
            if (myTags != null) {
                for (TagData tag : myTags) {
                    tagIds.add(tag.getTagID());
                    
                }
                runOnUiThread(() -> channel.invokeMethod("onTagRead", tagIds));
            }
        } */

        @Override
public void eventReadNotify(RfidReadEvents e) {
    TagData[] myTags = rfidReader.Actions.getReadTags(100);
    if (myTags != null && myTags.length > 0) {
        // Assuming you're interested in the first tag read
        String firstTagId = myTags[0].getTagID();
            Log.d(TAG, "First read tag ID: " + firstTagId);
        
        ArrayList<String> tagIdList = new ArrayList<>();
        tagIdList.add(firstTagId); // Add only the first tag to the list

        // Send the list with only the first tag back to Flutter
        runOnUiThread(() -> channel.invokeMethod("onTagRead", tagIdList));
    }
}


        @Override
        public void eventStatusNotify(RfidStatusEvents rfidStatusEvents) {
                Log.d(TAG, "Status Notification: " + rfidStatusEvents.StatusEventData.getStatusEventType());
        if (rfidStatusEvents.StatusEventData.getStatusEventType() == STATUS_EVENT_TYPE.HANDHELD_TRIGGER_EVENT) {
            HANDHELD_TRIGGER_EVENT_TYPE triggerType = rfidStatusEvents.StatusEventData.HandheldTriggerEventData.getHandheldEvent();
            if (triggerType == HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_PRESSED) {
                // Trigger pressed logic
            } else if (triggerType == HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_RELEASED) {
                // Trigger released logic
            }
        }
            // Implement status event handling if needed
        }
    }
}
0

There are 0 best solutions below