NFC機能を使用したい小さなAndroidアプリケーションを開発しています。私はこれを次の方法で行いました
ライター側:
boolean addAAR = true;
String uniqueId = "qrfid://nilkash";
byte[] uriField = uniqueId.getBytes(Charset.forName("US-ASCII"));
System.arraycopy(uriField, 0, payload, 0, uriField.length);
NdefRecord rtdUriRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], uriField);
if(addAAR)
{
return new NdefMessage(new NdefRecord[] {
rtdUriRecord, NdefRecord.createApplicationRecord("com.example.androidnfcurlreader")
});
そして受信側では、マニフェストファイルでこれを使用しています
<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="application/com.example.androidnfcurlreader" />
</intent-filter>
私のいくつかのことによると、タグを読んでアプリケーションを起動するときのようにうまく機能していますが、タグを読んでアプリケーションを起動してもデータを読み取らないときに問題が発生することはほとんどありません。アプリが開かれると、データを取得するためにタグを再度読み取る必要があります。これをチェックして、アプリケーションの起動時に、NDEF_DISCOVERED ではなくメインとしてインテント アクションを表示します。アプリケーションが開いているときにタグを読み取ると、データが表示され、その時点でアクションはNDEF_DISCOVEREDです。しかし、タグを読み取るときに必要なのは、アプリケーションを開き、データも表示します。
何をすべきか?この問題を解決するには?私は何か間違ったことをしていますか?助けてください。ありがとうございました 。
//Reading of data from tag is like this
// inside oncreate activity
handleIntent(intent);
// inside onresume
setupForegroundDispatch(activity, mNfcAdapter);
// inside on pause
stopForegroundDispatch(activity, mNfcAdapter);
// on new intent
handleIntent(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);
sendData(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;
}
}
}
}
private void setupForegroundDispatch(final Activity activity, NfcAdapter adapter) {
final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass());
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
final PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0);
IntentFilter[] filters = new IntentFilter[1];
String[][] techList = new String[][]{};
// Notice that this is the same filter as in our manifest.
filters[0] = new IntentFilter();
filters[0].addAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
filters[0].addCategory(Intent.CATEGORY_DEFAULT);
try {
filters[0].addDataType(MIME_TEXT_PLAIN);
} catch (MalformedMimeTypeException e) {
throw new RuntimeException("Check your mime type.");
}
adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList);
}
private static void stopForegroundDispatch(final Activity activity, NfcAdapter adapter)
{
adapter.disableForegroundDispatch(activity);
}
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);
}
private void sendData(String result)
{
eventlistsetter.getRfidListener().handleEvent(0, result);
}
}