Почему я получаю перевернутый идентификатор тега NFC (шестнадцатеричный)?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему я получаю перевернутый идентификатор тега NFC (шестнадцатеричный)?

Сообщение Anonymous »

Я хочу, чтобы мое приложение сканировало тег NFC и получало его идентификатор и тип тега. Но каким-то образом мой код считывает обратный идентификатор тега.

Например, мое приложение считывает следующий идентификатор тега (шестнадцатеричный): 80 65 69 e2 f5 fe 04
в то время как 4 других подобных приложения из Google Play Store считывают следующий идентификатор: 4 fe f5 e2 69 65 80 (где также отсутствует первый ноль)

Я хочу, чтобы мое приложение читало тег ID без возврата байтов, как мне этого добиться? Вот мой полный код:

package com.asetnfc;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.IsoDep;
import android.nfc.tech.MifareClassic;
import android.nfc.tech.MifareUltralight;
import android.nfc.tech.Ndef;
import android.nfc.tech.NfcA;
import android.nfc.tech.NfcB;
import android.nfc.tech.NfcF;
import android.nfc.tech.NfcV;
import android.os.AsyncTask;
import android.os.Parcelable;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

import static android.content.ContentValues.TAG;

//public class MainActivity extends AppCompatActivity {

public class InfoNFC extends Activity {
private TextView mTextView; //ECP 2017-01-16

// 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.infonfc);

mTextView = (TextView) findViewById(R.id.infonfctype);
mTextView.setText("Data Tampil Disini");
}

@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, menu);
return true;
}

@Override
protected void onResume() {
super.onResume();
Log.d("onResume", "1");

//mTextView.setText("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();

Log.d("onPause", "1");

// disabling foreground dispatch:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.disableForegroundDispatch(this);
}

@Override
protected void onNewIntent(Intent intent) {
Log.d("onNewIntent", "1");

if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
Log.d("onNewIntent", "2");
mTextView.setText( "NFC Tag\n" + ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)));

//if(getIntent().hasExtra(NfcAdapter.EXTRA_TAG)){

Parcelable tagN = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tagN != null) {
Log.d(TAG, "Parcelable OK");
NdefMessage[] msgs;
byte[] empty = new byte[0];
byte[] id = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
byte[] payload = dumpTagData(tagN).getBytes();
NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, id, payload);
NdefMessage msg = new NdefMessage(new NdefRecord[] { record });
msgs = new NdefMessage[] { msg };

//Log.d(TAG, msgs[0].toString());

}
else {
Log.d(TAG, "Parcelable NULL");
}

Parcelable[] messages1 = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (messages1 != null) {
Log.d(TAG, "Found " + messages1.length + " NDEF messages");
}
else {
Log.d(TAG, "Not EXTRA_NDEF_MESSAGES");
}

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(tag);
if(ndef != null) {

Log.d("onNewIntent:", "NfcAdapter.EXTRA_TAG");

Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (messages != null) {
Log.d(TAG, "Found " + messages.length + " NDEF messages");
}
}
else {
Log.d(TAG, "Write to an unformatted tag not implemented");
}

//mTextView.setText( "NFC Tag\n" + ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_TAG)));
}
}

private String dumpTagData(Parcelable p) {
StringBuilder sb = new StringBuilder();
Tag tag = (Tag) p;
byte[] id = tag.getId();
sb.append("Tag ID (hex): ").append(getHex(id)).append("\n");
sb.append("Tag ID (dec): ").append(getDec(id)).append("\n");

String prefix = "android.nfc.tech.";
sb.append("Technologies: ");
for (String tech : tag.getTechList()) {
sb.append(tech.substring(prefix.length()));
sb.append(", ");
}
sb.delete(sb.length() - 2, sb.length());
for (String tech : tag.getTechList()) {
if (tech.equals(MifareClassic.class.getName())) {
sb.append('\n');
MifareClassic mifareTag = MifareClassic.get(tag);
String type = "Unknown";
switch (mifareTag.getType()) {
case MifareClassic.TYPE_CLASSIC:
type = "Classic";
break;
case MifareClassic.TYPE_PLUS:
type = "Plus";
break;
case MifareClassic.TYPE_PRO:
type = "Pro";
break;
}
sb.append("Mifare Classic type: ");
sb.append(type);
sb.append('\n');

sb.append("Mifare size: ");
sb.append(mifareTag.getSize() + " bytes");
sb.append('\n');

sb.append("Mifare sectors: ");
sb.append(mifareTag.getSectorCount());
sb.append('\n');

sb.append("Mifare blocks: ");
sb.append(mifareTag.getBlockCount());
}

if (tech.equals(MifareUltralight.class.getName())) {
sb.append('\n');
MifareUltralight mifareUlTag = MifareUltralight.get(tag);
String type = "Unknown";
switch (mifareUlTag.getType()) {
case MifareUltralight.TYPE_ULTRALIGHT:
type = "Ultralight";
break;
case MifareUltralight.TYPE_ULTRALIGHT_C:
type = "Ultralight C";
break;
}
sb.append("Mifare Ultralight type: ");
sb.append(type);
}
}
Log.d("Datos: ", sb.toString());

mTextView.setText('\n' + sb.toString());
return sb.toString();
}

private String getHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = bytes.length - 1; i >= 0; --i) {
int b = bytes & 0xff;
if (b < 0x10)
sb.append('0');
sb.append(Integer.toHexString(b));
if (i > 0) {
sb.append(" ");
}
}
return sb.toString();
}

private long getDec(byte[] bytes) {
long result = 0;
long factor = 1;
for (int i = 0; i < bytes.length; ++i) {
long value = bytes & 0xffl;
result += value * factor;
factor *= 256l;
}
return result;
}

private String ByteArrayToHexString(byte [] inarray) {

Log.d("ByteArrayToHexString", inarray.toString());

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 = in & 0x0f;
out += hex;
}
//CE7AEED4
//EE7BEED4
Log.d("ByteArrayToHexString", String.format("%0" + (inarray.length * 2) + "X", new BigInteger(1,inarray)));

return out;
}

}



Подробнее здесь: https://stackoverflow.com/questions/602 ... tag-id-hex
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»