2012-07-17 61 views
1

我開發了一個簡單的NFC應用程序,它將在感應到NFC標籤後啓動。我想問兩個問題,爲什麼在我的程序啓動後,我需要讓設備再次檢測標籤,而不是在啓動後纔讀取標籤?而且,我將數據類型設置爲text/plain,但是爲什麼當我在textview字段中輸出數據時,出現了無意義的查詢?我的NFC讀卡器無法成功讀取正確的數據

public class Reader extends Activity { 

TextView mText; 
NfcAdapter mAdapter; 
PendingIntent mPendingIntent; 
IntentFilter mFilters[]; 
String mTechLists[][]; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

@Override 
public void onStart(){ 
    super.onStart(); 
    setContentView(R.layout.activity_reader); 

    mText = (TextView) findViewById(R.id.text); 

    mAdapter = NfcAdapter.getDefaultAdapter(this); 
    mPendingIntent = PendingIntent.getActivity(this, 0, 
      new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); 
    try{ 
     ndef.addDataType("text/plain"); 
    }catch(MalformedMimeTypeException e){ 
     throw new RuntimeException("fail", e); 
    } 

    IntentFilter nt = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); 
    mFilters = new IntentFilter[]{ 
      ndef, nt 
    }; 

    mTechLists = new String[][]{ 
      new String[]{ 
        Ndef.class.getName() 
      } 
    }; 
    Intent intent = getIntent(); 
    mText.setText(getNdefMessages(intent)); 
} 

public String getNdefMessages(Intent intent){ 
    NdefMessage[] msgs = null; 
    String action = intent.getAction(); 
    if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)|| 
      NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)){ 
     Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
     if(rawMsgs != null){ 
      msgs = new NdefMessage[rawMsgs.length]; 
      for(int i=0; i<rawMsgs.length; i++){ 
       msgs[i] = (NdefMessage) rawMsgs[i]; 
      } 
     }else{ 
      byte[] empty = new byte[]{}; 
      NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty); 
      NdefMessage msg = new NdefMessage(new NdefRecord[]{record}); 
      msgs = new NdefMessage[]{msg}; 
     } 

    } 
    if(msgs==null) 
     return "No Tag discovered!"; 
    else 
     return msgs.toString(); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    if (mAdapter != null) 
     mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists); 

} 

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

@Override 
public void onNewIntent(Intent intent){ 
    Log.i("Foreground dispatch", "Discovered tag with intent:" + intent); 
    mText = (TextView) findViewById(R.id.text); 
    mText.setText(getNdefMessages(intent)); 
} 

} 

以上是我的主要程序,下面是清單文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="android.reader" 
android:versionCode="1" 
android:versionName="1.0"> 

<uses-sdk 
    android:minSdkVersion="10" 
    android:targetSdkVersion="15" /> 

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

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

<application android:label="@string/app_name" 
    android:icon="@drawable/ic_launcher" 
    android:theme="@style/AppTheme" 
    android:debuggable="true"> 
    <activity 
     android:name=".Reader" 
     android:label="@string/title_activity_reader"> 
     <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.NDEF_DISCOVERED"/> 
      <data android:mimeType="text/plain" /> 
      <!--<data 
       android:scheme="http" 
       android:host="developer.android.com"/>--> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.nfc.action.TAG_DISCOVERED"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 
    </activity> 

</application> 

</manifest> 

消息顯示在應用程序:

enter image description here

最後是數據I輸入該標籤:

enter image description here

回答

2

NdefMessage是包含一個或多個NdefRecord的對象。致電yourNdefMessage.getRecords()訪問它們。

NdefRecord可以有各種伴隨內容的類型,包括純文本。有兩種類型的純文本NdefRecord s:衆所周知的類型文本和MIME類型的「文本/純文本」(均使用相同的意圖過濾器;有關詳細信息,請參閱http://developer.android.com/guide/topics/connectivity/nfc/nfc.html#ndef)。

您似乎使用MIME類型的text/plain。所以你可以很容易地將它轉換爲字符串:new String(yourNdefMessage.getRecords()[0].getPayload())

爲了確保您的應用能夠在開始時立即訪問標籤,您應該將Android應用記錄作爲NDEF消息中的最後一條記錄。否則,生成的意圖將包含操作MAIN而不是NDEF_DISCOVERED,並且意圖中不會有NDEF消息和TAG EXTRAs。

+0

通過谷歌,我終於找到了這種方法來訪問playload,但是當我有兩個記錄甚至更多,有什麼方法來獲取這些記錄,我試圖通過消息得到第二個。[1] .getRecords( )[0] .getPayload(),但系統回覆我索引出界 – Conrad 2012-07-17 08:38:31

+0

我試圖輸出rawMsgs和Msgs [0] .getReord()的長度都是長度爲1的一些值,請問哪裏是第二張唱片? – Conrad 2012-07-17 08:55:16

+0

有一個NDEF消息有多個記錄,所以'msgs [0] .getRecords()[1]'是第一個(也是唯一的)NDEF消息的第2條記錄。 – 2012-07-17 09:04:46