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