我正在開發一個在 Xamarin for Android 中開發的基于 NFC 的應用程式。該應用程式有一個“連接”按鈕,NFC 掃描程序僅在點擊該按鈕時開始。配置正確的意圖后,每當檢測到 NFC 標簽時,都會呼叫 HandleNewIntent() 方法并遵循 NFC 讀取程序。
internal void HandleNewIntent(Intent intent)
{
try
{
if (intent.Action == NfcAdapter.ActionTagDiscovered || intent.Action == NfcAdapter.ActionNdefDiscovered)
{
_currentTag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag;
if (_currentTag != null)
{
Task.Run(() => { ReadDataFromTag(_currentTag); });
}
}
}
catch (Exception ex)
{
//Display error
}
}
在正常情況下,這可以正常作業。但是,如果手機與 NFC 標簽保持聯系,然后點擊“連接”按鈕,則不會觸發 TagDiscovered 意圖。用戶必須將手機拿走,將其重新與 NFC 標簽接觸,然后才會觸發事件。我在 Play 商店和 2 部不同的 Android 手機上觀察到了通用 NFC 應用程式的相同行為。
看起來 Android 在與 NFC 標簽接觸時會保持手機的 NFC 系結,因此未檢測到意圖。在啟動新的 NFC 連接之前,是否需要做任何事情來釋放此類鏈接(如果有)?
uj5u.com熱心網友回復:
所有 NFC 均由 System NFC 服務和 System App 處理,通常由進入范圍的 Tag 觸發,然后立即將 Intent 傳遞到正確的應用程式,因此系統 NFC 服務已經在您之前將 Intent 傳遞到另一個 App應用程式已按下按鈕。
您沒有顯示為設定應用程式的 NFC 配置所做的所有代碼,但正如您所說,Intents您可能正在使用enableForegroundDispatch具有許多問題的舊且不可靠的 API。
雖然在您的應用程式恢復后立即啟用前臺 NFC 檢測然后在立即檢測時處理標簽是更正常的,但可以存盤Tag物件直到按下按鈕。
我建議您使用enableReaderMode問題較少的更好和更新的 API,因為它是 NFC 硬體的更直接介面,因此您的用例似乎可以使用下面的代碼作業。
public class MainActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback{
private NfcAdapter mNfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void Button(View view) {
Log.v("TAG", "DetailedScoresActivity:onTagDiscovered:Start");
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if(mNfcAdapter!= null) {
Bundle options = new Bundle();
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 250);
mNfcAdapter.enableReaderMode(this,
this,
NfcAdapter.FLAG_READER_NFC_A |
NfcAdapter.FLAG_READER_NFC_B |
NfcAdapter.FLAG_READER_NFC_F |
NfcAdapter.FLAG_READER_NFC_V |
NfcAdapter.FLAG_READER_NFC_BARCODE |
NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK |
NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS,
options);
}
}
public void onTagDiscovered(Tag tag) {
Log.v("TAG", "onTagDiscovered:Start");
}
@Override
protected void onPause() {
super.onPause();
if(mNfcAdapter!= null)
mNfcAdapter.disableReaderMode(this);
}
}
For me you can place a Tag against the phone and then start the App and as soon as the Button is clicked and `enableReaderMode` is enabled then `onTagDiscovered` is triggered with the Tag object.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/452315.html
