我的NFC阅读器无法成功读取正确的数据

时间:2012-07-17 06:48:10

标签: android nfc

我开发了一款简单的NFC应用,它将在感应到NFC标签后启动。我想问两个问题,为什么在我的程序启动后,我需要让设备再次检测标签是否只是在它启动后读取标签?并且,我已将数据类型设置为text / plain,但为什么当我在textview字段中输出数据时,会出现无意义的查询?

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

最后是我输入标签的数据:

enter image description here

1 个答案:

答案 0 :(得分:2)

NdefMessage是包含一个或多个NdefRecord的对象。请致电yourNdefMessage.getRecords()以访问它们。

NdefRecord可以包含各种类型的内容,包括纯文本。有两种类型的纯文本NdefRecord:明知类型文本和MIME类型“text / plain”(两者都使用相同的intent过滤器;有关详细信息,请参阅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 EXTRA。