I'm trying to work with two NFC ACR122u readers connected to my Raspberry Pi3 under Android IoT.
I'm utilizing native acssmc-1.1.3.jar library provided by ASC.
Everything is working fine with one reader connected, I'm able to get tagId, turn on/off buzzer/light, but I'm unable to communicate with second reader when both are connected.
So, I'm able to power on both of them, initialize BroadcastReceiver, but when it comes to reader state change listener onCreate method
from Reader
class in debugger log I see that one reader was closed with message D/UsbDeviceConnectionJNI: close
.
The code below initialize and power on both readers. But can't get reader state for both readers, only for one of them 'cause one will be closed right after initialization.
I thought that I have to initialize Reader
class for each reader individually, but have no luck with this try as well.
I'm lost at this part. Any help would be really appreciated!
public class MainActivity extends AppCompatActivity {
private static final String ACTION_USB_PERMISSION = "com.android.reader.USB_PERMISSION";
private List<UsbDevice> active_devices = new ArrayList<>(2);
private PendingIntent mPermissionIntent;
private Reader mReader;
private UsbManager mManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mManager = (UsbManager) getSystemService(Context.USB_SERVICE);
Map<String, UsbDevice> connectedDevices = mManager.getDeviceList();
mReader = new Reader(mManager);
int i = 0;
for (UsbDevice device : connectedDevices.values()) {
if (mReader.isSupported(device)) {
active_devices.add(device);
Reader[] Reader = new Reader[2];
Reader[i] = new Reader(mManager);
Reader[i].setOnStateChangeListener(new Reader.OnStateChangeListener() {
@Override
public void onStateChange(int slotNum, int prevState, int currState) {
Log.i("STATE CHANGE", String.valueOf(currState));
if (currState < com.acs.smartcard.Reader.CARD_UNKNOWN || currState > com.acs.smartcard.Reader.CARD_SPECIFIC) {
currState = 0;
}
if (currState == com.acs.smartcard.Reader.CARD_PRESENT) {
Log.i("CARD PRESENT", String.valueOf(slotNum));
}
}
});
i++;
}
}
this.mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_USB_PERMISSION);
filter.addAction("android.hardware.usb.action.USB_DEVICE_DETACHED");
registerReceiver(mReceiver, filter);
powerUp();
}
public void powerUp(UsbManager manager) {
for (UsbDevice device: active_devices) {
manager.requestPermission(device, this.mPermissionIntent);
}
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (MainActivity.ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (!intent.getBooleanExtra("permission", false)) {
Log.i("Permission denied ", device.getDeviceName());
} else if (device != null) {
Log.i("Opening reader:", device.getDeviceName());
new OpenTask().execute(device);
}
}
} else if ("android.hardware.usb.action.USB_DEVICE_DETACHED".equals(action)) {
synchronized (this) {
UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null && device.equals(mReader.getDevice())) {
Log.i("Closing...", "Closing...");
new CloseTask().execute();
}
}
}
}
};
private class CloseTask extends AsyncTask<Void, Void, Void> {
private CloseTask() {
}
protected Void doInBackground(Void... params) {
mReader.close();
return null;
}
protected void onPostExecute(Void result) {
}
}
private class OpenTask extends AsyncTask<UsbDevice, Void, Exception> {
private OpenTask() {
}
protected Exception doInBackground(UsbDevice... params) {
try {
mReader.open(params[0]);
return null;
} catch (Exception e) {
return e;
}
}
protected void onPostExecute(Exception result) {
if (result != null) {
Log.i("Post Execute Result: ", result.toString());
} else {
try{
Log.i("Reader name: ", mReader.getReaderName());
} catch (Exception e){
Log.w("Error", e.getMessage());
}
int numSlots = mReader.getNumSlots();
Log.i("Number of slots: ", String.valueOf(numSlots));
}
}
}
}