简体   繁体   English

如何阅读NDF标签的NDEF消息和记录?

[英]How to read NDEF Msg and Records of NFC tag?

I am Working with Reading NDEF Msg and Records 我正在阅读NDEF消息和记录

Here I have done with Reading ID by using this 在这里,我通过使用此方法完成了阅读ID

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] 此处读取记录ID [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 以类似的方式,我想以相同的程序和方式读取NDEF msg和Records ...我们有很多方式

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.... 但是我无法阅读记录..有人可以建议我阅读NDEF msg并在我的代码中记录....

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 . 但是我仍然需要NfcAdapter.EXTRA_NDEF_MESSAGES可以告诉我如何在我的代码中使用它NfcAdapter.EXTRA_ID影响或更改NfcAdapter.EXTRA_ID

  1. Add log to understand what happens. 添加日志以了解会发生什么。
  2. Get NDEFMessage from tag in Intent Intent标签获取NDEFMessage
  3. Your function to convert ByteArray to Hex string is not the best 您将ByteArray转换为十六进制字符串的函数不是最好的

And please read official documentation, all you need is explained: http://developer.android.com/guide/topics/connectivity/nfc/nfc.html#obtain-info 并且请阅读官方文档,其中对您需要的所有内容进行了说明: http : //developer.android.com/guide/topics/connectivity/nfc/nfc.html#obtain-info

In your Activity, method onNewIntent: 在您的活动中,使用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);
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM