1. 程式人生 > >用Android模擬器也可以開發和測試NFC應用

用Android模擬器也可以開發和測試NFC應用

       從Android2.3開始支援NFC。不過NFC應用只能在Android手機(或平板電腦)上測試和開發,而且Android手機還必須有NFC晶片。而且如果測試NFC傳輸檔案時至少需要兩部支援NFC的手機。當然,如果測試讀寫NFC標籤,還需要一些NFC標籤或帖子。而且NFC在模擬器上時不能執行的。所以從這一點來說,NFC開發需要更多的裝置,比較麻煩。這也藍芽、感測器是一樣的。都不能在Android模擬器上開發和測試。真不知道Google為什麼不解決這一問題。

       不過這種問題也不是不能解決,而且並不複雜。既然模擬器沒有提供這樣的功能。我們可以將NFC功能模擬出來(實際上,藍芽、感測器都可以進行模擬,可能很多讀者用過一些感測器模擬軟體,NFC模擬和這個類似)。而且要求是與真實的NFC環境無縫對接。也就是說,使用模擬NFC功能開發的Android應用可以不需要修改一行程式碼,甚至不需要重新編譯,就可以直接用在真實的NFC環境。

        那麼怎麼解決這個問題呢?要想知道如何模擬NFC,需要先從巨集觀上了解NFC的工作原理。這裡用NFC標籤作為例子。NFC資料傳輸和這個類似。當NFC標籤靠近手機時,Android系統中有一個叫Nfc的系統應用(在<Android原始碼根目錄>/pakcages/apps/Nfc目錄中),該應用會發送一個ActivityAction,該Action會呼叫一個在系統中註冊的用於處理NFC請求的視窗(如果沒有,就呼叫Nfc應用中預設的處理視窗)。這裡的關鍵是Activity Action。既然Nfc應用會發出一個Activity Action,那麼用於模擬NFC的程式,也傳送一個Activity Action,不就可以共享用於處理NFC請求的視窗(由使用者建立的Activity)了嗎?只要在傳送Activity Action時加一個標誌,就可以區分是Activity Action是Nfc系統應用發出的,還是模擬NFC的程式發出的。這樣在處理請求的NFC視窗中就可以根據不同的情況進行處理。為了更透明,可以編寫一個Activity類(如NFCActivity),該類根據這兩種情況進行處理。又因為不管是哪種情況,都需要提供寫入NFC標籤的資料,或接收NFC標籤中的資料。所以可以在該NFCActivity中提供一些回撥方法,當需要提供或接收資料時,呼叫這些方法即可。最後需要使用NFC功能時,使用者自己編寫的視窗類只需要從NFCActivity類繼承,並實現相應的回撥方法即可。例如,下面就是一個實現方法,可接收NFC標籤的資料,並寫入新資料。

public class NFCManTestActivity extends NFCActivity
{    
    private NFCMan mNfcMan;
    private EditText nfcTagText;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_nfcman_test);
        nfcTagText = (EditText) findViewById(R.id.edittext_nfc);
        mNfcMan = new NFCMan(this);
    }
    //  當NFC標籤靠近手機時呼叫,data用於接收NFC標籤中的資料,
    //  返回值會重新寫到NFC標籤中
    @Override
    public String onNear(NFCData data)
    {
        //  返回要寫入NFC標籤的文字
        return nfcTagText.getText().toString();
    }
    //  將資料成功寫入NFC標籤後會呼叫該方法
    @Override 
    public void onNFCSuccess()  
    {
        //  顯示成功寫入資料的提示
        Toast.makeText(this, "成功寫入資料", Toast.LENGTH_LONG).show();
    }  
    //  寫入資料失敗後呼叫該方法
    @Override 
    public void onNFCFailed(int error, String errorMsg)
    {
        //  顯示寫入資料異常的編碼和資訊
        Toast.makeText(this, "error:" + error + "\n" + "msg:" + errorMsg,
                Toast.LENGTH_LONG).show();
    }  
}

從NFCManTestActivity類的程式碼可以看出,共有如下三個回撥方法。分別處理讀寫NFC標籤資料,寫入成功和寫入失敗三個事件。

onNear

onNFCSuccess

onNFCFailed

從這一點可以看出,完全隱藏了NFC的影子。下面用圖1描述一下這個NFC模擬系統的原理。

                                                                                       圖1  NFC模擬器的實現原理

        從圖1可以看出,需要有一套虛擬的NFC標籤,這些是在PC上用軟體模擬的。對於虛擬NFC標籤,通過Socket與安裝在NFC裝置中的模擬NFC處理程式進行互動,然後該程式會發送Broadcast Action,最後接收到這個Broadcast後,會繼續呼叫Activity Action呼叫處理NFC請求的視窗。這一點與Nfc系統程式一樣,只不過中間多了一個傳送broadcast的過程。因為模擬NFC處理程式與處理NFC請求的NFCActivity所在的Library是分離的,只能通過Broadcast進行通知。而Nfc系統程式是通過NFC驅動感知真實NFC標籤是否靠近的。而對於處理NFC請求的視窗來說,不管是虛擬的NFC標籤,還是真實的NFC標籤,都處理同一個Activity Action。所以處理NFC請求的Activity可以共用一套程式碼。

        我將這個模擬NFC的應用稱為NFCMan(NFC俠),下面看一下該應用如何模擬NFC標籤,模擬介面如圖2所示。


                                                                    圖2 NFC模擬器主介面

        在圖2中上面是模擬的NFC裝置。只要Android手機(不需要支援NFC)或Android模擬器上執行的模擬NFC的應用(如圖3所示)根據圖2中右下角的IP連線到NFC模擬器,就會顯示一個手機圖示。


                                                       圖3
        圖2的下面是虛擬的NFC標籤,點選右下角的“新建NFC標籤”可以建立新的NFC標籤。雙擊NFC標籤會顯示該標籤的資訊,如圖4所示。這些資訊包括標籤名稱、最大容量、標籤內容(預設是空)。只要將虛擬NFC標籤拖動到上面的虛擬NFC裝置,就相當於將NFC標籤靠近了該裝置。然後會通過Socket將相應的資料傳到圖3所示的Android應用。接著該應用會發送Broadcast。最後接收到該Broadcast的Android應用會通過Activity Action呼叫處理NFC請求的Activity。會根據情況呼叫onNear、onNFCSuccess、onNFCFailed三個回撥方法。


http://

                                                                                         題4

         這個程式是我開發的一個開源專案,名稱是NFCMan。如果讀者想了解完整的實現過程,可以參閱《Android開發權威指南第2版》第45章(最後一章)的內容。近期會將該專案上傳到gifhub上。如果需要原始碼的讀者,可以到如下地址下載(ch45中)。

下載地址


2013 CSDN部落格之星評選 

相關推薦

Android模擬器可以開發測試NFC應用

       從Android2.3開始支援NFC。不過NFC應用只能在Android手機(或平板電腦)上測試和開發,而且Android手機還必須有NFC晶片。而且如果測試NFC傳輸檔案時至少需要兩部支援NFC的手機。當然,如果測試讀寫NFC標籤,還需要一些NFC標籤或帖子。

安卓性能測試:adb 查看Android模擬器版本號SDK版本號

href lease adb shell oid 獲取 inf sdk get blog 摘要:隨著安卓功能的不斷增加,各種安卓sdk與安卓模擬器也隨之更新。由於某些原因,我們需要查看它們的版本號。下面我就來介紹下具體方法: 1 adb 查看Android模擬器版本號和

spring通過profile實現開發測試環境切換

我們 其中 ror web cms -m acc 系統環境 oot 以開發測試為例,介紹tomcat部署應用和maven部署應用下利用profile實現測試環境和開發環境切換一、tomcat部署應用1、數據源配置dev.properties 路徑:/src/main/res

第一行代碼:以太坊(2)-使用Solidity語言開發測試智能合約

之一 腳本語言 其他 括號 add row ans img 運行方式 智能合約是以太坊的核心之一,用戶可以利用智能合約實現更靈活的代幣以及其他DApp。不過在深入講解如何開發智能合約之前,需要先介紹一下以太坊中用於開發智能合約的Solidity語言,以及相關的開發和測試環境

Android移動開發01----Android Studio進行開發

    一直以來都用Eclipse進行開發,但是最近發現Eclipse執行越來越緩慢,再加上自己的電腦已入暮年,時不時卡頓一下實在讓人受不了。在開發Ruby的時候接觸了RubyMine,一個基於IntelliJ IDEA的IDE,功能強大,速度比較快。於是決定拋棄Ecl

EOS智慧合約開發測試框架EOSFactory

EOS Factory是一個EOS智慧合約開發和測試框架。 自2017年秋季以來,Tokenika一直致力於建立基於Python的EOS智慧合約開發平臺,以便輕鬆建立,測試和部署智慧合約。隨著EOS的不斷髮展,我們已經習慣了其基礎程式碼的突然變化,並且隨著我們的進展而逐漸減少詛咒;)今天

檢測Android模擬器的方法程式碼實現

專自:https://bbs.pediy.com/thread-225717.htm 剛剛看了一些關於Detect Android Emulator的開源專案/文章/論文, 我看的這些其實都是13年14年提出的方法, 方法裡大多是檢測一些環境屬性, 檢查一些檔案這樣, 但實際上檢測的思路並不侷限

自動化UI測試條件下開發測試的協同實踐

前言 經過我們團隊持續不斷的推進,團隊的自動化UI測試終於走出了研發和嘗試階段,進入到實際專案應用階段,開始產生生產力。但經過了近兩個月的嘗試發現,引入了自動化UI測試後發現與原有的開發模式有所衝突,經過這段時間的摸索和磨合,團隊形成了一種新的開發和測試的協同模式,也就是SCM。

7.開發測試資料集多大合適 翻譯自 吳恩達新書-Machine Learning Yearning

為了檢測出不同演算法之間的差異,開發資料集應該足夠大。比如,分類演算法A的準確率為90.0%, 分類演算法B的準確率為90.1%,如果開發資料集中只有100個樣本,那你無法檢測出這0.1%差在哪兒。100個樣本的開發資料集實在時太小了。通常,我們會在開發資料集

第一行程式碼:以太坊(2)-使用Solidity語言開發測試智慧合約

智慧合約是以太坊的核心之一,使用者可以利用智慧合約實現更靈活的代幣以及其他DApp。不過在深入講解如何開發智慧合約之前,需要先介紹一下以太坊中用於開發智慧合約的Solidity語言,以及相關的開發和測試環境。 智慧合約就是執行在以太坊上的程式。客戶端可以通過Web3.js API呼叫智慧合約,而智慧合約本身

Android驅動程式開發除錯環境配置

    本文用《Android深度探索(卷1):HAL與驅動開發》的隨書原始碼為例詳細說明如何配置Android驅動開發和測試環境,並且如何使用原始碼中的build.sh指令碼檔案在各種平臺(Ubuntu Linux、Android模擬器和S3C6410開發板)上編譯、安裝和

自己的資料訓練測試“caffenet”

本次實驗本來參考examples/imagenet下的readme.txt進行,但因為資料集過於龐大,所以模擬學習,參考薛開宇的學習方式,模仿搭建自己的資料庫。 首先在caffe/data下新建資料夾myself,然後在網上下載貓、鳥、狗的訓練圖片各50張,測

(薛開宇學習筆記(三))自己的資料訓練測試“CaffeNet”

1.資料準備 原文是用ImageNet1000類的資料庫,本文是自己模仿一個小的資料庫進行下去的,在caffe下新建一個myself資料夾,並在網上下載了訓練貓的圖片60張,測試貓10張,訓練狗的圖片60張,測試狗10張,如圖: 為了方便,對下載的圖片名進行修改,修改

Android模擬器上實現Sensor測試(1)——環境的配置

      由於Android模擬器中沒有提供Sensor方面的測試,現在採用第三方提供的工具SersionSimulator. 1. 下載工具          下載SensorSimulator,SensorSimulator是一個開源免費的感測器小工具,通過該工具便可以

軟體開發測試的 30 個最佳實踐

這些軟體開發和測試的最佳實踐,可以幫你節省時間和避免問題。 加入一個企業文化和程式設計實踐已經定型的新公司,可能會是一種令人沮喪的經歷。當我加入 Ansible 團隊後,我決定整理我多年以來所學併為之奮鬥的軟體工程實踐和準則。這是一個不明確的也不夠詳盡的準則列表

Google中國招聘開發測試工程師的要求

Google一直都自稱在使用全球水平的技術來構建應用,提供服務,其團隊裡的人才也是世界一流的;那麼其招聘要求到底如何呢? Google中國在招聘軟體開發工程師和軟體測試工程師時的要求: (訊息來自Google中國官方的招聘資訊) 1招聘泰國軟體工程師 S

優秀的開發測試人員是什麼樣的?

軟體開發是一種藝術,而不是一門科學。你可以學習軟體開發的各種技術,不過還需要對編碼有著充分的熱情。如果你是這樣的人,那麼就可以成為“偉大的開發者”。 態度1:缺陷表明我編寫優秀程式碼的能力出現了問題 修改缺陷是軟體開發人員的日常活動。顯然,缺陷是開發人員最大的敵人。當修改

Android的原生態開發非原生態開發

原生態開發為:是指運用官方提供的原始工具,原始語言來開發的例如objective C.這種開發模式週期比較長,更新週期也比較長。而且對不同顯示效果的裝置要進行不同的開發。非原生態開發是指那種混合式開發模式,大多是由開發人員使用H5開發。這種方式設計的軟體介面可以自適應,一個開

使用Vagrant部署虛擬分散式開發測試環境

同步更新到筆者個人部落格,可以訪問我的部落格檢視原文:https://www.rockysky.tech 建立自動化配置開發環境 最近由於最近研究和學習的關係,需要經常配置和搭建多個虛擬機器組成的分散式系統。原來只是用虛擬機器程式,比如說用Virtual box直接建立虛擬機器。如果只是偶爾建立虛擬機器研究的

Qt on Android 讓 Qt Widgets Qt Quick 應用全屏顯示

                    Android 系統版本很多,較新的 4.4 ,較老的 2.3 ,都有人用。 Qt on Android 開發的 Android 應用,預設在 Android 裝置上是非全屏的。而有些應用的需求是全屏顯示,比如遊戲。那麼怎麼樣才能做到這點呢?    我們需要分 Andr