如何读取NDEF讯息和NFC标签记录? [英] How to read NDEF Msg and Records of NFC tag?

查看:355
本文介绍了如何读取NDEF讯息和NFC标签记录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在阅读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.

推荐答案

  1. 添加日志以了解会发生什么.
  2. Intent
  3. 中的标签获取NDEFMessage
  4. 您将ByteArray转换为十六进制字符串的函数不是最好的

并且请阅读官方文档,其中解释了所有需要的内容:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆