Android: получение и обработка записей NDEF

То, что я пытался сделать, это отправить целое число и получить его, а затем взять это целое и установить его на таймер, который ведет обратный отсчет. Пока что я могу отправить целое число и открыть приложение на другом устройстве, однако, когда устройство загружает активность, оно открывает MainActivity, а не Newgame. Я должен признать, что на данный момент я не умный код и немного новичок, но вот фрагмент кода, который имеет дело с NFC Communication. Этот фрагмент взят из 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);
}

Как вы можете заметить, этот код адаптирован из примера NFC на сайте Google, любая помощь может быть оценена.

Также включена часть приложения 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>

1 ответ

Решение

Если вы используете запись приложения Android (AAR) и не указали NDEF_DISCOVERED Фильтр намерений в манифесте вашего приложения, Android не будет знать, что ваше приложение может обработать намерение NFC при запуске. Следовательно, он откроет первое действие из вашего манифеста, которое объявляет MAIN фильтр намерений с категорией LAUNCHER без передачи полученного сообщения NDEF. Так что в вашем случае, com.Jhadwin.passthebomb.MainActivity будет использоваться.

Чтобы заставить Android передавать намерение NFC (включая полученное сообщение NDEF) вашему newgame активность, вам нужно будет добавить правильный фильтр намерений:

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

Обратите внимание, что фильтры намерений в Android чувствительны к регистру. Чтобы избежать проблем со смешанными типами, Android автоматически конвертирует типы MIME и имена внешних типов NFC Forum в LOWER-CASE (обычно такие имена типов не чувствительны к регистру). Следовательно, вы должны указать тип MIME как все строчные буквы для достижения соответствия.

Кроме того, это еще несколько предложений:

  1. Имена пакетов Android (и в именах пакетов Java в целом) должны использовать только строчные буквы. Имена классов (включая действия) должны начинаться с заглавной буквы.

  2. Вместо создания пользовательских типов MIME для конкретных приложений следует использовать внешние типы NFC Forum:

    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")
    });
    

    В этом случае вы можете использовать фильтр намерений, например так:

    <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>
    
Другие вопросы по тегам