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>
È stato utile?

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:

  1. 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.

  2. 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>
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top