How to read NDEF Msg and Records of NFC tag?

2019-08-07 05:24发布

I am Working with Reading NDEF Msg and Records

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;
  }
 }

Here Reading Tag ID which is Record[0]

In the Similar way I want to Read NDEF msg and Records both in the same Program and Same way... We have many ways

Here I have tried with

    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
            }

But I am Unable to read Records.. can any one suggest me to Read NDEF msg and records in my code....

Update

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" />

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.

标签: android nfc ndef
1条回答
叼着烟拽天下
2楼-- · 2019-08-07 06:08
  1. Add log to understand what happens.
  2. Get NDEFMessage from tag in Intent
  3. Your function to convert ByteArray to Hex string is not the best

And please read official documentation, all you need is explained:http://developer.android.com/guide/topics/connectivity/nfc/nfc.html#obtain-info

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);
    }

}
查看更多
登录 后发表回答