Скрыть запись NDEF в сообщении NDEF?

Я разработал 2 приложения для Android. Первый для записи в тег NFC, а второй для чтения содержимого, которое я написал.

Это то, что я сделал в первом приложении (WriteNFC)

private NdefRecord createRecord1(String data)
{ 
byte[] payload = data.getBytes(Charset.forName("UTF-8"));
byte[] empty = new byte[] {};
return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, empty, empty, payload);
}
private NdefRecord createRecord2(String data)
{ 
byte[] payload = data.getBytes(Charset.forName("UTF-8"));
byte[] empty = new byte[] {};
return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, payload, empty, empty);
}

А во втором приложении (ReadNFC)

NdefRecord cardRecord = msg.getRecords()[1];//Extract the second Record
String url_data = new String(cardRecord.getType());//Read data type

Когда я читал с помощью своего собственного приложения (ReadNFC), конечно, у меня на экране была только полезная нагрузка второй записи, которую я сохранил через «Тип записи». А вот со сторонним приложением, особенно с родно установленным ("тэгом") -показан на фото-, первую запись отображает корректно, а для второй - пустое поле. Как скрыть это поле. Иначе как заставить другие сторонние приложения не читать вторую запись?

введите здесь описание изображения


person mOmO    schedule 11.12.2012    source источник


Ответы (3)


Вы просто не можете этого сделать. Android прочитает полные сообщения NDEF (т. е. все записи) и передаст их в Intent приложению.

person NFC guy    schedule 11.12.2012

Upps, неудивительно, что это происходит, посмотрите на свой код. Первый

return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, empty, empty, payload);

потом

return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, payload, empty, empty);

Таким образом, сторонние приложения действительно показывают правильные данные, у вас есть ошибка при создании записи.

Встроенная поддержка NDEF в Android несколько сырая (на основе массива байтов), поэтому я написал библиотека, которая помогает в создании записей, которые могут вас заинтересовать. Вышеуказанная проблема может быть легко решена, но есть много других, гораздо более сложных типов записей, поэтому некоторая помощь может пригодиться ;-)

Редактировать: поэтому, если это предпочтительный результат, скорее создайте Неизвестную запись и поместите свои «секретные» данные в качестве полезной нагрузки — это не будет хорошим способом для любого стороннего приложения отображать эти данные — тогда как идентификатор абсолютного URI Запись, безусловно, может отображаться любым приложением для чтения NDEF (например, mine< /а>?)

person ThomasRS    schedule 11.12.2012
comment
В моем приложении нет ошибок, дорогой Томас. Я просто выбираю поместить полезную нагрузку в качестве типа записи и пустую в поле полезной нагрузки. [как видите, я использую getType(), а не getPayload()]. Таким образом, стороннее приложение будет отображать пустое поле. Это не совсем то, что я ищу, но, по крайней мере, вместо второй записи отображается пустое поле! - person mOmO; 11.12.2012
comment
Я уже использовал Unknown Record. И действительно стороннее приложение не показывает данные второй записи. НО, когда мы используем запись TNF_UNKNOWN, поле типа должно быть пустым. И в результате стороннее приложение отображает конкретное сообщение: Неизвестный тип тега. То же самое, когда мы используем TNF_EXTERNAL_TYPE! - person mOmO; 12.12.2012

Это стороннее приложение было для меня надоедливым, поэтому мне пришлось использовать foregroundDispatch для чтения содержимого тега вручную, там у вас есть свобода читать или не читать все, что вы хотите. Этот фрагмент из OnResume(). `

mNfcAdapter.enableForegroundDispatch(this, pendingIntent,
                intentFiltersArray, techListsArray);

            Toast.makeText(getApplicationContext(), "TAG disscovered",
                    Toast.LENGTH_LONG).show();
            Parcelable[] rawMsgs = getIntent()
            .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

            if (rawMsgs != null) {
                NdefMessage[] msgs = new NdefMessage[rawMsgs.length];


                for (int i = 0; i < rawMsgs.length; i++) {

                    msgs[i] = (NdefMessage) rawMsgs[i];
                    setText=new String(msgs[i].getRecords()[0].getPayload());
                }
                mInfoText.setText(setText);
            }

        }`

Здесь я получаю полезную нагрузку 1-й записи.

person Moon Moon    schedule 19.03.2013