2

我正在尝试在 Android IoT 下使用连接到我的 Raspberry Pi3的两个 NFC ACR122u阅读器。

我正在使用ASC提供的本机 acssmc-1.1.3.jar 库。

连接一个阅读器后一切正常,我可以获取 tagId,打开/关闭蜂鸣器/灯,但是当两个阅读器都连接时,我无法与第二个阅读器通信。

所以,我可以同时打开它们,初始化 BroadcastReceiver,但是当涉及到调试器日志中类的读取器状态更改侦听onCreate method器时Reader,我看到一个读取器被关闭了 message D/UsbDeviceConnectionJNI: close

下面的代码初始化并打开两个阅读器。但是无法获得两个读者的读者状态,只能获得其中一个读者的状态,因为一个将在初始化后立即关闭。

我认为我必须Reader为每个读者单独初始化类,但这次尝试也没有运气。

我迷失在这部分。任何帮助将非常感激!

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

            }
        }
    }
}
4

0 回答 0