Próbuję uruchomić określone działanie, gdy mój telefon skanuje znacznik NFC. To właśnie mój manifest wygląda następująco:Uruchamianie określonej czynności podczas skanowania tagu NFC
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lgandroid.ddcnfc"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.NFC"/>
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="16" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.lgandroid.ddcnfc.BluePrintActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<data android:mimeType="application/com.lgandroid.ddcnfc"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:name="com.lgandroid.ddcnfc.LoginActivity"
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.lgandroid.ddcnfc.MainActivity"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.lgandroid.ddcnfc.PointDiagnosisActivity"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.lgandroid.ddcnfc.PointControlActivity"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.lgandroid.ddcnfc.SystemDiagnosisActivity"
android:label="@string/app_name" >
</activity>
<activity android:name="com.lgandroid.ddcnfc.SettingsActivity" android:label="@string/app_name"></activity>
</application>
Ilekroć skanuj mój tag, moje główne uruchamia działalności, ale chciałbym mój BluePrintActivity uruchomić. Nie jestem pewien, dlaczego tak się dzieje. Oto mój kod do pisania do tagu:
private boolean writeTag(Tag tag) {
NdefRecord appRecord = NdefRecord.createApplicationRecord("com.lgandroid.ddcnfc");
NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord });
try {
// see if tag is already NDEF formatted
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if (!ndef.isWritable()) {
nfcTextView.setText("Read-only tag.");
return false;
}
// work out how much space we need for the data
int size = message.toByteArray().length;
if (ndef.getMaxSize() < size) {
nfcTextView.setText("Tag doesn't have enough free space.");
return false;
}
ndef.writeNdefMessage(message);
nfcTextView.setText("Tag written successfully.");
return true;
} else {
// attempt to format tag
NdefFormatable format = NdefFormatable.get(tag);
if (format != null) {
try {
format.connect();
format.format(message);
nfcTextView.setText("Tag written successfully!\nClose this app and scan tag.");
return true;
} catch (IOException e) {
nfcTextView.setText("Unable to format tag to NDEF.");
return false;
}
} else {
nfcTextView.setText("Tag doesn't appear to support NDEF format.");
return false;
}
}
} catch (Exception e) {
nfcTextView.setText("Failed to write tag");
}
return false;
}
EDIT: Odpowiedź przyjąłem powyżej zasugerował mi w kierunku właściwym kierunku, ale ponieważ pisałem do znacznika, kod w przyjętym odpowiedź nie jest do końca prawidłowe rozwiązanie . Jeśli piszesz do znacznika, to co trzeba zrobić:
NdefRecord appRecord = new NdefRecord(
NdefRecord.TNF_MIME_MEDIA ,
"application/com.lgandroid.ddcnfc".getBytes(Charset.forName("US-ASCII")),
new byte[0], new byte[0]);
NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord });
Jeśli chcesz przechowywać ładunek, wystarczy zastąpić ostatni parametr „nowy bajt [0]” do odpowiednich danych.
To jest dość dziwne, ponieważ zgodnie z dokumentacją tutaj (http://developer.android.com/guide/topics/connectivity/nfc/nfc.html), mówi, że Android spróbuje uruchomić działanie, które ma pasujący filtr intencji. Domyślam się, że dokumentacja Androida może być wyłączona. Dam to spróbować, kiedy wrócę do domu dziś wieczorem. – l46kok
Masz rację, jeśli chodzi o filtr intencji, ale tag, który obecnie tworzysz, jest rekordem aplikacji Android zamiast rekordem Mime, w którym aktualnie filtrujesz. Zasadniczo nie masz filtra intencji dla tagu, który właśnie piszesz. Ponieważ jednak jest to rekord aplikacji Android, aplikacja jest nadal uruchomiona. –