簡體   English   中英

使用NFC讀取RFID標簽

[英]Read RFID tags using NFC

我正在開發一個需要讀取RFID標簽的應用程序。 您能告訴我,Android設備支持哪些RFID標簽,我是否需要額外的硬件或某些東西來讀取RFID標簽,或者只能通過NFC來讀取。 我在上面進行研發,我知道可以通過NFC讀取RFID標簽,並且我在開發人員網站上對代碼進行了整數化處理,但是我無法讀取RFID標簽(用於出席的RFID標簽)

public class NFCForegroundUtil {
    private NfcAdapter nfc;

    private Activity activity;
    private IntentFilter intentFiltersArray[];
    private PendingIntent intent;
    private String techListsArray[][];

    public NFCForegroundUtil(Activity activity) {
        super();
        this.activity = activity;
        nfc = NfcAdapter.getDefaultAdapter(activity.getApplicationContext());

        intent = PendingIntent.getActivity(activity, 0, new Intent(activity,
                activity.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);

        try {
            ndef.addDataType("*/*");
        } catch (IntentFilter.MalformedMimeTypeException e) {
            throw new RuntimeException("Unable to speciy */* Mime Type", e);
        }
        intentFiltersArray = new IntentFilter[] { ndef };

        techListsArray = new String[][] { new String[] {IsoDep.class.getName(),NfcV.class.getName(), NfcA.class.getName(), NfcB.class.getName(), NfcF.class.getName(), Ndef.class.getName(), NdefFormatable.class.getName(), MifareClassic.class.getName(), MifareUltralight.class.getName()} };

    }

    public void enableForeground()
    {
        Log.d("demo", "Foreground NFC dispatch enabled");
        nfc.enableForegroundDispatch(
                activity, intent, intentFiltersArray, techListsArray);
    }

    public void disableForeground()
    {
        Log.d("demo", "Foreground NFC dispatch disabled");
        nfc.disableForegroundDispatch(activity);
    }

    public NfcAdapter getNfc() {
        return nfc;
    }
}

您可以閱讀此主題使用Android手機讀取RFID

NFC家伙評論:

您可以將NFC標簽視為RFID標簽的特例。 更具體地說,Android支持與ISO 14443和ISO 15693兼容的RFID標簽。

以下代碼用於讀取清單中的NFCv(ISO 15693):

    <uses-permission android:name="android.permission.NFC" />

    <activity
        android:name=".SplashActivity">

        <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.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_list">
        </meta-data>
    </activity>

nfc_tech_list.xml將如下所示:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
    <tech>android.nfc.tech.NfcV</tech>     
</tech-list>

然后,您只需要調整您的活動,如果您的應用程序已關閉,則將調用onCreate,如果應用程序已打開,則每次檢測到nfc時都會調用onNewIntent。 首先注冊nfc:

@Override
public void onResume() {
    super.onResume();
    if(checkNFCAvailability())
        mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);
}

@Override
public void onPause() {
    super.onPause();
    mNfcAdapter.disableForegroundDispatch(this);

}

private boolean checkNFCAvailability() {
    PackageManager pm = getPackageManager();

    //NFC NOT AVAILABLE
    if(!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
        return false;
    } else {
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        //NFC AVAILABLE BUT DISABLED
        if(Build.VERSION.SDK_INT >= 16) {
            startActivity(new Intent(Settings.ACTION_NFC_SETTINGS));
        } else {
            startActivity(new Intent(Settings.ACTION_SETTINGS));
        }

        //NFC AVAILABLE AND ENABLED
        else {                  
            mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
            IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
            mFilters = new IntentFilter[] {ndef,};
            mTechLists = new String[][] { new String[] { android.nfc.tech.NfcV.class.getName() } };       
        }
    }
}


@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {

        myTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

        //Do your logic using operations like
        NfcV nfcvTag = NfcV.get(myTag);
        nfcvTag.connect();
        response = nfcvTag.transceive(new byte[]); //your address
        nfcvTag.close();

    }
}

您必須匯入

import android.nfc.Tag;
import android.nfc.tech.NfcV;
import android.content.pm.PackageManager;
import android.nfc.NfcAdapter;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM