Android / NFC: получить тег в onCreate() без нового намерения
Я работаю над NFC-приложением. Чтобы запустить мое приложение, я использую NDEF-тег с записью AAR NDEF внутри.
Это отлично работает. Но теперь я хочу читать содержимое тега непосредственно с приложением. Как я могу это сделать?
(Это уже работает, когда я удаляю метку с телефона и снова касаюсь ее, но я хочу исключить этот шаг.)
Обновление: некоторые подробности Хорошо, чтобы было понятнее, вот некоторые части моего текущего кода.
private NfcAdapter nfcAdapter;
private static final int PENDING_INTENT_TECH_DISCOVERED = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_l);
text_output = (TextView) findViewById(R.id.textView2);
NfcAdapter adapter = ((NfcManager) getSystemService(Context.NFC_SERVICE))
.getDefaultAdapter();
}
@Override
public void onResume() {
super.onResume();
nfcAdapter = ((NfcManager) this.getSystemService(Context.NFC_SERVICE))
.getDefaultAdapter();
PendingIntent pi = createPendingResult(PENDING_INTENT_TECH_DISCOVERED,
new Intent(), 0);
nfcAdapter.enableForegroundDispatch(this, pi,
new IntentFilter[] { new IntentFilter(
NfcAdapter.ACTION_TECH_DISCOVERED) }, new String[][] {
new String[] { "android.nfc.tech.NdefFormatable" },
new String[] { "android.nfc.tech.Ndef" } });
}
@Override
public void onPause() {
super.onPause();
nfcAdapter.disableForegroundDispatch(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
final Intent data) {
switch (requestCode) {
case PENDING_INTENT_TECH_DISCOVERED:
Runnable runnable = new Runnable() {
@Override
public void run() {
doTagOperation(data);
}
};
new Thread(runnable).start();
break;
}
}
private void doTagOperation(Intent data) {
try {
String action = data.getAction();
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
Tag tag = data.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndefTag = Ndef.get(tag);
}
} catch (Exception ex) {
...
}
}
Чтобы запустить приложение, я использую AAR-NDEF-Record для тега, который может быть создан следующим образом: NdefRecord ndr = NdefRecord.createApplicationRecord("com.example.something");
Итак, что я хочу: коснитесь тега, когда приложение не запускается, запускает приложение (уже работает), а затем оно должно непосредственно прочитать тег без необходимости отодвигать телефон от тега и снова коснуться его.
2 ответа
Если вы хотите получить намерение обнаружения NDEF в начале своей деятельности, вам нужно добавить фильтр намерений, который запускает сообщение NDEF тега, в манифест приложения:
<activity ... >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Я предполагаю, что у вас уже есть выше, поэтому вам нужно будет добавить фильтр намерений NDEF:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
Вы можете использовать триггер на основе URI:
<data android:scheme="http" android:host="mroland.at" android:pathPrefix="/test" />
Или схема на основе MIME:
<data android:mimeType="application/vnd.mroland.test" />
Или, если вы хотите получить обнаруженное NDEF намерение для тега, который содержит только AAR (я должен признать, что я никогда не проверял это, поэтому я только предполагаю, что это должно работать):
<data android:scheme="vnd.android.nfc" android:host="ext"
android:pathPrefix="/android.com:pkg" />
Но вы должны использовать один из них. (По крайней мере, на большинстве устройств, которые вы должны. Некоторые устройства / версии Android будут принимать фильтр намерений даже без data
элемент.)
</intent-filter>
</activity>
Затем вы можете получить намерение в onCreate()
, onStart()
, onResume()
или где вы хотите прочитать, используя getIntent()
метод.
Обратите внимание, что если вы не добавите фильтр намерений для NDEF_DISCOVERED
к вашему манифесту, сообщение NDEF с AAR для вашего приложения вызовет намеренное действие MAIN
с категорией LAUNCHER
чтобы перейти к вашей первой деятельности, которая объявляет такой фильтр намерений. В этом случае вы не получите сообщение NDEF. Поэтому, если вы хотите получить сообщение NDEF, вы должны объявить фильтр намерений для NDEF_DISCOVERED
, В этом случае вы можете выбрать, какое действие запускается AAR, установив NDEF_DISCOVERED
фильтр намерений для этой конкретной деятельности.
Вам необходимо использовать метод onNewIntent(), как описано в документации. Метод onCreate() должен содержать код установки, который у вас есть в onResume(). Это заставит приложение работать во всех случаях.
Из документации Android ( http://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc.html):
public void onPause() {
super.onPause();
mAdapter.disableForegroundDispatch(this);
}
public void onResume() {
super.onResume();
mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
}
public void onNewIntent(Intent intent) {
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
//do something with tagFromIntent
}