如何读取NDEF讯息和NFC标签记录? [英] How to read NDEF Msg and Records of NFC tag?
问题描述
我正在阅读NDEF消息和记录
I am Working with Reading NDEF Msg and Records
在这里,我已经通过此操作完成了阅读ID
Here I have done with Reading ID by using this
public class MainActivity extends Activity {
// list of NFC technologies detected:
private final String[][] techList = new String[][] {
new String[] {
NfcA.class.getName(),
NfcB.class.getName(),
NfcF.class.getName(),
NfcV.class.getName(),
IsoDep.class.getName(),
MifareClassic.class.getName(),
MifareUltralight.class.getName(), Ndef.class.getName()
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main_activity, menu);
return true;
}
@Override
protected void onResume() {
super.onResume();
// creating pending intent:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
// creating intent receiver for NFC events:
IntentFilter filter = new IntentFilter();
filter.addAction(NfcAdapter.ACTION_TAG_DISCOVERED);
filter.addAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
filter.addAction(NfcAdapter.ACTION_TECH_DISCOVERED);
// enabling foreground dispatch for getting intent from NFC event:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, new IntentFilter[]{filter}, this.techList);
}
@Override
protected void onPause() {
super.onPause();
// disabling foreground dispatch:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.disableForegroundDispatch(this);
}
@Override
protected void onNewIntent(Intent intent) {
if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED) || intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED) || intent.getAction().equals(NfcAdapter.ACTION_TECH_DISCOVERED)) {
((TextView)findViewById(R.id.text)).setText(
"NFC Tag\n" +
ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)));
}
}
private String ByteArrayToHexString(byte [] inarray) {
int i, j, in;
String [] hex = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
String out= "";
for(j = 0 ; j < inarray.length ; ++j)
{
in = (int) inarray[j] & 0xff;
i = (in >> 4) & 0x0f;
out += hex[i];
i = in & 0x0f;
out += hex[i];
}
return out;
}
}
此处读取的是记录[0]的标记ID
Here Reading Tag ID which is Record[0]
以类似的方式,我想以相同的程序和相同的方式读取NDEF消息和记录...我们有很多方式
In the Similar way I want to Read NDEF msg and Records both in the same Program and Same way... We have many ways
我在这里尝试过
if (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
Ndef ndef = Ndef.get(tag);
if (ndef == null) {
// NDEF is not supported by this Tag.
return;
}
NdefMessage ndefMessage = ndef.getCachedNdefMessage();
NdefRecord[] records = ndefMessage.getRecords();
for (NdefRecord ndefRecord : records) {
//read each record
}
但是我无法读取记录..任何人都可以建议我阅读NDEF消息并在我的代码中记录....
But I am Unable to read Records.. can any one suggest me to Read NDEF msg and records in my code....
更新
我已在清单中添加了它.
I have added this at manifest..
<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"/>
<data android:mimeType="text/plain" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>*
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data
android:name="android.nfc.action.TAG_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
但是我仍然需要使用NfcAdapter.EXTRA_NDEF_MESSAGES
,任何人都可以告诉我如何在我的代码中使用它而不影响或更改NfcAdapter.EXTRA_ID
.
But Still I need to go with NfcAdapter.EXTRA_NDEF_MESSAGES
can any one tell me How to use it in my code with out effecting or changing NfcAdapter.EXTRA_ID
.
推荐答案
- 添加日志以了解会发生什么.
- 从
Intent
中的标签获取 - 您将ByteArray转换为十六进制字符串的函数不是最好的
NDEFMessage
And please read official documentation, all you need is explained:http://developer.android.com/guide/topics/connectivity/nfc/nfc.html#obtain-info
在您的活动"中,使用onNewIntent方法:
In your Activity, method onNewIntent:
@Override
protected void onNewIntent(Intent intent) {
Log.d(TAG, "onNewIntent action=" + intent.getAction());
if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED) || intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED) || intent.getAction().equals(NfcAdapter.ACTION_TECH_DISCOVERED)) {
((TextView)findViewById(R.id.text)).setText(
"NFC Tag\n" +
byteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)));
}
if (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
for (int i = 0; i < rawMsgs.length; i++) {
NdefMessage ndefMessage = (NdefMessage) rawMsgs[i];
NdefRecord[] records = ndefMessage.getRecords();
for (NdefRecord ndefRecord : records) {
//read each record
}
}
}
}
}
/**
* convert byte array to a hexadecimal string
*
* @param bArray
* byte array to convert
* @return hexadecimal string
*/
public static String byteArrayToHexString(byte[] bArray) {
StringBuffer buffer = new StringBuffer();
for (byte b : bArray) {
buffer.append(byteToHexString(b));
buffer.append(" ");
}
return buffer.toString().toUpperCase(Locale.getDefault());
}
/**
* convert byte to a hexadecimal string
*
* @param b
* byte to convert
* @return hexadecimal string
*/
public static String byteToHexString(byte b) {
int tmp = b & 0xFF;
if (tmp <= 15) {
return "0".concat(Integer.toHexString(tmp));
} else {
return Integer.toHexString(tmp);
}
}
这篇关于如何读取NDEF讯息和NFC标签记录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!