Есть ли способ создать намерение ACTION_NDEF_DISCOVERED из кода

Для приложения, которое я пишу, мне интересно, можно ли создать намерение ACTION_NDEF_DISCOVERED из кода. Обычно это намерение создается системой при чтении тега в формате ndef. Он содержит parcableextra типа Tag.

Создание намерения, вероятно, просто, но можете ли вы также создать тег из кода или он не поддерживается классом, как я полагаю.

Цель состоит в том, чтобы передать системе виртуальный тег с записью ndef, который затем может быть обработан приложением, вызывающим намерение ACTION_NDEF_DISCOVERED.


person Thomas    schedule 03.11.2014    source источник


Ответы (1)


Вы можете получить экземпляр объекта фиктивного тега, используя отражение. Что-то вроде этого должно работать:

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