NFC
reading NFC
About
Mnohé zariadenia bývajú v súčasnosti vybavené NFC senzorom, ktorý umožňuje čítať údaje z rozličných kariet alebo NFC značiek. Základ práce s NFC senzorom v systéme Android si ukážeme na tomto cvičení.
Objectives
- naučiť sa základy práce s NFC senzorom
Content
The Environment
V prvom kroku si pripravíme projekt.
Úloha
Vytvorte nový projekt s názvom Watchman a v ňom prázdnu aktivitu s názvom MainActivity.
Úloha
Pre potreby projektu pripravte manifest.
Začneme tým, že pridáme povolenie pre prácu s NFC senzorom:
<uses-permission android:name="android.permission.NFC" />Hneď za povolením pridáme aj tento riadok:
<uses-feature android:name="android.hardware.nfc" android:required="true" />Pridajte riadok s verziou minimálneho SDK aplikácie (10):
<uses-sdk android:minSdkVersion="10"/>Následne pre aktivitu MainActivity pridáme tento intent filter:
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>Úloha
Upravte vlastnosti textového pohľadu v aktivite.
V aktivite sa po vytvorení nachádza práve jeden textový pohľad. Budeme ho používať na zobrazenie ID načítanej karty. Tento pohľad:
- premenujte na
card_id - nastavte tak, aby predvoleným textom bol reťazec
No Card - nastavte tak, aby veľkosť textu bola
40sp
Úloha
Overte dostupnosť senzoru NFC na vašom zariadení a v prípade, že sa na ňom NFC nenachádza, ukončite aplikáciu.
Overiť dostupnosť NFC je možné opäť viacerými spôsobmi. Je možné ju overiť napr. pomocou package managera:
packageManager.hasSystemFeature(PackageManager.FEATURE_NFC)Rovnako tak je možné vyžiadať predvolený NFC adaptér volaním NfcAdapter.getDefaultAdapter(this) a kontrolu vykonať na základe jeho návratovej hodnoty:
this.nfcAdapter = NfcAdapter.getDefaultAdapter(this);
// check the support for NFC
if(this.nfcAdapter == null){
Toast.makeText(this, "This device doesn't support NFC.", Toast.LENGTH_SHORT).show();
Log.e(TAG, "This device doesn't support NFC.");
finish();
return;
}Úloha
Po overení, či zariadenie obsahuje NFC tiež overte, či je zapnuté.
Ak aj zariadenie NFC obsahuje, nemusí byť ešte zapnuté. V prípade, že je to tak, vyzvite používateľa, aby ho zapol.
if(this.nfcAdapter.isEnabled() == false){
Toast.makeText(this, "NFC is disabled.", Toast.LENGTH_SHORT).show();
Log.e(TAG, "NFC is disabled.");
finish();
return;
}Poznámka
Používateľa môžete rovno navigovať do príslušných nastavení. To zabezpečíte spustením aktivity s nastaveným Intet objektom.
Tu však pozor! Toto nastavenie sa líši v závislosti od použitej verzie SDK:
- ak sa jedná o verziu SDK >= 16,
Intentvytvorte sandroid.provider.Settings.ACTION_NFC_SETTINGS - ak sa jedná o staršiu verziu,
Intentvytvorte sandroid.provider.Settings.ACTION_WIRELESS_SETTINGS
Úloha
Overte svoju aplikáciu.
Po spustení aplikácie sa zobrazí aktivita. Ak ju však minimalizujete alebo vypnete a priložíte k zariadeniu napríklad váš ISIC, aktivita sa znova zobrazí, pretože v okolí zariadenia bol prečítaný NFC Tag.
Poznámka
Pozor, kde kartu prikladáte, pretože ju zariadenie nemusí identifikovať vždy. Snažte sa ju preto prikladať čo najbližšie k senzoru, ktorý býva umiestnený bližšie ku spodnej strane zariadenia.
Search Activity
V tomto kroku prečítame NFC TAG z niektorej vašej karty.
Úloha
Vytvorte metódu onResume(), ktorá sa zavolá každým, keď dôjde k načítaniu NFC Tag-u zariadením.
Android samotný zabezpečí, aby sa naša aktivita spustila vtedy, keď dôjde k načítaniu NFC Tag-u. To znamená, že zavolá metódu onResume(). To, aký Intent objekt a s akou akciou prišiel si môžeme overiť jednoducho týmto fragmentom kódu:
@Override
protected void onResume() {
super.onResume();
Intent intent = getIntent();
Toast.makeText(this,
intent.getAction(),
Toast.LENGTH_LONG).show();
}Úloha
Získajte a prečítajte obsah NFC tagu.
Tag z intent-u získate volaním
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);Zavolaním metódy .toString() nad objektom Tag-u sa o ňom dozviete viac.
Id tag-u je uložené v poli bytov, ku ktorému sa dostaneme volaním metódy getId(). V našom prípade teda zobrazíme jeho hodnotu v hexadecimálnej podobe, ktorú následne vypíšeme do textového pohľadu card_id:
Formatter formatter = new Formatter();
for(byte b: tag.getId()){
formatter.format("%02X", b);
}
TextView tv = (TextView) findViewById(R.id.card_id);
tv.setText(formatter.toString());Úloha
Overte svoje riešenie.
Ak ste postupovali správne, po spustení aplikácie a priložení karty k telefónu sa vám zobrazí jej id v podobe hexadecimálneho výpisu. Overiť hodnotu si môžete napríklad použitím aplikácie NFC Tools.
Additional Links
NFC Tools - NFC Tools is an app which allows you to read, write and program tasks on your NFC tags and other RFID compatible chips.