androide:Ricezione ed elaborazione dei record NDEF
-
21-12-2019 - |
Domanda
Quello che sto cercando di fare è inviare un numero intero e riceverlo, quindi prendere quel numero intero e impostarlo sul timer che esegue il conto alla rovescia.Finora sono in grado di inviare il numero intero e aprire l'applicazione sull'altro dispositivo, tuttavia quando il dispositivo carica l'attività, apre l'attività MainActivity e non l'attività Newgame.Devo ammettere che a questo punto non sono un esperto di programmazione e sono un po' alle prime armi, ma ecco l'estratto del codice che si occupa della comunicazione NFC, questo estratto proviene da 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);
}
Come puoi notare, questo codice è adattato dall'esempio NFC sul sito Web di Google, qualsiasi aiuto potrebbe essere apprezzato.
È inclusa anche la parte applicativa di 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>
Soluzione
Se utilizzi un Android Application Record (AAR) e non specifichi un file NDEF_DISCOVERED
filtro intent nel manifest della tua app, Android non saprà che la tua app può gestire un intent NFC al momento del lancio.Di conseguenza, si aprirà la prima attività dal tuo manifest che dichiara a MAIN
filtro di intenti con categoria LAUNCHER
senza passare il messaggio NDEF ricevuto.Quindi, nel tuo caso, com.Jhadwin.passthebomb.MainActivity
sarà usato.
Per fare in modo che Android trasmetta un intento NFC (incluso il messaggio NDEF ricevuto) al tuo newgame
attività, dovresti aggiungere un filtro di intenti adeguato:
<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>
Tieni presente che i filtri di intenti in Android sono MAIUSCOLE E MINUSCOLE.Per evitare problemi con i tipi misti, Android converte automaticamente i tipi MIME e i nomi dei tipi esterni del forum NFC in MINUSCOLO (di solito tali nomi di tipo non fanno distinzione tra maiuscole e minuscole).Pertanto, è necessario specificare il tipo MIME come all minuscolo per ottenere una partita.
Oltre a ciò, questi sono alcuni altri suggerimenti:
I nomi dei pacchetti Android (e i nomi dei pacchetti Java in generale) dovrebbero utilizzare solo lettere minuscole.I nomi delle classi (comprese le attività) devono iniziare con una lettera maiuscola.
Invece di creare tipi MIME personalizzati specifici per l'applicazione, dovresti preferire i tipi esterni del forum NFC:
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 tal caso potresti utilizzare un filtro di intenti come questo:
<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>