本文轉載自:http://www.cnblogs.com/jyycnblogs/p/5077609.html
Android支持的數據格式
數據格式的Intent filter
AndroidManifest.xml文件中,要像向下列示例那樣,在<activity>元素內的<meta-data>元素中指定你創建的資源文件:
- <activity>
- ...
- <intent-filter>
- <action android:name="android.nfc.action.TECH_DISCOVERED" />
- </intent-filter>
- <meta-data
- android:name="android.nfc.action.TECH_DISCOVERED"
- android:resource="@xml/nfc_tech_filter" />
- ...
- </activity>
nfc_tech_filter.xml文件(一個Tag標籤只有全部匹配tech-list元素中的tech元素指定的nfc芯片時才認爲被匹配):
- <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <tech-list>
- <tech>android.nfc.tech.IsoDep</tech>
- <tech>android.nfc.tech.NfcA</tech>
- <tech>android.nfc.tech.NfcB</tech>
- <tech>android.nfc.tech.NfcF</tech>
- <tech>android.nfc.tech.NfcV</tech>
- <tech>android.nfc.tech.Ndef</tech>
- <tech>android.nfc.tech.NdefFormatable</tech>
- <tech>android.nfc.tech.MifareClassic</tech>
- <tech>android.nfc.tech.MifareUltralight</tech>
- </tech-list>
- </resources>
也可創建多個資源文件(多個資源文件是OR關係,每個資源文件中的芯片是AND關係):
- <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <tech-list>
- <tech>android.nfc.tech.NfcA</tech>
- <tech>android.nfc.tech.Ndef</tech>
- <tech>android.nfc.tech.NdefFormatable</tech>
- </tech-list>
- </resources>
- <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <tech-list>
- <tech>android.nfc.tech.Ndef</tech>
- <tech>android.nfc.tech.NdefFormatable</tech>
- </tech-list>
- </resources>
或者在同一個資源文件中創建多個<tech-list>元素(多個<tech-list>元素之間是OR關係,<tech-list>元素中的<tech>是AND關係):
- <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <tech-list>
- <tech>android.nfc.tech.NfcA</tech>
- </tech-list>
- <tech-list>
- <tech>android.nfc.tech.NfcB</tech>
- </tech-list>
- <tech-list>
- <tech>android.nfc.tech.MifareClassic</tech>
- </tech-list>
- </resources>
查看標籤支持數據格式的方法:
通過Tag.getTechlist()方法,獲得標籤所支持的數據格式
通過Tag.getId()方法,獲得標籤的唯一ID標識
NfcAdapter == null:表示設備不支持NFC硬件
NfcAdapter.isEnable()方法:判斷NFC是否開啓
綜上所述:
一個Tag通過Tag.getTechlist()方法獲取它所支持的所有標籤類型,如果清單文件中所引用的<tech-list>資源文件中所有的<tech>中的芯片是Tag標籤所有支持標籤的子集則被匹配的,可以寫多個<tech-list>,每個<tech-list>時獨立的,只要有其中一個<tech-list>中的所有的<tech>中的芯片類型全部匹配Tag所支持的芯片則認爲是匹配的。多個<tech-list>是OR關係,<tech-list>中的<tech>是AND關係。
MifareClassic標籤的外形結構
MifareClassic標籤的數據結構
注意事項(假設1k空間):
第一扇區的第一塊一般用於製造商佔用塊
0-15個扇區:一個扇區對應4個塊,所以總共有64個塊,序號分別爲0-63,第一個扇區對應:0-3塊,第二個扇區對應:4-7塊...
每個扇區的最後一個塊用來存放密碼或控制位,其餘爲數據塊,一個塊佔用16個字節,keyA佔用6字節,控制位佔用4字節,keyB佔用6字節
MifareClassic類的常用方法
get():根據Tag對象來獲得MifareClassic對象;
Connect():允許對MifareClassic標籤進行IO操作;
getType():獲得MifareClassic標籤的具體類型:TYPE_CLASSIC,TYPE_PLUA,TYPE_PRO,TYPE_UNKNOWN;
getSectorCount():獲得標籤總共有的扇區數量;
getBlockCount():獲得標籤總共有的的塊數量;
getSize():獲得標籤的容量:SIZE_1K,SIZE_2K,SIZE_4K,SIZE_MINI
authenticateSectorWithKeyA(int SectorIndex,byte[] Key):驗證當前扇區的KeyA密碼,返回值爲ture或false。
常用KeyA:默認出廠密碼:KEY_DEFAULT,
各種用途的供貨商必須配合該技術的MAD:KEY_MIFARE_APPLICATION_DIRECTORY
被格式化成NDEF格式的密碼:KEY_NFC_FORUM
getBlockCountInSector(int):獲得當前扇區的所包含塊的數量;
sectorToBlock(int):當前扇區的第1塊的塊號;
writeBlock(int,data):將數據data寫入當前塊;注意:data必須剛好是16Byte,末尾不能用0填充,應該用空格
readBlock(int):讀取當前塊的數據。
close():禁止對標籤的IO操作,釋放資源。
MifareClassic標籤的讀寫流程
獲得Adapter對象
獲得Tag對象
獲得MifareClassic對象
讀取數據塊的數據
Connect(),readBlock(),close()
獲得Adapter對象
獲得Tag對象
獲得MifareClassic對象
將數據塊寫入標籤
Connect(),writeBlock(),close()
官方文檔:
Working with tag technologies and the ACTION_TECH_DISCOVERED intent
When a device scans a tag that has NDEF data on it, but could not be mapped to a MIME or URI, the tag dispatch system tries to start an activity with the ACTION_TECH_DISCOVERED
intent.
The ACTION_TECH_DISCOVERED
is also used when a tag with
non-NDEF data is scanned. Having this fallback allows you to work with the data on the tag directly if the tag dispatch system could not parse it for you. The basic steps when working with tag technologies are as follows:
- Filter for an
ACTION_TECH_DISCOVERED
intent specifying the tag technologies that you want to handle. SeeFiltering for NFC intents for more information. In general, the tag dispatch system tries to start aACTION_TECH_DISCOVERED
intent when an NDEF message cannot be mapped to a MIME type or URI, or if the tag scanned did not contain NDEF data. For more information on how this is determined, see The Tag Dispatch System. - When your application receives the intent, obtain the
Tag
object from the intent:<span class="typ">Tag<span class="pln"> tagFromIntent <span class="pun">=<span class="pln"> intent<span class="pun">.<span class="pln">getParcelableExtra<span class="pun">(<span class="typ">NfcAdapter<span class="pun">.<span class="pln">EXTRA_TAG<span class="pun">);</span></span></span></span></span></span></span></span></span></span></span>
- Obtain an instance of a
TagTechnology
, by calling one of theget
factory methods of the classes in theandroid.nfc.tech
package. You can enumerate the supported technologies of the tag by callinggetTechList()
before calling aget
factory method. For example, to obtain an instance ofMifareUltralight
from aTag
, do the following:<span class="typ">MifareUltralight<span class="pun">.<span class="kwd">get<span class="pun">(<span class="pln">intent<span class="pun">.<span class="pln">getParcelableExtra<span class="pun">(<span class="typ">NfcAdapter<span class="pun">.<span class="pln">EXTRA_TAG<span class="pun">));</span></span></span></span></span></span></span></span></span></span></span></span>
Reading and writing to tags
Reading and writing to an NFC tag involves obtaining the tag from the intent and opening communication with the tag. You must define your own protocol stack to read and write data to the tag. Keep in mind, however, that you can still read and write NDEF data when working directly with a tag. It is up to you how you want to structure things. The following example shows how to work with a MIFARE Ultralight tag.
<span class="kwd">package<span class="pln"> com<span class="pun">.<span class="pln">example<span class="pun">.<span class="pln">android<span class="pun">.<span class="pln">nfc<span class="pun">;<span class="pln"> <span class="kwd">import<span class="pln"> android<span class="pun">.<span class="pln">nfc<span class="pun">.<span class="typ">Tag<span class="pun">;<span class="pln"> <span class="kwd">import<span class="pln"> android<span class="pun">.<span class="pln">nfc<span class="pun">.<span class="pln">tech<span class="pun">.<span class="typ">MifareUltralight<span class="pun">;<span class="pln"> <span class="kwd">import<span class="pln"> android<span class="pun">.<span class="pln">util<span class="pun">.<span class="typ">Log<span class="pun">;<span class="pln"> <span class="kwd">import<span class="pln"> java<span class="pun">.<span class="pln">io<span class="pun">.<span class="typ">IOException<span class="pun">;<span class="pln"> <span class="kwd">import<span class="pln"> java<span class="pun">.<span class="pln">nio<span class="pun">.<span class="pln">charset<span class="pun">.<span class="typ">Charset<span class="pun">;<span class="pln"> <span class="kwd">public<span class="pln"> <span class="kwd">class<span class="pln"> <span class="typ">MifareUltralightTagTester<span class="pln"> <span class="pun">{<span class="pln"> <span class="kwd">private<span class="pln"> <span class="kwd">static<span class="pln"> <span class="kwd">final<span class="pln"> <span class="typ">String<span class="pln"> TAG <span class="pun">=<span class="pln"> <span class="typ">MifareUltralightTagTester<span class="pun">.<span class="kwd">class<span class="pun">.<span class="pln">getSimpleName<span class="pun">();<span class="pln"> <span class="kwd">public<span class="pln"> <span class="kwd">void<span class="pln"> writeTag<span class="pun">(<span class="typ">Tag<span class="pln"> tag<span class="pun">,<span class="pln"> <span class="typ">String<span class="pln"> tagText<span class="pun">)<span class="pln"> <span class="pun">{<span class="pln"> <span class="typ">MifareUltralight<span class="pln"> ultralight <span class="pun">=<span class="pln"> <span class="typ">MifareUltralight<span class="pun">.<span class="kwd">get<span class="pun">(<span class="pln">tag<span class="pun">);<span class="pln"> <span class="kwd">try<span class="pln"> <span class="pun">{<span class="pln"> ultralight<span class="pun">.<span class="pln">connect<span class="pun">();<span class="pln"> ultralight<span class="pun">.<span class="pln">writePage<span class="pun">(<span class="lit">4<span class="pun">,<span class="pln"> <span class="str">"abcd"<span class="pun">.<span class="pln">getBytes<span class="pun">(<span class="typ">Charset<span class="pun">.<span class="pln">forName<span class="pun">(<span class="str">"US-ASCII"<span class="pun">)));<span class="pln"> ultralight<span class="pun">.<span class="pln">writePage<span class="pun">(<span class="lit">5<span class="pun">,<span class="pln"> <span class="str">"efgh"<span class="pun">.<span class="pln">getBytes<span class="pun">(<span class="typ">Charset<span class="pun">.<span class="pln">forName<span class="pun">(<span class="str">"US-ASCII"<span class="pun">)));<span class="pln"> ultralight<span class="pun">.<span class="pln">writePage<span class="pun">(<span class="lit">6<span class="pun">,<span class="pln"> <span class="str">"ijkl"<span class="pun">.<span class="pln">getBytes<span class="pun">(<span class="typ">Charset<span class="pun">.<span class="pln">forName<span class="pun">(<span class="str">"US-ASCII"<span class="pun">)));<span class="pln"> ultralight<span class="pun">.<span class="pln">writePage<span class="pun">(<span class="lit">7<span class="pun">,<span class="pln"> <span class="str">"mnop"<span class="pun">.<span class="pln">getBytes<span class="pun">(<span class="typ">Charset<span class="pun">.<span class="pln">forName<span class="pun">(<span class="str">"US-ASCII"<span class="pun">)));<span class="pln"> <span class="pun">}<span class="pln"> <span class="kwd">catch<span class="pln"> <span class="pun">(<span class="typ">IOException<span class="pln"> e<span class="pun">)<span class="pln"> <span class="pun">{<span class="pln"> <span class="typ">Log<span class="pun">.<span class="pln">e<span class="pun">(<span class="pln">TAG<span class="pun">,<span class="pln"> <span class="str">"IOException while closing MifareUltralight..."<span class="pun">,<span class="pln"> e<span class="pun">);<span class="pln"> <span class="pun">}<span class="pln"> <span class="kwd">finally<span class="pln"> <span class="pun">{<span class="pln"> <span class="kwd">try<span class="pln"> <span class="pun">{<span class="pln"> ultralight<span class="pun">.<span class="pln">close<span class="pun">();<span class="pln"> <span class="pun">}<span class="pln"> <span class="kwd">catch<span class="pln"> <span class="pun">(<span class="typ">IOException<span class="pln"> e<span class="pun">)<span class="pln"> <span class="pun">{<span class="pln"> <span class="typ">Log<span class="pun">.<span class="pln">e<span class="pun">(<span class="pln">TAG<span class="pun">,<span class="pln"> <span class="str">"IOException while closing MifareUltralight..."<span class="pun">,<span class="pln"> e<span class="pun">);<span class="pln"> <span class="pun">}<span class="pln"> <span class="pun">}<span class="pln"> <span class="pun">}<span class="pln"> <span class="kwd">public<span class="pln"> <span class="typ">String<span class="pln"> readTag<span class="pun">(<span class="typ">Tag<span class="pln"> tag<span class="pun">)<span class="pln"> <span class="pun">{<span class="pln"> <span class="typ">MifareUltralight<span class="pln"> mifare <span class="pun">=<span class="pln"> <span class="typ">MifareUltralight<span class="pun">.<span class="kwd">get<span class="pun">(<span class="pln">tag<span class="pun">);<span class="pln"> <span class="kwd">try<span class="pln"> <span class="pun">{<span class="pln"> mifare<span class="pun">.<span class="pln">connect<span class="pun">();<span class="pln"> <span class="kwd">byte<span class="pun">[]<span class="pln"> payload <span class="pun">=<span class="pln"> mifare<span class="pun">.<span class="pln">readPages<span class="pun">(<span class="lit">4<span class="pun">);<span class="pln"> <span class="kwd">return<span class="pln"> <span class="kwd">new<span class="pln"> <span class="typ">String<span class="pun">(<span class="pln">payload<span class="pun">,<span class="pln"> <span class="typ">Charset<span class="pun">.<span class="pln">forName<span class="pun">(<span class="str">"US-ASCII"<span class="pun">));<span class="pln"> <span class="pun">}<span class="pln"> <span class="kwd">catch<span class="pln"> <span class="pun">(<span class="typ">IOException<span class="pln"> e<span class="pun">)<span class="pln"> <span class="pun">{<span class="pln"> <span class="typ">Log<span class="pun">.<span class="pln">e<span class="pun">(<span class="pln">TAG<span class="pun">,<span class="pln"> <span class="str">"IOException while writing MifareUltralight message..."<span class="pun">,<span class="pln"> e<span class="pun">);<span class="pln"> <span class="pun">}<span class="pln"> <span class="kwd">finally<span class="pln"> <span class="pun">{<span class="pln"> <span class="kwd">if<span class="pln"> <span class="pun">(<span class="pln">mifare <span class="pun">!=<span class="pln"> <span class="kwd">null<span class="pun">)<span class="pln"> <span class="pun">{<span class="pln"> <span class="kwd">try<span class="pln"> <span class="pun">{<span class="pln"> mifare<span class="pun">.<span class="pln">close<span class="pun">();<span class="pln"> <span class="pun">}<span class="pln"> <span class="kwd">catch<span class="pln"> <span class="pun">(<span class="typ">IOException<span class="pln"> e<span class="pun">)<span class="pln"> <span class="pun">{<span class="pln"> <span class="typ">Log<span class="pun">.<span class="pln">e<span class="pun">(<span class="pln">TAG<span class="pun">,<span class="pln"> <span class="str">"Error closing tag..."<span class="pun">,<span class="pln"> e<span class="pun">);<span class="pln"> <span class="pun">}<span class="pln"> <span class="pun">}<span class="pln"> <span class="pun">}<span class="pln"> <span class="kwd">return<span class="pln"> <span class="kwd">null<span class="pun">;<span class="pln"> <span class="pun">}<span class="pln"> <span class="pun">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
例子程序:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <CheckBox
- android:id="@+id/checkbox_write"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="是否向NFC標籤寫入數據" />
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="5dp"
- android:text="請將NFC標籤或貼紙靠近手機背面"
- android:textSize="16sp" />
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="10dp"
- android:src="@drawable/read_nfc_tag" />
- </LinearLayout>
MainActivity:
- package mobile.android.mifareultralight;
- import java.io.IOException;
- import java.nio.charset.Charset;
- import android.app.Activity;
- import android.app.PendingIntent;
- import android.content.Intent;
- import android.nfc.NfcAdapter;
- import android.nfc.Tag;
- import android.nfc.tech.MifareClassic;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.CheckBox;
- import android.widget.Toast;
- public class MifareultralightMainActivity extends Activity {
- private CheckBox mWriteData;
- private NfcAdapter mNfcAdapter;
- private PendingIntent mPendingIntent;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_mifareultralight);
- mWriteData = (CheckBox) findViewById(R.id.checkbox_write);
- mNfcAdapter = mNfcAdapter.getDefaultAdapter(this);
- if (mNfcAdapter == null) {
- Toast.makeText(this, "設備不支持NFC!", Toast.LENGTH_LONG).show();
- finish();
- return;
- }
- if (!mNfcAdapter.isEnabled()) {
- Toast.makeText(this, "請在系統設置中先啓用NFC功能!", Toast.LENGTH_LONG).show();
- finish();
- return;
- }
- mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
- getClass()), 0);
- }
- @Override
- public void onResume() {
- super.onResume();
- if (mNfcAdapter != null)
- mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null,
- null);
- }
- @Override
- public void onNewIntent(Intent intent) {
- Tag tag = intent.getParcelableExtra(mNfcAdapter.EXTRA_TAG);
- String[] techList = tag.getTechList();
- boolean haveMifareUltralight = false;
- for (String tech : techList) {
- if (tech.indexOf("MifareClassic") >= 0) {
- haveMifareUltralight = true;
- break;
- }
- }
- if (!haveMifareUltralight) {
- Toast.makeText(this, "不支持MifareClassic", Toast.LENGTH_LONG).show();
- return;
- }
- if (mWriteData.isChecked()) {
- writeTag(tag);
- } else {
- String data = readTag(tag);
- if (data != null) {
- Log.i(data, "ouput");
- Toast.makeText(this, data, Toast.LENGTH_LONG).show();
- }
- }
- }
- @Override
- public void onPause() {
- super.onPause();
- if (mNfcAdapter != null)
- mNfcAdapter.disableForegroundDispatch(this);
- }
- public void writeTag(Tag tag) {
- MifareClassic mfc = MifareClassic.get(tag);
- try {
- mfc.connect();
- boolean auth = false;
- short sectorAddress = 1;
- auth = mfc.authenticateSectorWithKeyA(sectorAddress,
- MifareClassic.KEY_NFC_FORUM);
- if (auth) {
- // the last block of the sector is used for KeyA and KeyB cannot be overwritted
- mfc.writeBlock(4, "1313838438000000".getBytes());
- mfc.writeBlock(5, "1322676888000000".getBytes());
- mfc.close();
- Toast.makeText(this, "寫入成功", Toast.LENGTH_SHORT).show();
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- try {
- mfc.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- //字符序列轉換爲16進制字符串
- private String bytesToHexString(byte[] src) {
- StringBuilder stringBuilder = new StringBuilder("0x");
- if (src == null || src.length <= 0) {
- return null;
- }
- char[] buffer = new char[2];
- for (int i = 0; i < src.length; i++) {
- buffer[0] = Character.forDigit((src[i] >>> 4) & 0x0F, 16);
- buffer[1] = Character.forDigit(src[i] & 0x0F, 16);
- System.out.println(buffer);
- stringBuilder.append(buffer);
- }
- return stringBuilder.toString();
- }
- public String readTag(Tag tag) {
- MifareClassic mfc = MifareClassic.get(tag);
- for (String tech : tag.getTechList()) {
- System.out.println(tech);
- }
- boolean auth = false;
- //讀取TAG
- try {
- String metaInfo = "";
- //Enable I/O operations to the tag from this TagTechnology object.
- mfc.connect();
- int type = mfc.getType();//獲取TAG的類型
- int sectorCount = mfc.getSectorCount();//獲取TAG中包含的扇區數
- String typeS = "";
- switch (type) {
- case MifareClassic.TYPE_CLASSIC:
- typeS = "TYPE_CLASSIC";
- break;
- case MifareClassic.TYPE_PLUS:
- typeS = "TYPE_PLUS";
- break;
- case MifareClassic.TYPE_PRO:
- typeS = "TYPE_PRO";
- break;
- case MifareClassic.TYPE_UNKNOWN:
- typeS = "TYPE_UNKNOWN";
- break;
- }
- metaInfo += "卡片類型:" + typeS + "\n共" + sectorCount + "個扇區\n共"
- + mfc.getBlockCount() + "個塊\n存儲空間: " + mfc.getSize()
- + "B\n";
- for (int j = 0; j < sectorCount; j++) {
- //Authenticate a sector with key A.
- auth = mfc.authenticateSectorWithKeyA(j,
- MifareClassic.KEY_NFC_FORUM);
- int bCount;
- int bIndex;
- if (auth) {
- metaInfo += "Sector " + j + ":驗證成功\n";
- // 讀取扇區中的塊
- bCount = mfc.getBlockCountInSector(j);
- bIndex = mfc.sectorToBlock(j);
- for (int i = 0; i < bCount; i++) {
- byte[] data = mfc.readBlock(bIndex);
- metaInfo += "Block " + bIndex + " : "
- + bytesToHexString(data) + "\n";
- bIndex++;
- }
- } else {
- metaInfo += "Sector " + j + ":驗證失敗\n";
- }
- }
- return metaInfo;
- } catch (Exception e) {
- Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
- e.printStackTrace();
- } finally {
- if (mfc != null) {
- try {
- mfc.close();
- } catch (IOException e) {
- Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG)
- .show();
- }
- }
- }
- return null;
- }
- }
清單文件:
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="mobile.android.mifareultralight"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="15"
- android:targetSdkVersion="15" />
- <uses-permission android:name="android.permission.NFC" />
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name=".MifareultralightMainActivity"
- android:label="Mifareultralight"
- android:launchMode="singleTop"
- android:screenOrientation="portrait" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>