2

У меня есть приложение xamarin, которое читает теги NFC. Он отлично работает, когда приложение открыто, но если приложение находится в фоновом режиме или закрыто, он не может прочитать данные из тега.Чтение тегов NFC извне приложения возвращает данные

Моя цель фильтр:

[IntentFilter(
    new[] {"android.nfc.action.NDEF_DISCOVERED", "android.intent.action.VIEW", "android.intent.action.MAIN"}, 
    Categories = 
     new[] 
     { 
      "android.intent.category.DEFAULT", "android.intent.category.BROWSABLE", 
      "android.intent.category.LAUNCHER" 
     }, 
    DataScheme = "http", DataHost = "app.myDomain.com")] 

И в моем OnNewIntent, мой intent.Data всегда возвращается в нуль при сканировании со стороны приложения. Есть ли мысли о том, где моя проблема?

OnResume:

nfcAdapter.EnableForegroundDispatch(this, nfcPendingIntent, nfcIntentFiltersArray, null); 

OnNewIntent:

protected override void OnNewIntent(Intent intent) 
{    
if (AndroidNFCHelper.isNfcIntent(intent)) 
{ 
    DisplayMessage("And it is an NFC intent"); 
} 

var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag; 

if (tag == null) 
{ 
    Debug.WriteLine("tag is null"); 
    return; 
} 

//rest of OnNewIntent code... 
} 

Так самое интересное, когда сканируется за пределами приложения, AndroidNFCHelper.isNfcIntent возвращается как ложное. Когда тот же тег NFC сканируется в приложении, он возвращается как истинный. Продолжая, тег заканчивается как null и просто удаляет оператор return. При сканировании в приложении тег не равен null и продолжается.

PrepareForegroundNFCHandling - вызывается в OnCreate():

private void PrepareForegroundNFCHandling() 
{ 

var tagDetected = new IntentFilter(NfcAdapter.ActionTagDiscovered); 
var ndefDetected = new IntentFilter(NfcAdapter.ActionNdefDiscovered); 

nfcIntentFiltersArray = new[] { ndefDetected, tagDetected}; 

var intent = new Intent(this, GetType()).AddFlags(ActivityFlags.SingleTop | ActivityFlags.BroughtToFront); 
nfcPendingIntent = PendingIntent.GetActivity(this, 0, intent, 0); 

nfcAdapter = NfcAdapter.GetDefaultAdapter(Application.ApplicationContext);    
} 
+0

Какие данные (сообщение NDEF) вы сохранили на ярлыке? Нажимает ли тег, когда ваше приложение закрыто (или в фоновом режиме), вызывает открытие вашей активности? Какой у вас код в OnCreate(), OnStart(), OnResume()? Какое намерение вы видите в OnNewIntent()? –

+0

Это всего лишь URL-адрес .. что-то вроде http://app.myDomain.com/p/9. Нажатие с закрытым приложением открывает приложение, но поскольку объект тега в конечном счете возвращается к нулю, ничего не происходит.Я обновляю сообщение другим кодом – Arthurdent510

+0

Вы вызываете OnNewIntent() из любого места в своем коде? Вы уверены, что ваш тег содержит только одну запись NDEF с URL-адресом и что она не содержит запись приложения Android с именем вашего приложения? –

ответ

1

Намерение NDEF_DISCOVERED фильтры только для типа первой записи в ЦНК ообщение тега.

Как приложение запускается с намерением действия MAIN (AndroidNFCHelper.isNfcIntent(intent) ложна) и без какого-либо объекта Tag в намерениях статистов (intent.GetParcelableExtra(NfcAdapter.ExtraTag) равно нулю), ваше ЦНК сообщение, вероятно, содержит приложения Android записи помимо URL.

Причина, по которой ваше приложение запущено, даже если сообщение NDEF (считанное как «первая запись») не соответствует вашему фильтру намерений, заключается в том, что AAR вернется к запуску вашего приложения, как если бы щелкнул значок запуска (т.е. action MAIN, категория LAUNCHER), если нет соответствующего фильтра соответствия NFC.

Так что ваш ЦНК сообщение, вероятно, выглядит примерно так:

 
+----------------------------------------------+ 
| SOME RECORD         | 
+----------------------------------------------+ 
| WKT: URI | http://app.mydomain.com/p/9  | 
+----------------------------------------------+ 
| EXTERNAL: android.com:pkg | com.mydomain.app | 
+----------------------------------------------+ 

Или просто, как это:

 
+----------------------------------------------+ 
| EXTERNAL: android.com:pkg | com.mydomain.app | 
+----------------------------------------------+ 
| WKT: URI | http://app.mydomain.com/p/9  | 
+----------------------------------------------+ 

В первом случае, вы должны изменить фильтр намерений, чтобы соответствовать вашей записи «НЕКОТОРЫЕ ЗАПИСИ». В последнем случае, вы должны изменить свой фильтр намерений, чтобы соответствовать внешнему типу «Android: COM: PKG»:

DataScheme = "vnd.android.nfc", DataHost = "ext", DataPathPrefix = "/android.com:pkg" 

Или, еще лучше, вы перемещаете URL в начало сообщения ЦНКА и AAR до конца сообщения NDEF:

 
+----------------------------------------------+ 
| WKT: URI | http://app.mydomain.com/p/9  | 
+----------------------------------------------+ 
| EXTERNAL: android.com:pkg | com.mydomain.app | 
+----------------------------------------------+ 
Смежные вопросы