How to read NDEF Msg and Records of NFC tag?

▼魔方 西西 提交于 2019-12-13 00:44:50

问题


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.


回答1:


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

}


来源:https://stackoverflow.com/questions/34306020/how-to-read-ndef-msg-and-records-of-nfc-tag

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!