2016年6月21日 星期二

Android-Read RFID Tag Id

尚未整理
雖然網路上範例已經多到快淹出來了
但之後還是可能會在拿來應用
所以特別在寫這一篇

特別是以下這三種標籤分類 :

1 . NEEF_DISCOVERED : 必須可以利用 NDEF 格式傳輸的 Tag ,
例 : 文字。

2 . TECH_DISCOVERED : Tag 必須符合設定的規範才被觸發
例 :
<tech-list>
    <tech>android.nfc.tech.NfcA</tech>
    <tech>android.nfc.tech.MifareClassic</tech>
    <tech>android.nfc.tech.Ndef</tech>
</tech-list>

3 . TAG_DISCOVERED : 只要是 Tag 即可被處發。

相信您對以下這張圖不陌生吧... ( 只要找 NFC 相關都會有此圖












簡短說明 : 此圖內容說明有關優先權( 綠框由 上_高 到 下_低 )NDEF > TECH > TAG
,如果 Tag 非 NDEF,那就會在判斷是否為 TECH 內的,如果還是沒有,則直接由
 TAG 傳到 Activity。


1 . 開啟對應權限
<uses-permission android:name="android.permission.NFC" />

<uses-feature
    android:name="android.hardware.nfc"
    android:required="true" />

2 . 最小版本限制
<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="21" />

3 . 條件


4 . 在 Actvitiy OnCreate 判斷 NFC 是否支援、使否開啟
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {  

    private TextView textNFC;
    private NfcAdapter nfcAdapter;
    private PendingIntent mPendingIntent;

    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  

        textNFC = (TextView) findViewById(R.id.textNFC); 
        
        nfcAdapter = NfcAdapter.getDefaultAdapter(this);   
        if (nfcAdapter == null) {
            //nfc not support your device.
            return;
        }
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    }  

    @Override  
    protected void onResume() {  
        super.onResume();  
        
        nfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
        
    }  

    @Override  
    protected void onPause() {  
        super.onPause();  
        
        if (nfcAdapter != null) {
            nfcAdapter.disableForegroundDispatch(this);
        }
    }  

    @Override  
    protected void onNewIntent(Intent intent) {  
        if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {  
            Log.d("NFCTest", "Tag Id : " + 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;  
    }  

}   


參考資料 : Android NFC tag 近距離無線通訊
參考資料 : Android developer_NFC
參考資料 : NFC学习
參考資料 : Android: How to read NFC tag with current app
參考資料 : Tag的三种相应模式

沒有留言:

張貼留言