NFC Android: чтение тега NDEF –

Тип метки nfc не поддерживается samsung. nfc на android – что это такое. как это устроено – nfc эксперт – 07.06.2021

При задействовании на вашем устройстве технологии NFC (бесконтактной связи) часто используются метки «MIFARE Classic». Такие метки частично базируются на стандарте ISO/IEC 14443-3A, и используют собственный (проприетарный) алгоритм шифрования. Поскольку «NXP» (собственник технологии «MIFARE Classic») не спешит делиться правами на технологию «MIFARE Classic» с производителями других чипов, то доступ к памяти меток «MIFARE Classic» возможен преимущественно на NFC-устройствах с имеющимся у них внутри чипсетом от «NXP».

Обычно это означает, что вы не сможете получить доступ к данным меток «MIFARE Classic» с помощью девайсов, не обладающих встроенным чипсетом от «NXP» (системная служба NFS фильтрует метки «MIFARE Classic», и не уведомляет приложения об их наличии). К счастью (или несчастью) для владельцев гаджетов «Самсунг», компания «Самсунг» решила заблокировать технологию «MIFARE Classic» на многих своих устройствах, и при попытке её задействования вы увидите надпись о том, что «тип метки НФС не поддерживается на указанном устройстве». В результаты вы даже не сможете обнаружить указанные метки на специализированных приложениях, запущенных на телефонах «Самсунг».

Системное сообщение об отсутствии поддержки «MIFARE Classic» в одном из смартфонов

Некоторые из гаджетов от Самсунг в виде исключения могут включать в себя чипсеты от «NXP». В частности, «Samsung Note 3» имеет в себе контроллер «NXP PN544 NFC», и, соответственно, поддерживает «MIFARE Classic». А вот «Samsung Galaxy S6» содержит NFC контроллер от Самсунг «S3FWRN5P», и, следовательно, не поддерживает (точнее, блокирует) работу «MIFARE Classic».

Упомянутые проблемы с метками НФС возникают преимущественно у москвичей – обладателей транспортной карты «Тройка» во время попытки пополнения баланса карты с помощью популярного приложения «Мой проездной» или другого аналогичного софта. Если вы обладатель гаджета от «Самсунг», то в большинстве случаев проблема с метками имеет аппаратную природу (отсутствие чипсета от «NXP»), что делает невозможным нормальную работу с технологией «NFC».

Тем не менее есть ряд аппаратов от Самсунг, которые поддерживают технологию «MIFARE Classic». В частности, это такие девайсы как (список неполный и может варьироваться):

  • Galaxy Note II
  • Galaxy Nexus I9250
  • Galaxy SIII
  • Galaxy SIII Neo
  • Core DUOS
  • Galaxy S5 G900F.

Как минимум, должен быть смартфон на базе Android 4.0 и выше с поддержкой NFC.

Как и говорилось ранее, сама технология NFC должна поддерживать стандарт Mifare Classic, а проверить это можно лишь практическим путем.

На сайте банка Москвы можно просмотреть список моделей, которые поддерживают данную технологию, но учтите, что список не окончательный. Это лишь небольшой процент всех тех устройств, которые будут работать с картами «Тройка». Для просмотра перейдите и найдите пункт «Список моделей телефонов». Кликните по вкладке, чтобы просмотреть все модели.

ALCATELAcerAsusHTCHUAWEI
ONETOUCH POP S9Liquid ExpressPadfone 2OneASCENT P7
ONETOUCH IDOL2 Mini SLiquid GlowPadfone SDesire 610
Victoria 5035VGOne X
922One M8
One M9
One Max
GoogleLenovoLGMotorolaSamsung
Nexus 7 (2021 c NXP PN65)Sisley S90Optimus 3D MaxDroid RazrNexus I9250
VIBE Z2Optimus GDroid Razr HDNote II
P780Optimus G ProDroid Razr Maxx HDSIII
Vibe Z2 Pro (K920)Optimus 4X HDMoto XSIII Neo
Optimus L5SIII Core
Optimus L7Core DUOS
Optimus LTES5 G900F
Optimus Vu
Prada 3.0
Optimus Vu2
G3
G4
ZTEMegafonMTCWileyfox
Grand SMint975Swift 2
PF200Swift 2 Plus
Grand X
Render
Kis
Sprint Flash

Будет ли поддерживать ваш смартфон технологию или нет — зависит от самого разработчика. Если у производителя смартфонов подписан договор с компанией NXP Semiconductors, значит, поддержка осуществляться будет. Если нет — то и приложение «Мой проездной» корректно работать на таких устройствах не будет.

Для начала, разберемся, что собой представляет технология НФС.

НФС – это новейшая технология для контактного считывания информационных данных с мобильного телефона с помощью различных устройств. В настоящее время, такая технология используется далеко не на всех смартфонах. Если функция nfc есть в вашем мобильном устройстве, для ее активации и эффективной работы необходимо установить специальную программу для использования бесконтактного считывания информации и проведения платежных операций.

Функция НФС пока не сильно распространена, но разработчики активно работают над ее усовершенствованием и внедрением в новинки на рынках мобильных устройств.

Компания Sony ставит логотип NFC прямо на корпусы своих устройств, но лучше всего выполнять проверку через меню гаджета. Для этого делаем следующее.

Первый шаг.
Открываем настройки.

Второй шаг.Заходим в раздел настроек беспроводных сетей, тапаем «Еще…».

Третий шаг.При наличии чипа NFC видим раздел его настройки.

Следует отметить, что далеко не все телефоны имеют поддержку этой технологии передачи данных. Известно, что поддержка NFC есть у таких устройств как:

  • Apple iPhone (начиная с моделей 6S и 6S Plus);
  • новинки линейки Galaxy от Samsung и смартфоны других производителей на платформе Android (начиная с Android0).

Не беспокойтесь, если вы не обнаружили встроенную функцию, есть способ подключить NFC на девайс. Но сделать это можно только при условии, что панельная крышка на обороте и отверстие для SIM-карты на вашем смартфоне /планшете являются съемными. Установить NFC в таком случае не составит труда.

Как и говорилось ранее, сама технология NFC должна поддерживать стандарт Mifare Classic, а проверить это можно лишь практическим путем.

На сайте банка Москвы можно просмотреть список моделей, которые поддерживают данную технологию, но учтите, что список не окончательный. Это лишь небольшой процент всех тех устройств, которые будут работать с картами «Тройка». Для просмотра перейдите по ссылке и найдите пункт «Список моделей телефонов». Кликните по вкладке, чтобы просмотреть все модели.

ALCATELAcerAsusHTCHUAWEI
ONETOUCH POP S9Liquid ExpressPadfone 2OneASCENT P7
ONETOUCH IDOL2 Mini SLiquid GlowPadfone SDesire 610
Victoria 5035VGOne X
922One M8
One M9
One Max
GoogleLenovoLGMotorolaSamsung
Nexus 7 (2021 c NXP PN65)Sisley S90Optimus 3D MaxDroid RazrNexus I9250
VIBE Z2Optimus GDroid Razr HDNote II
P780Optimus G ProDroid Razr Maxx HDSIII
Vibe Z2 Pro (K920)Optimus 4X HDMoto XSIII Neo
Optimus L5SIII Core
Optimus L7Core DUOS
Optimus LTES5 G900F
Optimus Vu
Prada 3.0
Optimus Vu2
G3
G4
Sony XperiaPanasonicPhilipsYOTAXiaomi
Практически все модели с NFCELUGAXenium W336Phone2MI 2A
I908
W8555
ZTEMegafonMTCWileyfox
Grand SMint975Swift 2
PF200Swift 2 Plus
Grand X
Render
Kis
Sprint Flash

Большинство пользователей не хотят самостоятельно настраивать метки, опасаясь повредить её. При этом отсутствие программы делает устройство бесполезным, поскольку оно не будет передавать сигнал. На самом деле NFC метки довольно легко настраиваются при помощи смартфона.

Для этого необходимо использовать специальные приложения. Настроить устройство можно при помощи NFCTools или NFCTasks. Обе программы имеют встроенный английский интерфейс. Но разобраться в них может почти любой пользователь, владеющий базовыми знаниями. К тому же в интернете всегда найдётся переводчик.

Многие новейшие технологии, до того, как влиться в нашу жизнь, проходят ряд доработок и усовершенствований, которые должны бороться с различными проблемами в их функционировании.

Например, в настоящий момент в системе NFC, которая пока остается довольно инновационной/,присутствует целый ряд меток, при этом устройства поддерживают не все из них.

В данной статье мы рассмотрим, что означает уведомление о том, что типа метки NFC не поддерживается, и как устранить эту проблему на Samsung.

Что же такое NFC? Это особая технология контактного считывания информации с телефона особыми устройствами.

Причем, в настоящее время такой системой оснащены далеко не все мобильные устройства, но даже если она имеется, то работать может только в связке со специальном приложением для каждой сферы использования технологии.

Распространена данная технология в настоящее время еще не слишком широко, но ее внедрение идет достаточно активно.

Зачем нужна такая технология, и какие проблемы она помогает решить?

Пока такие турникеты и терминалы распространены еще не слишком широко, так что существенного упрощения жизни пользователя не предвидится.

Тот случай, когда озвученная проблема на экране телефона имеет вполне адекватное объяснение.

Не надо ничего выдумывать, если ваш любимый смартфон внезапно объявляет о том, что тип метки NFC не поддерживается Samsung (на русском или английском языках, неважно), это означает лишь одно — проблема носит технический характер, иначе говоря, аппаратный. То есть, в вашем девайсе чего-то не хватает  для успешной бесконтактной связи.

Технологический прогресс не стоит на месте, и сравнительно недавно нам стала доступна функция оплаты покупок в магазинах без использования физической пластиковой карты, а только лишь имея в руках смартфон, оборудованный технологией NFC. Эта статья поможет вам научиться пользоваться этой технологией и подобрать подходящий смартфон, который ее поддерживает.

Связь между двумя девайсами, оборудованными Near Field Communication, происходит через использование блока радиочастот.

Если ваш телефон снабжен чипом NFC, включить его можно следующим образом:

  • зайти в настройки смартфона;
  • перейти на вкладку «Дополнительно»;
  • нажать на включатель модуля Near Field Communication для его активации.
  • оба устройства должны быть разблокированы;
  • при подключении к другому устройству, ваш телефон получит вибрационный и аудиосигнал;
  • сохраняйте максимальное расстояние между устройствами не более 10 см во время передачи данных;
  • по завершению операции вы снова получите вибрационный и аудиосигнал.
  • Galaxy Note II
  • Galaxy Nexus I9250
  • Galaxy SIII
  • Galaxy SIII Neo
  • Core
  • Core DUOS
  • Galaxy S5 G900F.

Чтение и запись формата ndef в android nfc – русские блоги

Поток обработки в действии после обнаружения метки

1. Получить объект NfcAdapter в onCreate ();

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);

2. Получить объект Tag или информацию NdefMessage в onNewIntent ();

Получить объект Tag:

Tag tag = intent.getParcelableExra(NfcAdapter.EXTRA_TAG);

Получить информацию NdefMessage:

Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)

3. Вы также можете создавать объекты Ndef и т. Д. С помощью тегов для реализации атрибутов тегов и операций ввода-вывода.

Ndef ndef = Ndef.get(tag);

Процесс чтения тегов формата NDEF

1. Получить объект NfcAdapter в onCreate ();

2. В onNewIntent () определите, является ли это меткой формата NDEF (ACTION_NDEF_DISCOVERED), и если да, получите NdefMessage

Информация; (необходимо привести к объекту NdefMessage)

Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)

3. Выполните анализ объекта NdefMessage для получения связанной текстовой информации или Uri.

Процесс написания метки формата NDEF

1. Получить объект NfcAdapter в onCreate ();

2. Получить объект Tag в onNewIntent ();

Tag tag = intent.getParcelableExra(NfcAdapter.EXTRA_TAG);

3. Создайте объект Ndef через Tag;

Ndef ndef = Ndef.get(tag);

4. Инкапсулируйте данные, такие как текст, в NdefMessage;

5. Определите, является ли это тегом формата NDEF,

Для формата NDEF:

(1) Разрешить операцию надписи: ndef.connect ();

(2) Вызвать метод ndef.writeNdefMessage (NdefMessage) для записи.

Если не в формате NDEF:

(1)NdefFromatable format = NdefFromatable.get();

(2) Разрешить операцию надписи: format.connect ();

(3) Вызовите метод format.format (NdefMessage) для записи.

NdefMessage информационная структура

NFC Android: чтение тега NDEF -

Supported TNFs and their mappings:

Supported RTDs for TNF_WELL_KNOWN and their mappings:

Примечание: после чтения типа TNF (который может быть типом в первой таблице выше), если это TNF_WELL_KNOWN, вы можете получить RTD (соответствующий формат хорош

{TNF_WELL_KNOWN} Тип метки, который может быть типом во второй таблице)

Общие методы в NdefRecord

1. Поле TNF можно получить с помощью метода NdefRecord.getTnf ();

Соответствует длине заголовка на рисунке выше

2. Получить поле RTD с помощью метода NdefRecord.getType (), когда TNF – это TNF_WELL_KNOWN.

Соответствует типу в шапке

3. С помощью метода NdefRecord.getPayload () получить фактические данные для чтения и записи.

Соответствует полезной нагрузке на картинке выше

Идентификатор в заголовке соответствует уникальному идентификатору каждой записи

Текстовый формат NDEF

Paylaod в NdefMessage – это фактические данные, где текстовый формат NDEF:

NFC Android: чтение тега NDEF -

NDEF Uri формат

1. Paylaod в NdefMessage – это фактические данные, где текстовый формат NDEF:

NFC Android: чтение тега NDEF -

2, префикс должен искать анализ таблицы

Записи приложений Android (AAR)

1. Введите запись приложения (AAR) в Android 4.0.При сканировании тега NFC, записанного в AAR, запускается соответствующее приложение.

2. AAR имеет имя пакета приложения, встроенное в NdefRecord. Android выполнит поиск AAR по всему NdefMessage, если AAR найден, и запустит приложение на основе имени пакета внутри AAR.

3. Система планирования тегов NFC для планирования, включая теги AAR:

1. Если действие, соответствующее намерению, также соответствует AAR, запустите действие;

2. Если оно соответствует Намерению и не соответствует AAR, запустите приложение, указанное AAR;

3. Если нет прикладной программы, соответствующей AAR, запустите различные рынки, чтобы загрузить соответствующую прикладную программу на основе AAR.

Метод создания записи приложения Android

1. Вызовите метод creatApplicationRecord () класса NdefRecord для создания записи приложения.

2. Вставьте созданный AAR в NdefMessage.
NdefMessage msg = new NdefMessage(new Ndefrecord[]{…,NdefRecord. creatApplicationRecord(“com.example.android.beam”)})

3. Не встраивайте AAR в первую запись NdefMessage, если только AAR не является единственной записью в вашем NdefMessage.

NDEF для чтения и записи текста, пример программы:

ReadWriteTextMainActivity:

package mobile.android.read.write.text;
import java.nio.charset.Charset;
import java.util.Locale;
import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.nfc.tech.NdefFormatable;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class ReadWriteTextMainActivity extends Activity {
private TextView mInputText;
private String   mText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read_write_text_main);
mInputText = (TextView) findViewById(R.id.textview_input_text);
}
// Нажмите кнопку «Введите текст для записи», чтобы выполнить метод
public void onClick_InputText(View view) {
Intent intent = new Intent(this, InputTextActivity.class);
// Отображаем интерфейс для ввода текста
startActivityForResult(intent, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == 1) {
// Получить текст для записи на метку
mText = data.getStringExtra("text");
// Вывод текста, который нужно записать на метку в главном интерфейсе
mInputText.setText(mText);
}
}
// Вызывается, когда режим создания окна - singleTop или singleTask, используется для замены метода onCreate
// Вызывается, когда тег NFC находится рядом с телефоном, после установления соединения
@Override
public void onNewIntent(Intent intent) {
// Если текст для записи не задан, читаем текстовые данные на этикетке
if (mText == null) {
Intent myIntent = new Intent(this, ShowNFCTagContentActivity.class);
// Передаем намерение другому окну для отображения окна интерфейса 
myIntent.putExtras(intent);
// Вам нужно указать это действие. Когда вы передаете объект Intent, действие не пройдет
myIntent.setAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
startActivity(myIntent);
}
// Записать указанный текст в тег NFC
else {
// Получить объект Tag
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
// Создание объекта NdefMessage и объекта NdefRecord
NdefMessage ndefMessage = new NdefMessage(
new NdefRecord[] {createTextRecord(mText)});
// начинаем писать текст на метку
if (writeTag(ndefMessage, tag)) {
// Если текст успешно написан, установить mtext на ноль
mText = null;
// Очистить текст для записи, отображаемый в главном окне, и текст может быть написан только один раз
// Чтобы продолжить запись, нужно снова указать новый текст, иначе будет прочитан только текст в метке
mInputText.setText("");
}
}
}
// Создаем объект NdefRecord, который инкапсулирует текст для записи
public NdefRecord createTextRecord(String text) {
// Генерируем байтовый массив в китайской кодировке
byte[] langBytes = Locale.CHINA.getLanguage().getBytes(
Charset.forName("US-ASCII"));
// Кодируем текст для записи в формате UTF_8
Charset utfEncoding = Charset.forName("UTF-8");
// Поскольку кодирование формата текста определено как UTF_8, 7-й бит первого байта полезной нагрузки непосредственно установлен на 0
byte[] textBytes = text.getBytes(utfEncoding);
int utfBit = 0;
// определить и инициализировать байт состояния
char status = (char) (utfBit   langBytes.length);
// Создать байтовый массив для хранения полезной нагрузки
byte[] data = new byte[1   langBytes.length   textBytes.length];
// Установить байт состояния
data[0] = (byte) status;
// Установить кодировку языка
System.arraycopy(langBytes, 0, data, 1, langBytes.length);
// Установить фактический текст, который будет написан
System.arraycopy(textBytes, 0, data, 1   langBytes.length,
textBytes.length);
// Создать объект NdefRecord в соответствии с предварительно установленной полезной нагрузкой
NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
NdefRecord.RTD_TEXT, new byte[0], data);
return record;
}
// Записать объект NdefMessage в метку. Если запись завершится успешно, она вернет true, иначе вернет false.
boolean writeTag(NdefMessage message, Tag tag) {
int size = message.toByteArray().length;
try {
// Получить объект Ndef
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
// Разрешить операции ввода-вывода над тегами
ndef.connect();
if (!ndef.isWritable()) {
Toast.makeText (это «тег NFC только для чтения!», Toast.LENGTH_LONG)
.show();
return false;
}
if (ndef.getMaxSize() < size) {
Toast.makeText (это «Недостаточно места для метки NFC!», Toast.LENGTH_LONG)
.show();
return false;
}
// Записать данные на метку
ndef.writeNdefMessage(message);
Toast.makeText (это «Данные успешно записаны!», Toast.LENGTH_LONG) .show ();
return true;
} else {
// Получить объект NdefFormatable, который может форматировать и записывать данные в метку
NdefFormatable format = NdefFormatable.get(tag);
// Записываем данные в формате NDEF в не-NDEF формат или неформатированные теги
if (format != null) {
try {
// Разрешить операции ввода-вывода над тегами
format.connect();
format.format(message);
Toast.makeText (это «Данные успешно записаны!», Toast.LENGTH_LONG)
.show();
return true;
} catch (Exception e) {
Toast.makeText (это «Не удалось записать данные в формате NDEF!», Toast.LENGTH_LONG)
.show();
return false;
}
} else {
Toast.makeText (это «Теги NFC не поддерживают формат NDEF!», Toast.LENGTH_LONG)
.show();
return false;
}
}
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
return false;
}
}
}

InputTextActivity:

package mobile.android.read.write.text;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class InputTextActivity extends Activity {
private EditText mTextTag;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_input_text);
mTextTag = (EditText) findViewById(R.id.edittext_text_tag);
}
public void onClick_OK(View view) {
Intent intent = new Intent();
intent.putExtra("text", mTextTag.getText().toString());
setResult(1, intent);
finish();
}
}

ShowNFCTagContentActivity:

package mobile.android.read.write.text;
import mobile.android.read.write.text.library.TextRecord;
import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView;
import android.widget.Toast;
public class ShowNFCTagContentActivity extends Activity {
private TextView mTagContent;
private Tag      mDetectedTag;
private String   mTagText;
private void readAndShowData(Intent intent) {
mDetectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(mDetectedTag);
mTagText = ndef.getType ()   " nМаксимальная емкость данных:"   ndef.getMaxSize ()
" bytesnn";
readNFCTag();
mTagContent.setText(mTagText);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_nfctag_content);
mTagContent = (TextView) findViewById(R.id.textview_tag_content);
// Получить объект Tag		
mDetectedTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
// Создать объект Ndef	
Ndef ndef = Ndef.get(mDetectedTag);
// Получить тип и максимальную емкость метки
mTagText = ndef.getType ()   " nМаксимальная емкость данных:"   ndef.getMaxSize ()
" bytesnn";
// Считать данные тега NFC и проанализировать их
readNFCTag();
// Отображение связанной информации метки на интерфейсе
mTagContent.setText(mTagText);
}
private void readNFCTag() {
// Определяем, является ли он ACTION_NDEF_DISCOVERED
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
// Чтение данных с метки (объект Parcelable)
Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage msgs[] = null;
int contentSize = 0;
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
// Метка может хранить несколько объектов NdefMessage. Как правило, существует только один объект NdefMessage
for (int i = 0; i < rawMsgs.length; i  ) {
// Преобразовать в объект NdefMessage				
msgs[i] = (NdefMessage) rawMsgs[i];
// Рассчитать общую длину данных
contentSize  = msgs[i].toByteArray().length;
}
}
try {
if (msgs != null) {
// Программа учитывает только 1 объект NdefRecord, если это обычное программное обеспечение, следует учитывать все объекты NdefRecord
NdefRecord record = msgs[0].getRecords()[0];
// Анализ первого NdefRecorder и создание объекта TextRecord
TextRecord textRecord = TextRecord.parse(msgs[0]
.getRecords()[0]);
// Получить фактический размер данных и отобразить его в окне
mTagText   = textRecord.getText ()   " n  nPure text  n"
contentSize   " bytes";
}
} catch (Exception e) {
mTagContent.setText(e.getMessage());
}
}
}
}

TextRecord:

package mobile.android.read.write.text.library;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import android.nfc.NdefRecord;
public class TextRecord {
// Сохраняем проанализированный текст
private final String mText;
// Не разрешено напрямую создавать объект TextRecord, поэтому объявляем конструктор как приватный
private TextRecord(String text) {
mText = text;
}
// Этот метод может получить проанализированный текст
public String getText() {
return mText;
}
// Анализируем текстовое содержимое из объекта NdefRecord (полезная нагрузка)
public static TextRecord parse(NdefRecord record) {
// Проверяем, является ли TNF NdefRecord.TNF_WELL_KNOWN
if (record.getTnf() != NdefRecord.TNF_WELL_KNOWN)
return null;
// Проверяем, является ли тип переменной длины RTD_TEXT
if (!Arrays.equals(record.getType(), NdefRecord.RTD_TEXT))
return null;
try {
// Получить полезную нагрузку
byte[] payload = record.getPayload();
// Следующий код анализирует полезную нагрузку: байт состояния   кодировка языка ISO (ASCLL)   текстовые данные (UTF_8 / UTF_16)
// где полезная нагрузка [0] помещает байт состояния: если бит 7 равен 0, текстовые данные кодируются в формате UTF_8, если он равен 1, они кодируются в UTF_16
// бит6 зарезервирован, по умолчанию 0
/*
* payload[0] contains the "Status Byte Encodings" field, per the
* NFC Forum "Text Record Type Definition" section 3.2.1.
* 
* bit7 is the Text Encoding Field.
* 
* if (Bit_7 == 0): The text is encoded in UTF-8 if (Bit_7 == 1):
* The text is encoded in UTF16
* 
* Bit_6 is reserved for future use and must be set to zero.
* 
* Bits 5 to 0 are the length of the IANA language code.
*/
String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8"
: "UTF-16";
// Обработка бита 5-0. бит 5-0 указывает длину кодировки языка (в байтах)
int languageCodeLength = payload[0] & 0x3f;
// Получить кодировку языка (считайте байты languageCodeLength из второго байта полезной нагрузки в качестве кодировки языка)
String languageCode = new String(payload, 1, languageCodeLength,
"US-ASCII");
// Разобрать фактические текстовые данные
String text = new String(payload, languageCodeLength   1,
payload.length - languageCodeLength - 1, textEncoding);
// Создать объект TextRecord и вернуть его
return new TextRecord(text);
} catch (UnsupportedEncodingException e) {
// should never happen unless we get a malformed tag.
throw new IllegalArgumentException(e);
}
}
}

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mobile.android.read.write.text"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.NFC" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".ReadWriteTextMainActivity"
android: label = "Чтение и запись простых текстовых данных тегов NFC"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name=".ShowNFCTagContentActivity"
android: label = "Показать содержимое тега NFC"
android:launchMode="singleTask" />
<activity
android:name=".InputTextActivity"
android: label = "Написать текст в метку NFC" />
</application>
</manifest>

NDEF для чтения и записи URL, пример программы:

ReadWriteUriMainActivity:

package mobile.android.read.write.uri;
import mobile.android.read.write.uri.library.UriRecord;
import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.nfc.tech.NdefFormatable;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class ReadWriteUriMainActivity extends Activity {
private TextView mSelectUri;
private String   mUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read_write_uri_main);
mSelectUri = (TextView) findViewById(R.id.textview_uri);
}
public void onClick_SelectUri(View view) {
Intent intent = new Intent(this, UriListActivity.class);
startActivityForResult(intent, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == 1) {
mUri = data.getStringExtra("uri");
mSelectUri.setText(mUri);
}
}
@Override
public void onNewIntent(Intent intent) {
if (mUri == null) {
Intent myIntent = new Intent(this, ShowNFCTagContentActivity.class);
myIntent.putExtras(intent);
myIntent.setAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
startActivity(myIntent);
} else {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NdefMessage ndefMessage = new NdefMessage(
new NdefRecord[] {createUriRecord(mUri)});
if (writeTag(ndefMessage, tag)) {
mUri = null;
mSelectUri.setText("");
}
}
}
public NdefRecord createUriRecord(String uriStr) {
byte prefix = 0;
// Найти соответствующий префикс из набора префиксов uri и получить соответствующий идентификационный код
for (Byte b : UriRecord.URI_PREFIX_MAP.keySet()) {
// Преобразование префикса Uri в нижний регистр
String prefixStr = UriRecord.URI_PREFIX_MAP.get(b).toLowerCase();
// Префикс не является пустой строкой
if ("".equals(prefixStr))
continue;
// Сравнить префикс Uri
if (uriStr.toLowerCase().startsWith(prefixStr)) {
// Префикс Uri в байтах
prefix = b;
// Перехватывать другие части полного Uri, кроме префикса Uri
uriStr = uriStr.substring(prefixStr.length());
break;
}
}
// Создаем байтовый массив для Uri, хранящийся в метке
byte[] data = new byte[1   uriStr.length()];
// Укажите первый байт в качестве идентификационного кода префикса Uri
data[0] = prefix;
// Копируем остаток в байтовый массив данных
System.arraycopy(uriStr.getBytes(), 0, data, 1, uriStr.length());
// Создать объект NdefRecord, который инкапсулирует URI
NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
NdefRecord.RTD_URI, new byte[0], data);
// Возвращаем объект NdefRecord
return record;
}
boolean writeTag(NdefMessage message, Tag tag) {
int size = message.toByteArray().length;
try {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if (!ndef.isWritable()) {
Toast.makeText (это «тег NFC только для чтения!», Toast.LENGTH_LONG)
.show();
return false;
}
if (ndef.getMaxSize() < size) {
Toast.makeText (это «Недостаточно места для метки NFC!», Toast.LENGTH_LONG)
.show();
return false;
}
ndef.writeNdefMessage(message);
Toast.makeText (это «Данные успешно записаны!», Toast.LENGTH_LONG) .show ();
return true;
} else {
NdefFormatable format = NdefFormatable.get(tag);
if (format != null) {
try {
format.connect();
format.format(message);
Toast.makeText (это «Данные успешно записаны!», Toast.LENGTH_LONG)
.show();
return true;
} catch (Exception e) {
Toast.makeText (это «Не удалось записать данные в формате NDEF!», Toast.LENGTH_LONG)
.show();
return false;
}
} else {
Toast.makeText (это «Теги NFC не поддерживают формат NDEF!», Toast.LENGTH_LONG)
.show();
return false;
}
}
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
return false;
}
}
}

UriListActivity:

package mobile.android.read.write.uri;
import android.app.ListActivity;
import android.content.Intent;
import android.graphics.Camera;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.SimpleAdapter;
public class UriListActivity extends ListActivity implements
OnItemClickListener {
private String uris[] = new String[] {"http://www.google.com",
"http://www.apple.com", "http://developer.apple.com",
"http://www.126.com", "ftp://192.168.17.160",
"https://192.168.17.120", "smb://192.168.17.100"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, uris);
setListAdapter(arrayAdapter);
getListView().setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Intent intent = new Intent();
intent.putExtra("uri", uris[position]);
setResult(1, intent);
finish();
}
}

ShowNFCTagContentActivity:

package mobile.android.read.write.uri;
import mobile.android.read.write.uri.library.UriRecord;
import android.app.Activity;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView;
public class ShowNFCTagContentActivity extends Activity {
private TextView mTagContent;
private Tag      mDetectedTag;
private String   mTagText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_nfctag_content);
mTagContent = (TextView) findViewById(R.id.textview_tag_content);
mDetectedTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(mDetectedTag);
mTagText = ndef.getType ()   " nМаксимальная емкость данных:"   ndef.getMaxSize ()
" bytesnn";
readNFCTag();
mTagContent.setText(mTagText);
}
private void readNFCTag() {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage ndefMessage = null;
int contentSize = 0;
if (rawMsgs != null) {
if (rawMsgs.length > 0) {
ndefMessage = (NdefMessage) rawMsgs[0];
contentSize = ndefMessage.toByteArray().length;
} else {
return;
}
}
try {
NdefRecord record = ndefMessage.getRecords()[0];
UriRecord uriRecord = UriRecord
.parse(ndefMessage.getRecords()[0]);
mTagText  = uriRecord.getUri().toString()   "nnUrin"
contentSize   " bytes";
} catch (Exception e) {
mTagContent.setText(e.getMessage());
}
}
}
}

UriRecord.java

package mobile.android.read.write.uri.library;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import android.net.Uri;
import android.nfc.NdefRecord;
public class UriRecord {
// Префикс Uri карты и соответствующее значение
public static final Map<Byte, String> URI_PREFIX_MAP = new HashMap<Byte, String>();
static {
// Устанавливаем префикс Uri, поддерживаемый спецификацией NDEF Uri. При синтаксическом анализе полезной нагрузки необходимо найти соответствующий префикс uri в соответствии с первым байтом полезной нагрузки.
URI_PREFIX_MAP.put((byte) 0x00, "");
URI_PREFIX_MAP.put((byte) 0x01, "http://www.");
URI_PREFIX_MAP.put((byte) 0x02, "https://www.");
URI_PREFIX_MAP.put((byte) 0x03, "http://");
URI_PREFIX_MAP.put((byte) 0x04, "https://");
URI_PREFIX_MAP.put((byte) 0x05, "tel:");
URI_PREFIX_MAP.put((byte) 0x06, "mailto:");
URI_PREFIX_MAP.put((byte) 0x07, "ftp://anonymous:[email protected]");
URI_PREFIX_MAP.put((byte) 0x08, "ftp://ftp.");
URI_PREFIX_MAP.put((byte) 0x09, "ftps://");
URI_PREFIX_MAP.put((byte) 0x0A, "sftp://");
URI_PREFIX_MAP.put((byte) 0x0B, "smb://");
URI_PREFIX_MAP.put((byte) 0x0C, "nfs://");
URI_PREFIX_MAP.put((byte) 0x0D, "ftp://");
URI_PREFIX_MAP.put((byte) 0x0E, "dav://");
URI_PREFIX_MAP.put((byte) 0x0F, "news:");
URI_PREFIX_MAP.put((byte) 0x10, "telnet://");
URI_PREFIX_MAP.put((byte) 0x11, "imap:");
URI_PREFIX_MAP.put((byte) 0x12, "rtsp://");
URI_PREFIX_MAP.put((byte) 0x13, "urn:");
URI_PREFIX_MAP.put((byte) 0x14, "pop:");
URI_PREFIX_MAP.put((byte) 0x15, "sip:");
URI_PREFIX_MAP.put((byte) 0x16, "sips:");
URI_PREFIX_MAP.put((byte) 0x17, "tftp:");
URI_PREFIX_MAP.put((byte) 0x18, "btspp://");
URI_PREFIX_MAP.put((byte) 0x19, "btl2cap://");
URI_PREFIX_MAP.put((byte) 0x1A, "btgoep://");
URI_PREFIX_MAP.put((byte) 0x1B, "tcpobex://");
URI_PREFIX_MAP.put((byte) 0x1C, "irdaobex://");
URI_PREFIX_MAP.put((byte) 0x1D, "file://");
URI_PREFIX_MAP.put((byte) 0x1E, "urn:epc:id:");
URI_PREFIX_MAP.put((byte) 0x1F, "urn:epc:tag:");
URI_PREFIX_MAP.put((byte) 0x20, "urn:epc:pat:");
URI_PREFIX_MAP.put((byte) 0x21, "urn:epc:raw:");
URI_PREFIX_MAP.put((byte) 0x22, "urn:epc:");
URI_PREFIX_MAP.put((byte) 0x23, "urn:nfc:");
}
private final Uri                     mUri;
private UriRecord(Uri uri) {
this.mUri = uri;
}
// Получить разобранный Uri
public Uri getUri() {
return mUri;
}
public static UriRecord parse(NdefRecord record) {
// Получить TNF
short tnf = record.getTnf();
// TNF - это TNF_WELL_KNOWN, Uri использует префикс
if (tnf == NdefRecord.TNF_WELL_KNOWN) {
return parseWellKnown(record);
}
// TNF - это TNF_ABSOLUTE_URI, то есть абсолютный Uri, без использования префикса
else if (tnf == NdefRecord.TNF_ABSOLUTE_URI) {
return parseAbsolute(record);
}
throw new IllegalArgumentException("Unknown TNF "   tnf);
}
/** Parse and absolute URI record */
private static UriRecord parseAbsolute(NdefRecord record) {
// Прямое преобразование полезной нагрузки в URI
byte[] payload = record.getPayload();
Uri uri = Uri.parse(new String(payload, Charset.forName("UTF-8")));
return new UriRecord(uri);
}
/** Parse an well known URI record */
private static UriRecord parseWellKnown(NdefRecord record) {
// Проверяем, является ли RTD RTD_URI
if (!Arrays.equals(record.getType(), NdefRecord.RTD_URI))
return null;
byte[] payload = record.getPayload();
/*
* payload[0] contains the URI Identifier Code, per the NFC Forum
* "URI Record Type Definition" section 3.2.2.
* 
* payload[1]...payload[payload.length - 1] contains the rest of the
* URI.
*/
// полезная нагрузка [0] включает идентификационный код URI, который является ключом в URI_PREFIX_MAP
// Получить префикс Uri на основе идентификационного кода Uri
String prefix = URI_PREFIX_MAP.get(payload[0]);
// Получить количество байтов, занятых префиксом Uri
byte[] prefixBytes = prefix.getBytes(Charset.forName("UTF-8"));
// Создать байтовый массив для хранения полного Uri
byte[] fullUri = new byte[prefixBytes.length   payload.length - 1];
// Объединяем префикс Uri с остальными, чтобы сформировать полный Uri
System.arraycopy(prefixBytes, 0, fullUri, 0, prefixBytes.length);
System.arraycopy(payload, 1, fullUri, prefixBytes.length,
payload.length - 1);
// Создание объекта Uri на основе проанализированного Uri
Uri uri = Uri.parse(new String(fullUri, Charset.forName("UTF-8")));
// Создать объект UriRecord и вернуть
return new UriRecord(uri);
}
}

Файл манифеста:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mobile.android.read.write.uri"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.NFC" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".ReadWriteUriMainActivity"
android: label = "Uri для чтения и записи тегов NFC"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="ftp" />
</intent-filter>
</activity>
<activity
android:name=".ShowNFCTagContentActivity"
android: label = "Показать содержимое тега NFC" />
<activity
android:name=".UriListActivity"
android: label = "Select Uri" />
</application>
</manifest>

Пример программы AAR:

AutoRunApplicationActivity:

package mobile.android.auto.run.application;
import java.net.URI;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.nfc.tech.NdefFormatable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class AutoRunApplicationActivity extends Activity {
private Button        mSelectAutoRunApplication;
private String        mPackageName;
private NfcAdapter    mNfcAdapter;
private PendingIntent mPendingIntent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auto_run_application);
mSelectAutoRunApplication = (Button) findViewById(R.id.button_select_auto_run_application);
// Получить объект по умолчанию NfcAdapter
mNfcAdapter = mNfcAdapter.getDefaultAdapter(this);
// Создаем объект PendingIntent, связанный с текущей деятельностью
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()), 0);
}
// Когда окно получает фокус, оно повышает приоритет текущего окна для обработки тегов NFC
@Override
public void onResume() {
super.onResume();
// Повышаем приоритет текущей обработки тегов NFC
if (mNfcAdapter != null)
mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null,
null);
}
// Вызов метода, когда для launchMode окна установлено значение singleTop (метод onCreat больше не вызывается)
@Override
public void onNewIntent(Intent intent) {
// Сначала нужно выбрать пакет
if (mPackageName == null)
return;
// Получить объект, представляющий текущую метку
Tag detectedTag = intent.getParcelableExtra(mNfcAdapter.EXTRA_TAG);
// Записать пакет на этикетку
writeNFCTag(detectedTag);
}
// Когда окно теряет фокус, состояние системы Android по умолчанию для обработки тегов NFC должно быть восстановлено
@Override
public void onPause() {
super.onPause();
// Восстанавливаем приоритет по умолчанию для окна, которое обрабатывает теги NFC (отключить обработку приоритета тегов NFC для текущего окна)
if (mNfcAdapter != null)
mNfcAdapter.disableForegroundDispatch(this);
}
// Нажмите метод события для кнопки «Выбрать установленное приложение»
public void onClick_SelectAutoRunApplication(View view) {
Intent intent = new Intent(this, InstalledApplicationListActivity.class);
// Показать окно «Установленные приложения»
startActivityForResult(intent, 0);
}
// Записать данные на метку
public void writeNFCTag(Tag tag) {
// Необходимо указать объект Tag
if (tag == null) {
Toast.makeText (это, «Тег NFC не установил соединение», Toast.LENGTH_LONG) .show ();
return;
}
// Создать объект NdefMessage
//NdefRecord.creatApplicationRecord метод создает объект NdefRecord, который инкапсулирует пакет
NdefMessage ndefMessage = new NdefMessage(
new NdefRecord[] {NdefRecord
.createApplicationRecord(mPackageName)});
// Получить размер объекта NdefMessage
int size = ndefMessage.toByteArray().length;
try {
// Получить объект Ndef
Ndef ndef = Ndef.get(tag);
// Обработка данных в формате NDEF
if (ndef != null) {
// Разрешить операцию ввода-вывода над тегами, подключиться
ndef.connect();
// Тег NFC недоступен для записи (только для чтения)
if (!ndef.isWritable()) {
Toast.makeText (это «тег NFC только для чтения!», Toast.LENGTH_LONG)
.show();
return;
}
// Недостаточно места для тегов NFC
if (ndef.getMaxSize() < size) {
Toast.makeText (это «Недостаточно места для метки NFC!», Toast.LENGTH_LONG)
.show();
return;
}
// Записать данные в тег NFC
ndef.writeNdefMessage(ndefMessage);
Toast.makeText (это «Данные успешно записаны!», Toast.LENGTH_LONG) .show ();
} else {
// Создать объект NdefFormatable
NdefFormatable format = NdefFormatable.get(tag);
if (format != null) {
try {
// Разрешить операцию ввода-вывода тега для подключения
format.connect();
// Переформатировать тег NFC и записать данные
format.format(ndefMessage);
Toast.makeText (это «Данные успешно записаны!», Toast.LENGTH_LONG)
.show();
} catch (Exception e) {
Toast.makeText (это «Не удалось записать данные в формате NDEF!», Toast.LENGTH_LONG)
.show();
}
} else {
Toast.makeText (это «Теги NFC не поддерживают формат NDEF!», Toast.LENGTH_LONG)
.show();
}
}
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 1) {
// Обновляем отображаемый текст кнопки «Выбрать установленное приложение» (имя пакета и метка)
mSelectAutoRunApplication.setText(data.getExtras().getString(
"package_name"));
// Следующий код используется для извлечения имени пакета
String temp = mSelectAutoRunApplication.getText().toString();
mPackageName = temp.substring(temp.indexOf("n")   1);
}
}
}

InstalledApplicationListActivity:

package mobile.android.auto.run.application;
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
public class InstalledApplicationListActivity extends ListActivity implements
OnItemClickListener {
// Используется для сохранения пакета и метки установленного приложения
private List<String> mPackages = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Получить объект PackageManager
PackageManager packageManager = getPackageManager();
// Получить информацию обо всех приложениях, установленных в системе, каждый объект PackageInfo представляет приложение
List<PackageInfo> packageInfos = packageManager
.getInstalledPackages(PackageManager.GET_ACTIVITIES);
// Перечисляем всю информацию о приложении, удаляем из нее пакет и метку приложения и используем « n» для их разделения
for (PackageInfo packageInfo : packageInfos) {
// Значение, возвращаемое методом LoadLabel, является значением свойства android: label, когда определено действие
mPackages.add(packageInfo.applicationInfo.loadLabel(packageManager)
"n"   packageInfo.packageName);
}
// Создаем объект ArrayAdapter для работы с коллекцией Package
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1,
mPackages);
// Показать все имена пакетов и программ в элементе управления ListView
setListAdapter(arrayAdapter);
// Нажмите метод события указанного элемента списка
getListView().setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Intent intent = new Intent();
// При нажатии на элемент списка пакет и метка будут возвращены через имя_пакета
intent.putExtra("package_name", mPackages.get(position));
setResult(1, intent);
finish();
}
}

Файл манифеста:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mobile.android.auto.run.application"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.NFC" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".AutoRunApplicationActivity"
android:label="@string/title_activity_auto_run_application"
android:launchMode="singleTop"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".InstalledApplicationListActivity"
android:label="@string/title_activity_installed_application_list"
android:screenOrientation="portrait" />
</application>
</manifest>

Откройте веб-сайт автоматически через ваш браузер:

package mobile.android.auto.open.uri;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.nfc.tech.NdefFormatable;
import android.os.Bundle;
import android.widget.Toast;
public class AutoOpenUriActivity extends Activity {
private NfcAdapter    nfcAdapter;
private PendingIntent pendingIntent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auto_open_uri);
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()), 0);
}
@Override
public void onResume() {
super.onResume();
if (nfcAdapter != null)
nfcAdapter
.enableForegroundDispatch(this, pendingIntent, null, null);
}
@Override
public void onNewIntent(Intent intent) {
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
writeNFCTag(detectedTag);
}
@Override
public void onPause() {
super.onPause();
if (nfcAdapter != null)
nfcAdapter.disableForegroundDispatch(this);
}
public void writeNFCTag(Tag tag) {
if (tag == null) {
Toast.makeText (это, «Тег NFC не установил соединение», Toast.LENGTH_LONG) .show ();
return;
}
// NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]
// { NdefRecord.createUri("http://blog.csdn.net/nokiaguy")});
NdefMessage ndefMessage = new NdefMessage(
new NdefRecord[] {NdefRecord.createUri(Uri
.parse("http://www.baidu.com"))});
int size = ndefMessage.toByteArray().length;
try {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if (!ndef.isWritable()) {
Toast.makeText (это «тег NFC только для чтения!», Toast.LENGTH_LONG)
.show();
return;
}
if (ndef.getMaxSize() < size) {
Toast.makeText (это «Недостаточно места для метки NFC!», Toast.LENGTH_LONG)
.show();
return;
}
ndef.writeNdefMessage(ndefMessage);
Toast.makeText (это «Данные успешно записаны!», Toast.LENGTH_LONG) .show ();
} else {
NdefFormatable format = NdefFormatable.get(tag);
if (format != null) {
try {
format.connect();
format.format(ndefMessage);
Toast.makeText (это «Данные успешно записаны!», Toast.LENGTH_LONG)
.show();
} catch (Exception e) {
Toast.makeText (это «Не удалось записать данные в формате NDEF!», Toast.LENGTH_LONG)
.show();
}
} else {
Toast.makeText (это «Теги NFC не поддерживают формат NDEF!», Toast.LENGTH_LONG)
.show();
}
}
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}

Прикрепите официальный учебник: http://developer.android.com/guide/topics/connectivity/nfc/nfc.html

Добавить комментарий

Ваш адрес email не будет опубликован.

Adblock
detector