При таком методе чтения вам не нужно время, сколько ваше приложение тратит на чтение тегов NF C, поскольку время всегда будет точно равно нулю.
Это потому, что Android ОС полностью прочитала данные из тега, прежде чем результат будет передан в ваше приложение.
Существуют способы на самом деле прочитать тег самостоятельно, если вы действительно хотите время чтения тега.
Обновление: Поскольку вы не сказали мне тип используемой вами карты, невозможно написать код для измерения желаемого времени.
Некоторые сведения:
Все операции с картой NF C на низком уровне будут выполнять от 1 до N числа операций transceive
, при этом каждая операция transceive
отправляет байтовый массив от 1 до N байтов и возвращает байтовый массив. от 0 до N байт.
В качестве необработанного времени чтения вы должны указать время, необходимое для выполнения правильного числа команды transeive
для чтения данных.
Время выполнения операций более высокого уровня будет также укажите время, необходимое для разбора число N байтовых массивов в NdefMessage
, а также transceive
команды
код:
Так как я не знаю карту введите лучшее, что я могу сделать, это получить время, необходимое для подключения к карте, чтения данных и анализа их на NdefMessage
Это время любой операции, которая может вызвать радиочастотную активность и блокировать дальнейшее выполнение кода.
Код игнорирует тот факт, что операционная система Android уже прочитала карту и передала вам данные карты с нулевым временем в приложении, потраченном на чтение карты, она перечитывает карту чтобы получить время. Обратите внимание, что если вы быстро уберете карту, это может привести к возникновению исключений и потере времени на чтение карты.
Я мог бы написать код для использования enableReaderMode
, который более надежен, особенно при записи на карту, и имеет много других преимуществ. Но вместо этого я использовал ForegroundDispatch
, так как пример кода использовал ForegroundDispatch
, поэтому я последовал его примеру.
PS Я бы не рекомендовал использовать ForegroundDispatch
package com.test.foregrounddispatch;
import androidx.appcompat.app.AppCompatActivity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
NfcAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAdapter = NfcAdapter.getDefaultAdapter(this);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
mAdapter.disableForegroundDispatch(this);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndefDetected.addDataType("*/*");
} catch (IntentFilter.MalformedMimeTypeException e) {}
IntentFilter techDetected = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
IntentFilter[] nfcIntentFilter = new IntentFilter[]{ndefDetected,techDetected,tagDetected};
PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
if(mAdapter!= null)
mAdapter.enableForegroundDispatch(this, pendingIntent, nfcIntentFilter, null);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
// While with ForegroundDispatch the NDEF message has already been read
// And passed to us in the intent and thus the time the App spends "read" the NFC card is Zero
// We want to time time the read, so now we have been notified that a NDEF card is in range
// Try and read from it
// Get the Tag from the intent
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
long startTime = 0;
long endTime = 0;
try {
// Create an NDEF tag object
Ndef ndefTag = Ndef.get(tag);
// This is the I/O operation to read the card and format the result to an NDEF message
// Nothing is done with the result to not add any time to it, as we are timing this
startTime = System.currentTimeMillis();
ndefTag.connect();
ndefTag.getNdefMessage();
endTime = System.currentTimeMillis();
ndefTag.close();
} catch (Exception e) {
Log.e("NFC", e.toString());
}
Log.v("NFC", "Time to read in milliseconds is: " + (endTime - startTime));
}
}
}
Для краткости " Привет "NDEF запись простого текста на моем телефоне, она производит журнал: -
V / NF C: Время чтения в миллисекундах: 18