1

カード エミュレーション モードで 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();
    }
}
4

2 に答える 2