Чтение тегов NFC извне приложения не возвращает данных
У меня есть приложение xamarin, которое читает теги 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 мои намерения. Данные всегда возвращаются как нулевые при сканировании извне приложения. Есть какие-нибудь мысли о том, где может быть моя проблема?
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 сканируется в приложении, он возвращается как истинный. Продолжая, тег заканчивается как ноль и просто попадает в оператор return. При сканировании в приложении тег не является нулевым и продолжается.
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);
}
1 ответ
Намерение NDEF_DISCOVERED фильтрует только тип первой записи в сообщении NDEF тега.
Как ваше приложение запускается с намерением действий MAIN (AndroidNFCHelper.isNfcIntent(intent)
ложно) и без каких-либо Tag
объект в намерениях статистов (intent.GetParcelableExtra(NfcAdapter.ExtraTag)
является нулевым), ваше сообщение NDEF, вероятно, содержит запись приложения Android помимо URL.
Причина, по которой ваше приложение запускается, даже если сообщение NDEF (читаемое как "первая запись") не соответствует вашему фильтру намерений, заключается в том, что AAR откатится к запуску вашего приложения, как если бы был нажат значок запуска (т.е. действие MAIN, категория ЗАПУСК), если нет соответствующего фильтра намерений NFC.
Так что ваше сообщение NDEF, вероятно, выглядит примерно так:
+ ---------------------------------------------- + | НЕКОТОРЫЙ ЗАПИСЬ | +----------------------------------------------+ | WKT: URI | http://app.mydomain.com/p/9 | +----------------------------------------------+ | ВНЕШНЕЕ: android.com:pkg | com.mydomain.app | +----------------------------------------------+
Или просто так:
+ ---------------------------------------------- + | ВНЕШНЕЕ: 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 в начало сообщения NDEF, а AAR - в конец сообщения NDEF:
+ ---------------------------------------------- + | WKT: URI | http://app.mydomain.com/p/9 | + ---------------------------------------------- + | ВНЕШНЕЕ: android.com:pkg | com.mydomain.app | +----------------------------------------------+