Android:Empfangen und Verarbeiten von NDEF-Datensätzen
-
21-12-2019 - |
Frage
Was ich versucht habe, ist, eine Ganzzahl zu senden und zu empfangen und dann diese Ganzzahl zu nehmen und sie auf den herunterzählenden Timer zu setzen.Bisher kann ich die Ganzzahl senden und die Anwendung auf dem anderen Gerät öffnen. Wenn das Gerät jedoch die Aktivität lädt, öffnet es die MainActivity und nicht die Newgame-Aktivität.Ich muss an dieser Stelle zugeben, dass ich nicht sehr begabt bin und ein bisschen ein Neuling bin, aber hier ist der Auszug aus dem Code, der sich mit der NFC-Kommunikation befasst. Dieser Auszug stammt aus Newgame.java:
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
int time = bomb1.getTimer();
String message = ( " " + time);
NdefMessage msg = new NdefMessage(
new NdefRecord[] { NdefRecord.createMime(
"application/vnd.com.Jhadwin.passthebomb.newgame" ,message.getBytes())
,NdefRecord.createApplicationRecord("com.Jhadwin.passthebomb")
});
return msg;
}
@Override
public void onResume() {
super.onResume();
// Check to see that the Activity started due to an Android Beam
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());
}
}
@Override
public void onNewIntent(Intent intent) {
// onResume gets called after this to handle the intent
setIntent(intent);
}
/**
* Parses the NDEF Message from the intent and prints to the TextView
*/
void processIntent(Intent intent) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
// only one message sent during the beam
NdefMessage msg = (NdefMessage) rawMsgs[0];
// record 0 contains the MIME type, record 1 is the AAR, if present
String newtimermsg = new String(msg.getRecords()[0].getPayload());
timeremtextview.setText(newtimermsg);
int newtimer = Integer.parseInt(newtimermsg);
bomb1.setTimer(newtimer);
bomb1.setState(true);
}
Wie Sie vielleicht bemerken, ist dieser Code aus dem NFC-Beispiel auf der Google-Website übernommen. Für jede Hilfe sind wir dankbar.
Ebenfalls enthalten ist der Anwendungsteil von AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.Jhadwin.passthebomb.MainActivity"
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.Jhadwin.passthebomb.newgame"/>
<activity android:name="com.Jhadwin.passthebomb.About"/>
<activity android:name="com.Jhadwin.passthebomb.Help"/>
</application>
Lösung
Wenn Sie einen Android Application Record (AAR) verwenden und keinen angeben NDEF_DISCOVERED
Wenn Sie den Intent-Filter im Manifest Ihrer App verwenden, weiß Android beim Start nicht, dass Ihre App einen NFC-Intent verarbeiten kann.Folglich wird die erste Aktivität aus Ihrem Manifest geöffnet, die a deklariert MAIN
Absichtsfilter mit Kategorie LAUNCHER
ohne die empfangene NDEF-Nachricht weiterzuleiten.Also in deinem Fall, com.Jhadwin.passthebomb.MainActivity
verwendet wird.
Damit Android eine NFC-Absicht (einschließlich der empfangenen NDEF-Nachricht) an Ihr Gerät weiterleitet newgame
Aktivität müssten Sie einen geeigneten Absichtsfilter hinzufügen:
<activity android:name="com.Jhadwin.passthebomb.newgame">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/vnd.com.jhadwin.passthebomb.newgame" />
</intent-filter>
</activity>
Beachten Sie, dass es Intent-Filter in Android gibt Groß- und Kleinschreibung beachten.Um Probleme mit Typen mit gemischter Groß- und Kleinschreibung zu vermeiden, konvertiert Android MIME-Typen und externe Typnamen des NFC-Forums automatisch in KLEINBUCHSTABEN (Normalerweise wird bei solchen Typnamen die Groß-/Kleinschreibung nicht beachtet).Daher müssen Sie den MIME-Typ all angeben Kleinbuchstaben um eine Übereinstimmung zu erreichen.
Ansonsten noch ein paar Vorschläge:
Android-Paketnamen (und in Java-Paketnamen im Allgemeinen) sollten nur Kleinbuchstaben verwenden.Klassennamen (einschließlich Aktivitäten) sollten mit einem Großbuchstaben beginnen.
Anstatt Ihre benutzerdefinierten anwendungsspezifischen MIME-Typen zu erstellen, sollten Sie externe Typen des NFC-Forums bevorzugen:
NdefMessage msg = new NdefMessage(new NdefRecord[] { NdefRecord.createExternal( "jhadwin.com", // your domain name "passthebomb.newgame", // your type name message.getBytes()), // payload NdefRecord.createApplicationRecord("com.jhadwin.passthebomb") });
In diesem Fall könnten Sie einen Absichtsfilter wie diesen verwenden:
<activity android:name="com.jhadwin.passthebomb.NewGame"> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="vnd.android.nfc" android:host="ext" android:pathPrefix="/jhadwin.com:passthebomb.newgame" /> </intent-filter> </activity>