У меня есть приложение, реагирующее на нативные данные, которое читает теги NFC и записывает URL-адрес.
Он использует ForegroundDispatch
, чтобы убедиться, что приложение захватывает отсканированную информацию и не перемещается в браузер при обнаружении ссылки. Ссылка используется только тогда, когда приложение не запущено, оно открывает браузер и показывает информацию с моего сервера внешнему пользователю.
Когда я нахожусь в приложении и выключаю экран (кнопка питания), затем снова включаю его и сканирую тег NFC, открывается браузер. Похоже, что отсканированное намерение не доставляется в приложение и вместо этого обрабатывается телефоном по умолчанию. После первого сканирования, которое открывает браузер, я возвращаюсь к приложению, и в приложении нормально работают следующие просмотры.
Вот поворот : на большинстве телефонов работает должным образом. Работает на Pixel 3 (Android 9), на Huawei (Android 5.1) на Sony (Android 7) и некоторых других. Но когда я использую UleFone X2 (http://ulefone.com/product.html), эта проблема возникает.
Я что-то делаю неправильно, чтобы инициализировать приложение, чтобы оно каждый раз обрабатывалось одинаково, даже когда оно возобновляется?
Из моих исследований похоже, что UleFone отключает NFC при выключении экрана и при его повторном включении, правильно ли я его инициализирую? Если я открою последние приложения и уйду от своего приложения, а затем вернусь в него, NFC начнет работать.
Это моя основная деятельность :
public class MainActivity extends ReactActivity {
private NfcAdapter mAdapter;
private PendingIntent mPendingIntent;
private IntentFilter[] mFilters;
private String[][] mTechLists;
private int mCount = 0;
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
mAdapter = NfcAdapter.getDefaultAdapter(this);
mPendingIntent = PendingIntent.getActivity(this, 0,
new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*");
} catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
};
mFilters = new IntentFilter[] {
ndef,
};
mTechLists = new String[][] { new String[] {NfcA.class.getName()}, new String[] {MifareClassic.class.getName()}, new String[] {Ndef.class.getName()}, };
Log.d("scantest", "onCreate completed");
}
@Override
protected void onPause() {
super.onPause();
if (mAdapter != null) mAdapter.disableForegroundDispatch(this);
Log.d("scantest","onPause completed");
}
@Override
public void onResume() {
super.onResume();
Intent intent = getIntent();
if (mAdapter != null) mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);
Log.d("scantest","onResume completed");
}
Ожидаемое поведение :
Все телефоны Android, поддерживающие NFC, обрабатывают сканирование NFC в приложении одинаково, при запуске и после его возобновления. Намерение всегда должно доставляться в мое приложение.
Текущее поведение :
Большинство телефонов работают нормально после того, как экран снова включается / выключается. На некоторых телефонах (UleFone), если я включаю / выключаю экран, при первом сканировании открывается браузер, а в приложении работают следующие.
Текущее решение :
После включения / выключения экрана, если я покидаю приложение с помощью недавних приложений (мне даже не нужно нажимать на другое приложение, просто нужно убедиться, что всплывают плитки последних приложений), затем нажмите, чтобы вернуться в моем приложении NFC не выходит из строя при первом сканировании.
В противном случае первое сканирование завершается неудачно и открывает браузер.