Sto tentando di avviare un'attività specifica quando il mio telefono esegue la scansione di un tag NFC. Questo è ciò che il mio manifesto appare come:Avvio di un'attività specifica durante la scansione del tag 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>
Ogni volta che avvio la scansione tag, i miei principali lanci di attività, ma mi piacerebbe il mio BluePrintActivity per lanciare. Non sono sicuro del perché questo sia il caso. Ecco il mio codice per la scrittura di tag:
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: La risposta ho accettato sopra di me ha fatto capire verso la giusta direzione, ma dal momento che stavo scrivendo a un tag, il codice nella risposta accettato non è esattamente la soluzione corretta . Se si sta scrivendo a un tag, questo è ciò che devi fare:
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 });
Se si desidera memorizzare un carico utile, basta sostituire l'ultimo parametro "new byte [0]" per un dato appropriati.
Questo è piuttosto strano, perché in base alla documentazione qui (http://developer.android.com/guide/topics/connectivity/nfc/nfc.html), si dice che Android tenterà di eseguire l'attività che ha l'intento-filtro corrispondente. Credo che la documentazione di Android potrebbe essere qui. Darò questa prova quando torno a casa stasera. – l46kok
Sei fedele al filtro intent ma il tag che stai creando al momento è un record di applicazione Android anziché un Mime Record su cui stai attualmente filtrando. Fondamentalmente non hai un filtro intent per il tag che stai attualmente scrivendo. Ma poiché si tratta di un record di applicazioni Android, l'applicazione è ancora in esecuzione. –