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