Я следил за некоторыми учебниками, используя исходный код adam rocker для моего NFCTest. Я хочу иметь возможность читать и писать теги NFC, а также запускать приложение.
Как читать и писать теги Android NFC?
Ответ 1
Служебный проект NDEF Tools for Android помогает сделать следующее
- Определите, затем
- Читать или писать, или
- Beam (push) NFC-контент
Проект также включает привязки данных для всех стандартизированных типов записей NDEF, что действительно упрощает работу по сравнению с работой с классами NDEF (на основе байтового массива), включенными в Android SDK.
Также см. Плагин NFC Eclipse для графического редактора NDEF - поставляется с утилитой , которая читает и записывает метки и лучи, а также имеет интеграцию с читателем NFC.
Кстати, вы ищете Android Application Record для запуска приложения. Функция запуска не требует какой-либо реальной реализации; он встроен в Android> = 4.0, поэтому достаточно поместить эту запись в тег.
Ответ 2
Прежде всего, вам нужно получить разрешение в файле AndroidManifest.xml для NFC. Разрешения:
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" />
Активность, которая будет выполнять операцию чтения/записи NFC, добавляет этот фильтр намерения в эту активность в файле AndroidManifest.xml:
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
В вашем методе onCreate() вы должны инициализировать адаптер NFC и определить ожидающее намерение:
NfcAdapter mAdapter;
PendingIntent mPendingIntent;
mAdapter = NfcAdapter.getDefaultAdapter(this);
if (mAdapter == null) {
//nfc not support your device.
return;
}
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
В onResume() Call back активирует Foreground Dispatch для обнаружения намерений NFC.
mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
В обратном вызове onPause() вам необходимо отключить отправку по почтовому ящику:
if (mAdapter != null) {
mAdapter.disableForegroundDispatch(this);
}
В методе обратного вызова onNewIntent() вы получите новый Nfc Intent. После получения The Intent вы должны проанализировать намерение обнаружить карту:
@Override
protected void onNewIntent(Intent intent){
getTagInfo(intent)
}
private void getTagInfo(Intent intent) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}
Теперь у вас есть тег. Затем вы можете проверить список тегов, чтобы обнаружить этот тег. Метод обнаружения тегов находится здесь Мой другой ответ Полный полный проект находится здесь Мой профиль github
Ответ 3
прежде всего поместите их в свой манифест:
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.INTERNET" />
а затем поместите это в свою активность, которую вы хотите прочитать NFC:
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
в конце добавить вперед, как и моя активность:
/* * Copyright (C) 2010 Проект с открытым исходным кодом Android * Copyright (C) 2011 Адам Нибек * * Лицензия на лицензию Apache, версия 2.0 ( "Лицензия" ); * вы не можете использовать этот файл, кроме как в соответствии с Лицензией. * Вы можете получить копию Лицензии на * * http://www.apache.org/licenses/LICENSE-2.0 * * Если это не предусмотрено действующим законодательством или не согласовано в письменном виде, программное обеспечение * распространяется по лицензии распространяется на "AS IS" BASIS, * БЕЗ ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО ВИДА, явных или подразумеваемых. * См. Лицензию на конкретный язык, регулирующий разрешения и * ограничения по лицензии. */
package ***.***.***.***;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.AnimationDrawable;
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.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.balysv.materialripple.MaterialRippleLayout;
import com.blogspot.android_er.androidnfctagdiscovered.R;
import com.pixelcan.inkpageindicator.InkPageIndicator;
import hpbyp.ir.app.hojre.fragment.slider.SliderPagerAdapter;
import hpbyp.ir.app.hojre.utiles.G;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;
/**
* An {@link Activity} which handles a broadcast of a new tag that the device just discovered.
*/
public class ActivityLoadDataFromNFC extends AppCompatActivity {
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_load_data_from_nfc);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mAdapter = NfcAdapter.getDefaultAdapter(this);
if (mAdapter == null) {
//nfc not support your device.
return;
}
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
}
NfcAdapter mAdapter;
PendingIntent mPendingIntent;
@Override
protected void onResume() {
super.onResume();
mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
}
@Override
protected void onPause() {
super.onPause();
if (mAdapter != null) {
mAdapter.disableForegroundDispatch(this);
}
}
@Override
protected void onNewIntent(Intent intent) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
GetDataFromTag(tag, intent);
}
private void GetDataFromTag(Tag tag, Intent intent) {
Ndef ndef = Ndef.get(tag);
try {
ndef.connect();
// txtType.setText(ndef.getType().toString());
// txtSize.setText(String.valueOf(ndef.getMaxSize()));
// txtWrite.setText(ndef.isWritable() ? "True" : "False");
Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (messages != null) {
NdefMessage[] ndefMessages = new NdefMessage[messages.length];
for (int i = 0; i < messages.length; i++) {
ndefMessages[i] = (NdefMessage) messages[i];
}
NdefRecord record = ndefMessages[0].getRecords()[0];
byte[] payload = record.getPayload();
String text = new String(payload);
Log.e("tag", "vahid" + text);
ndef.close();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Cannot Read From Tag.", Toast.LENGTH_LONG).show();
}
}
}
Ответ 4
Я думаю, что код, который вы нашли, относится к эпохе до 2.3.3. На данный момент он не смог написать тег, но с Android 2.3.3 это возможно. Нет необходимости пытаться взломать систему и написать теги, подобные этому.
Взгляните на демонстрационный проект NFC: http://developer.android.com/resources/samples/NFCDemo/index.html
Ответ 5
Вы можете найти простую библиотеку NFC с примером здесь: https://github.com/mateuyabar/pillowNFC