2012-08-27 66 views
1

我在卡模擬模式下使用PN512作爲NFC標籤,並且正在開發Android應用程序以讀取和寫入標籤。問題是,只要標籤在NFC領域,程序就會繼續讀取和寫入標籤,但是我希望程序在成功寫入後不會覆蓋相同的標籤。有沒有解決方案?如何停止覆蓋使用Android的NFC標籤

(我知道有沒有辦法編程方式禁用NFC基於Android SDK)

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

    btn = (Button) findViewById(R.id.btn_OK); 
    mEditText = (EditText) findViewById(R.id.text_username); 
    btn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      prefs = getSharedPreferences(prefName, MODE_PRIVATE); 
      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putString(TEXT_VALUE_KEY, mEditText.getText().toString()); 
      editor.commit(); 

      String outtxt = "please touch and hold phone to tag"; 
      Toast toastedit12 = Toast.makeText(getApplicationContext(), outtxt, Toast.LENGTH_SHORT); 
      toastedit12.show(); 
     } 
    }); 

    resolveIntent(getIntent()); 
} 


// This method/task executes when the tag is read 
void resolveIntent(Intent intent) 
{ 
    NdefMessage msg1, msg2; 
    // Parse the intent 
    String action = intent.getAction(); 

    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || 
     NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { 

     try 
     { 
      mRecord=createRecord(); 
     } 
     catch (Exception e) 
     { 
      Toast toaste = Toast.makeText(getApplicationContext(), "exception in call to create record", Toast.LENGTH_SHORT); 
      toaste.show(); 
     } 

     // When a tag is discovered we send it to the service to be save. We 
     // include a PendingIntent for the service to call back onto. This 
     // will cause this activity to be restarted with onNewIntent(). At 
     // that time we read it from the database and view it. 
     Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
     NdefMessage[] msgs; 

     if (rawMsgs != null) 
     { 
      msgs = new NdefMessage[rawMsgs.length]; 
      for (int i = 0; i < rawMsgs.length; i++) 
      { 
       msgs[i] = (NdefMessage) rawMsgs[i]; 
      } 

      msg1 = msgs[0]; 
      myPayload=msg1.getRecords()[0].getPayload(); 
     } 
     else { 
      // Unknown tag type 
      byte[] empty = new byte[] {}; 
      NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty); 
      msg2 = new NdefMessage(new NdefRecord[] {record}); 
      msgs = new NdefMessage[] {msg2}; 
     } 
     writeToNfcTag(intent); 
    } 


    public NdefRecord createRecord() throws UnsupportedEncodingException { 
     SharedPreferences prefs = getSharedPreferences(prefName, MODE_PRIVATE); 
     mEditText.setText(prefs.getString(TEXT_VALUE_KEY, "def")) 

     String lang  = "en"; 

     byte[] textBytes = mEditText.getText().toString().getBytes(); 

     byte[] langBytes = lang.getBytes("US-ASCII"); 
     int langLength = langBytes.length; 
     //int myPayloadLength = myPayload.length; 
     int textLength = textBytes.length; 
     byte[] payload = new byte[1+langLength+textLength]; 

     // Set status byte (see NDEF spec for actual bits) 
     payload[0] = (byte) langLength; 

     // Copy langbytes and textbytes into payload 
     System.arraycopy(langBytes, 0, payload, 1, langLength); 
     System.arraycopy(textBytes, 0, payload, 1+langLength, textLength); 
     NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, 
              NdefRecord.RTD_TEXT, 
              new byte[0], 
              payload); 
     return record; 
    } 


    public void writeToNfcTag(Intent intent) 
    { 
     Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     try 
     { 
      write(tag); 
     } 
     catch (Exception e) 
     { 
      // Toast this; bail 
     } 
    } 


    public void write(Tag tag) throws IOException, FormatException { 
     NdefRecord[] records = { mRecord }; 
     NdefMessage message = new NdefMessage(records); 

     // Get an instance of Ndef for the tag. 
     Ndef ndef = Ndef.get(tag); 

     // Enable I/O 
     ndef.connect(); 

     // Write the message 
     ndef.writeNdefMessage(message); 

     // Close the connection 
     ndef.close(); 

     Intent myIntent = null; 
     myIntent = new Intent(MyAndroidAppActivity.this, TagDeactivatedActivity.class); 

     myIntent.setFlags(myIntent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(myIntent); 
     finish(); 
    } 
} 
+0

嚴正聲明,你是否試圖將標籤標記爲只讀? – ThomasRS

+0

非常感謝您的回覆!這可以部分解決問題。是否有可能使讀寫過程只執行一次? –

+0

你可以讓寫作只發生一次。如果您不希望閱讀發生一次以上,請將標籤切成兩半;-) – ThomasRS

回答

3

後您的標籤寫的,你可以這樣做,但要記住,這個過程是不可逆的。

Ndef ndef = Ndef.get(tag); 
    if (ndef != null) { 
     ndef.makeReadOnly(); 
    } 
-1

是的,可以使活動只讀寫標籤一次。我通過將一個標誌聲明爲一個全局變量並使用該標誌來控制我的標籤讀取和寫入來解決了我的問題。

在你的類中聲明一個標誌爲布爾值。 假設:

public class YourClass{ 
Boolean flag= false; 
. 
. 
. 
. 
void resolveIntent(Intent intent) 
{ 
    NdefMessage msg1, msg2; 
// Parse the intent 
    String action = intent.getAction(); 
if(flag== false){ 
flag = true; 
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || 
     NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { 

     try 
     { 
      mRecord=createRecord(); 
     } 
     catch (Exception e) 
     { 
      Toast toaste = Toast.makeText(getApplicationContext(), 
"exception in call to create record", Toast.LENGTH_SHORT); 
      toaste.show(); 
     } 

     // When a tag is discovered we send it to the service to be save. We 
     // include a PendingIntent for the service to call back onto. This 
     // will cause this activity to be restarted with onNewIntent(). At 
     // that time we read it from the database and view it. 
     Parcelable[] rawMsgs = 
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
     NdefMessage[] msgs; 

     if (rawMsgs != null) 
     { 
      msgs = new NdefMessage[rawMsgs.length]; 
      for (int i = 0; i < rawMsgs.length; i++) 
      { 
       msgs[i] = (NdefMessage) rawMsgs[i]; 
      } 

      msg1 = msgs[0]; 
      myPayload=msg1.getRecords()[0].getPayload(); 
     } 
     else { 
      // Unknown tag type 
      byte[] empty = new byte[] {}; 
      NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, 
empty, empty, empty); 
      msg2 = new NdefMessage(new NdefRecord[] {record}); 
      msgs = new NdefMessage[] {msg2}; 
     } 
     writeToNfcTag(intent); 
     } 
    } 
. 
. 
. 
. 
} 

希望它有幫助。