如何使用Android停止覆盖NFC标签

时间:2012-08-27 20:41:22

标签: android android-intent nfc

我在卡片仿真模式下使用PN512作为NFC标签,我正在开发一个Android应用程序来读取和写入标签。问题是,只要标签在NFC字段中,程序就会继续读取和写入标签,但我希望一旦成功写入就停止程序覆盖相同的标签。那有什么解决方案吗?

(我知道无法以编程方式禁用基于Android SDK的NFC)

@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();
    }
}

2 个答案:

答案 0 :(得分:3)

在您在标签中写入后,您可以执行此操作,但请记住,此过程不可逆转。

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

答案 1 :(得分:-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);
       }
    }
.
.
.
.
}

希望它有所帮助。