Как убедиться, что новое намерение NFC доставляет мою активность после выключения / включения экрана? - PullRequest
1 голос
/ 17 июня 2019

У меня есть приложение, реагирующее на нативные данные, которое читает теги 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 не выходит из строя при первом сканировании.

В противном случае первое сканирование завершается неудачно и открывает браузер.

1 Ответ

0 голосов
/ 17 июня 2019

Обходным путем может быть добавление этого намеренного фильтра к вашей деятельности https://developer.android.com/guide/topics/connectivity/nfc/nfc#tag-disc

<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>

С этим вы объявляете, что ваше приложение хочет перехватить любой тег NFC.Если на устройстве есть другое приложение, которое перехватывает тег nfc, то пользователю показывается меню, в котором можно выбрать, какое приложение получит намерение NFC.

...