Вы можете получить экземпляр объекта фиктивного тега, используя отражение. Что-то вроде этого должно работать:
NdefMessage ndefMsg = ...;
Class tagClass = Tag.class;
Method createMockTagMethod = tagClass.getMethod("createMockTag", byte[].class, int[].class, Bundle[].class);
final int TECH_NFC_A = 1;
final int TECH_NDEF = 6;
final String EXTRA_NDEF_MSG = "ndefmsg";
final String EXTRA_NDEF_MAXLENGTH = "ndefmaxlength";
final String EXTRA_NDEF_CARDSTATE = "ndefcardstate";
final String EXTRA_NDEF_TYPE = "ndeftype";
Bundle ndefBundle = new Bundle();
ndefBundle.putInt(EXTRA_NDEF_MSG, 48); // result for getMaxSize()
ndefBundle.putInt(EXTRA_NDEF_CARDSTATE, 1); // 1: read-only, 2: read/write
ndefBundle.putInt(EXTRA_NDEF_TYPE, 2); // 1: T1T, 2: T2T, 3: T3T, 4: T4T, 101: MF Classic, 102: ICODE
ndefBundle.putParcelable(EXTRA_NDEF_MSG, ndefMsg);
Tag mockTag = (Tag)createMockTagMethod.invoke(null,
new byte[] { (byte)0x12, (byte)0x34, (byte)0x56, (byte)0x78 },
new int[] { TECH_NFC_A, TECH_NDEF },
new Bundle[] { null, ndefBundle });
Проблема в том, что вы не сможете подключиться к этому тегу. Следовательно, все методы объекта Ndef
(которые вы можете получить из этого фиктивного экземпляра Tag
), требующие операций ввода-вывода с реальным тегом или реальным тегом, зарегистрированным в службе NFC, потерпят неудачу. В частности, только
getCachedNdefMessage()
,
getMaxSize()
,
getType()
,
isWritable()
и
getTag()
будет работать.
Таким образом, почти та же функциональность была бы доступна, если вы не передаете объект Tag
как часть намерения NDEF_DISCOVERED
, а вместо этого просто используете дополнительное намерение EXTRA_NDEF_MESSAGES
.
person
Michael Roland
schedule
03.11.2014