NFC стек перестает искать новые теги - PullRequest
0 голосов
/ 07 ноября 2018

Я на самом деле разрабатываю приложение с действием, которое должно обрабатывать тег NFC, чтобы пользователь мог использовать это приложение.

Это действие вызывается, когда приложение запускается и возобновляется.

В большинстве случаев это работает нормально, но время от времени телефон (Samsung galaxy xcover 4) перестает искать новые метки NFC, он даже не воспроизводит звук при обнаружении.

Когда эта ошибка добавлялась, я пытался использовать другое приложение из Play Store для обработки тега NFC, но ничего не произошло.

Вот моя активность по обнаружению:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    nfcAdapter = NfcAdapter.getDefaultAdapter(this);

    if (nfcAdapter == null || !nfcAdapter.isEnabled())
    {
        finish();
        return;
    }

    final Intent intent = new Intent(this.getApplicationContext(), this.getClass());
    final PendingIntent pendingIntent = PendingIntent.getActivity(this.getApplicationContext(), 0, intent, 0);

    //method to handle your intent
    handleTag(getIntent());
}

@Override
public void onResume()
{
    super.onResume();

    final Intent intent = new Intent(this.getApplicationContext(), this.getClass());
    final PendingIntent pendingIntent = PendingIntent.getActivity(this.getApplicationContext(), 0, intent, 0);
    nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}

@Override
protected void onPause()
{
    super.onPause();
    nfcAdapter.disableForegroundDispatch(this);
}

@Override
protected void onNewIntent(Intent intent)
{
    super.onNewIntent(intent);

    handleTag(intent);

    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}

private void handleTag(final Intent intent)
{
    String action = intent.getAction();
    final Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action))
    {
        try
        {
            Class isoDep = Class.forName("android.nfc.tech.IsoDep");
            Method isoDep_get = isoDep.getDeclaredMethod("get", Tag.class);

            final IsoDep techIsoDep = (IsoDep) isoDep_get.invoke(null, tag);

            if (techIsoDep != null)
            {
                // --- Tag detected
            }
        }
        catch (Exception e)
        {
            Log.e(TAG, "Exception while processing IsoPcdA object", e);
        }
    }
}

Редактировать: Я заметил, что это происходит из-за того, что, даже если экран не становится черным, процессор или NFC-ридер переходит в спящий режим, мне нужно заблокировать и разблокировать телефон, чтобы он снова заработал, сейчас я ищу способ сохранить процессор все время, что я пытался:

Работает только с Galaxy Xcover 3 (Android 6.0.1)

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Tag");
wl.acquire();

Я все еще не могу заставить его работать на Galaxy Xcover 4 (Android 8.1)

Пробовал с:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Но тоже не сработало.

1 Ответ

0 голосов
/ 07 ноября 2018

Это может произойти, если вы используете режим отладки в Android Studio и телефон теряет тег. телефон больше не сможет обнаружить метку, когда вы выключите NFC и включите его снова. Я не читал твой код, потому что ты сказал то же самое с другими приложениями. Просто попробуйте включить и выключить NFC в своем телефоне.

...