こんにちは、nfc タグを読み書きするアプリケーションを開発しています。私はすでに、nfc 用の 2 つの個別のリーダーおよびライター アプリケーションを構築しています。今、私はそれらを一緒にマージしたいと思います。ここで私がライターアプリケーションで行ったこと:
// here I specify which application is going to listen for my tag.
new NdefMessage(new NdefRecord[] { rtdUriRecord,NdefRecord.createApplicationRecord("com.example.nfc")
そして読むために私は指定しています
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
両側をマージすると、マニフェストは次のようになります
<activity
android:name="com.example.nfc.NFCWriter"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.nfc.NFCReader"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
今私の意図は、アプリケーションが開いていてカードに触れるとカードにデータを書き込み、アプリケーションが開かれていないときにカードに触れるとカードからデータを読み取ることです。出来ますか。助けが必要。ありがとうございました
ライター側で...
// declearation for nfc
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP), 0);
IntentFilter discovery=new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
mWriteTagFilters = new IntentFilter[] { discovery };
// create ndf message
private NdefMessage getTagAsNdef()
{
boolean addAAR = true;
String uniqueId = "data";
byte[] uriField = uniqueId.getBytes(Charset.forName("US-ASCII"));
byte[] payload = new byte[uriField.length + 1]; //add 1 for the URI Prefix
payload[0] = 0x01; //prefixes http://www. to the URI
System.arraycopy(uriField, 0, payload, 1, uriField.length); //appends URI to payload
NdefRecord rtdUriRecord = new NdefRecord(
NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], payload);
if(addAAR)
{
return new NdefMessage(new NdefRecord[] {
rtdUriRecord, NdefRecord.createApplicationRecord("com.mobiotics.nfc")
});
}
else
{
return new NdefMessage(new NdefRecord[] {rtdUriRecord});
}
}
// listen for new intent for activity
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
Log.i("*******************************", "inside new intent writer1");
if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction()))
{
// validate that this tag can be written....
detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if(supportedTechs(detectedTag.getTechList())) {
// check if tag is writable (to the extent that we can
if(writableTag(detectedTag)) {
ready_to_write = true;
} else {
Toast.makeText(getApplicationContext(),"This tag is not writable",Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getApplicationContext(),"This tag type is not supported",Toast.LENGTH_SHORT).show();
}
}
// in manifest file
<activity
android:name="com.mobiotics.nfc.NFCWriter1"
android:label="WRITER1">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
そしてリーダー側で...
// get new intent ...
private void handleIntent(Intent intent)
{
String action = intent.getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
String type = intent.getType();
if (MIME_TEXT_PLAIN.equals(type)) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
//new NdefReaderTask().execute(tag);
setViewText(ndefmessage(tag));
} else {
Log.d(TAG, "Wrong mime type: " + type);
}
} else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
// In case we would still use the Tech Discovered Intent
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String[] techList = tag.getTechList();
String searchedTech = Ndef.class.getName();
for (String tech : techList) {
if (searchedTech.equals(tech)) {
//new NdefReaderTask().execute(tag);
ndefmessage(tag);
break;
}
}
}
}
// read tag data ...
private String ndefmessage(Tag tag)
{
Tag tag1 = tag;
Ndef ndef = Ndef.get(tag);
if (ndef == null) {
// NDEF is not supported by this Tag.
return null;
}
NdefMessage ndefMessage = ndef.getCachedNdefMessage();
NdefRecord[] records = ndefMessage.getRecords();
for (NdefRecord ndefRecord : records) {
if (ndefRecord.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
try {
return readText1(ndefRecord);
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "Unsupported Encoding", e);
}
}
}
return null;
}
private String readText1(NdefRecord record) throws UnsupportedEncodingException
{
byte[] payload = record.getPayload();
String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16";
int languageCodeLength = payload[0] & 0063;
return new String(payload, 0, payload.length , textEncoding);
}
//in manifest file for reader side...
<activity
android:name="com.mobiotics.nfc.NFCReader1"
android:label="@string/app_name" >
<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" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
だから私の問題は、同じアプリケーションでリーダーとライターの両方を使いたいということです。