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 как все строчные буквы для достижения соответствия.
Кроме того, это еще несколько предложений:
Имена пакетов Android (и в именах пакетов Java в целом) должны использовать только строчные буквы. Имена классов (включая действия) должны начинаться с заглавной буквы.
Вместо создания пользовательских типов 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>