diff --git a/android/src/main/java/com/novadart/reactnativenfc/DataUtils.java b/android/src/main/java/com/novadart/reactnativenfc/DataUtils.java index a6962f1..e364a41 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/DataUtils.java +++ b/android/src/main/java/com/novadart/reactnativenfc/DataUtils.java @@ -12,6 +12,21 @@ public class DataUtils { + final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); + + public static String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + + for ( int j = 0; j < bytes.length; j++ ) { + int v = bytes[j] & 0xFF; + + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0F]; + } + + return new String(hexChars); + } + public static WritableMap cloneWritableMap(WritableMap map){ if(map == null){ return null; diff --git a/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java b/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java index 453454e..b9f5aff 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java +++ b/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java @@ -11,6 +11,7 @@ import android.support.annotation.Nullable; import com.facebook.react.bridge.ActivityEventListener; +import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReactApplicationContext; @@ -64,7 +65,11 @@ private void handleIntent(Intent intent, boolean startupIntent) { for (int i = 0; i < rawMessages.length; i++) { messages[i] = (NdefMessage) rawMessages[i]; } - processNdefMessages(messages,startupIntent); + + Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); + String serialNumber = getSerialNumber(tag); + + processNdefMessages(serialNumber,messages,startupIntent); } break; @@ -72,7 +77,9 @@ private void handleIntent(Intent intent, boolean startupIntent) { case NfcAdapter.ACTION_TAG_DISCOVERED: case NfcAdapter.ACTION_TECH_DISCOVERED: Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); - processTag(tag,startupIntent); + String serialNumber = getSerialNumber(tag); + + processTag(serialNumber,tag,startupIntent); break; } @@ -101,16 +108,23 @@ public void getStartUpNfcData(Callback callback){ private void sendEvent(@Nullable WritableMap payload) { getReactApplicationContext() .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit(EVENT_NFC_DISCOVERED, payload); } + .emit(EVENT_NFC_DISCOVERED, payload); + } + + private String getSerialNumber(Tag tag){ + byte[] id = tag.getId(); + String serialNumber = DataUtils.bytesToHex(id); + return serialNumber; + } - private void processNdefMessages(NdefMessage[] messages, boolean startupIntent){ - NdefProcessingTask task = new NdefProcessingTask(startupIntent); + private void processNdefMessages(String serialNumber, NdefMessage[] messages, boolean startupIntent){ + NdefProcessingTask task = new NdefProcessingTask(serialNumber, startupIntent); task.execute(messages); } - private void processTag(Tag tag, boolean startupIntent){ - TagProcessingTask task = new TagProcessingTask(startupIntent); + private void processTag(String serialNumber, Tag tag, boolean startupIntent){ + TagProcessingTask task = new TagProcessingTask(serialNumber, startupIntent); task.execute(tag); } @@ -134,16 +148,18 @@ public void onHostDestroy() {} private class NdefProcessingTask extends AsyncTask { + private final String serialNumber; private final boolean startupIntent; - NdefProcessingTask(boolean startupIntent) { + NdefProcessingTask(String serialNumber, boolean startupIntent) { + this.serialNumber = serialNumber; this.startupIntent = startupIntent; } @Override protected WritableMap doInBackground(NdefMessage[]... params) { NdefMessage[] messages = params[0]; - return NdefParser.parse(messages); + return NdefParser.parse(serialNumber, messages); } @Override @@ -158,16 +174,18 @@ protected void onPostExecute(WritableMap ndefData) { private class TagProcessingTask extends AsyncTask { + private final String serialNumber; private final boolean startupIntent; - TagProcessingTask(boolean startupIntent) { + TagProcessingTask(String serialNumber, boolean startupIntent) { + this.serialNumber = serialNumber; this.startupIntent = startupIntent; } @Override protected WritableMap doInBackground(Tag... params) { Tag tag = params[0]; - return TagParser.parse(tag); + return TagParser.parse(serialNumber, tag); } @Override diff --git a/android/src/main/java/com/novadart/reactnativenfc/parser/NdefParser.java b/android/src/main/java/com/novadart/reactnativenfc/parser/NdefParser.java index ba088b3..4e0132e 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/parser/NdefParser.java +++ b/android/src/main/java/com/novadart/reactnativenfc/parser/NdefParser.java @@ -21,9 +21,10 @@ public class NdefParser { - public static WritableMap parse(NdefMessage[] messages){ + public static WritableMap parse(String serialNumber, NdefMessage[] messages){ WritableMap result = new WritableNativeMap(); result.putString("type", NfcDataType.NDEF.name()); + result.putString("id", serialNumber); WritableArray data = new WritableNativeArray(); if(messages != null) { for (NdefMessage m : messages) { diff --git a/android/src/main/java/com/novadart/reactnativenfc/parser/TagParser.java b/android/src/main/java/com/novadart/reactnativenfc/parser/TagParser.java index 3ae9a75..0e3ae78 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/parser/TagParser.java +++ b/android/src/main/java/com/novadart/reactnativenfc/parser/TagParser.java @@ -10,10 +10,11 @@ public class TagParser { - public static WritableMap parse(Tag tag){ + public static WritableMap parse(String serialNumber, Tag tag){ WritableMap result = new WritableNativeMap(); result.putString("type", NfcDataType.TAG.name()); + result.putString("id", serialNumber); WritableMap data = new WritableNativeMap(); diff --git a/index.js b/index.js index 886b433..9c3cba9 100644 --- a/index.js +++ b/index.js @@ -13,14 +13,14 @@ export const NdefRecordType = { MIME : "MIME" }; - +const NFC_DISCOVERED = '__NFC_DISCOVERED'; let _registeredToEvents = false; const _listeners = []; let _registerToEvents = () => { if(!_registeredToEvents){ NativeModules.ReactNativeNFC.getStartUpNfcData(_notifyListeners); - DeviceEventEmitter.addListener('__NFC_DISCOVERED', _notifyListeners); + DeviceEventEmitter.addListener(NFC_DISCOVERED, _notifyListeners); _registeredToEvents = true; } };