如何正确读取nfc标签

时间:2014-10-28 10:19:03

标签: android nfc

我正确设置了NFC环境:

  • 技术过滤器

    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
        <tech-list>
           <tech>android.nfc.tech.NfcA</tech>
           <tech>android.nfc.tech.NdefFormatable</tech>
        </tech-list>
    </resources>
    
  • 清单中的
  • <uses-permission android:name="android.permission.NFC" />
    
    <uses-feature android:name="android.hardware.nfc" />
    
    <activity android:name=".ui.ScanActivity">
    
            <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
    
            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_tech_filter" />
    </activity>
    
  • 代码(活动,通过阅读nfc标签创建后的一段时间)

    Intent intent = getIntent();
    
    if (intent != null) {
        String action = intent.getAction();
            if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
                Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    

就是这样,rawMsgs总是为空,虽然我手机上的应用程序完全读取相同的标签,显示标签包含的数据。 我哪里错了?

2 个答案:

答案 0 :(得分:2)

有各种类型的nfc标签(例如Mifare Ultralight,Mifare Ultralight C,Mifare Classic,felica ......)。每个标签都有不同的内存大小和读取过程。例如:Mifare Ultralight有64字节,但mifare Classic 1k包含1千字节内存。要从mifare ultralight读取数据,不需要额外的身份验证,但Mifare classic需要身份验证。获得新意图时您可以解析它以获取标记信息: 首先,您必须初始化NFC适配器并在onCreate回调中定义Pending Intent:

 NfcAdapter mAdapter;
PendingIntent mPendingIntent;
mAdapter = NfcAdapter.getDefaultAdapter(this);      

    if (mAdapter == null) {
        //nfc not support your device.
        return;
    }
    mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
            getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

在onResume()中回调启用Foreground Dispatch以检测NFC意图。

mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);

在onPause()回调中,您必须禁用forground dispatch:

if (mAdapter != null) {
    mAdapter.disableForegroundDispatch(this);
}

在onNewIntent()回调方法中,您将获得新的Nfc Intent。获得The Intent后,您必须解析检测卡的意图:

 @Override
protected void onNewIntent(Intent intent){    
    getTagInfo(intent)
     }

private void getTagInfo(Intent intent) {
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    }

这里有标签。要了解完全标记类型,这里是my Answer 完整项目位于my Github Repo

答案 1 :(得分:0)

尝试在清单中为NDEF_DISCOVERED和TAG_DISCOVERED添加intent-filters。和技术过滤器中的android.nfc.tech.Ndef。