Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Android > Не срабатывает событие onNewIntent на чтение метки


Автор: aquamakc 12.1.2017, 09:20
Доброго времени суток.
Пытаюсь по мунуалам читать NFC метку. Запускаюсь на устройстве на 6 андройде. NFC адаптер включен.

private NfcAdapter adapter;
private Tag myTag;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.NFC))
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.NFC}, 1);
        if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.BIND_NFC_SERVICE))
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BIND_NFC_SERVICE}, 1);   
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
        adapter = NfcAdapter.getDefaultAdapter(this);
        if (adapter == null) {
            log.setText("Bad adapter");
            finish();
        }
        readFromIntent(getIntent());
        IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
        tagDetected.addCategory(Intent.CATEGORY_DEFAULT);
    }
 
 @Override
    protected void onNewIntent(Intent intent) {
        setIntent(intent);
        readFromIntent(intent);
        if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){
            myTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        }
    }
 
    private void readFromIntent(Intent intent) {
        String action = intent.getAction();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
            Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
           /* полезные действия */
        }
    }

Файл манифеста:

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />
 
<intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
</intent-filter>
<meta-data
        android:name="android.nfc.action.TECH_DISCOVERED"
        android:resource="@xml/nfc_tech_filter" />

При контакте с NFC устройством ничего не происходит, даже не срабатывает точка останова в onNewIntent.

Такое ощущение, что что-то я пропустил, но не могу найти различия между моим кодом и кодом в статьях "на тему".

Автор: Felan 12.1.2017, 18:59
Активити не всегда получает NewIntent. Для этого она должна быть запущена с определенным флагом, типа SingleTop. Не увидел  в каком режиме активити запускается, так что в качестве предположения.

PS: Код форматируй, а то читать невозможно.

Автор: aquamakc 16.1.2017, 11:19
Felan
Код

<activity android:name=".MainActivity" android:launchMode="singleTop">
           <!-- <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain"/>
            </intent-filter>-->
            <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
                       android:resource="@xml/nfc_tech_filter" />
            <!--<intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED"/>
            </intent-filter>-->
        </activity>


Метка есть.
Ситуация сейчас такая: установлено несколько программ для чтения NFC. Включая мою. При контакте с NFC устройством. ОС предлагает выбор этих программ. 2 другие читают метку. При выборе моей она открывается, но метку не считывает. И, даже, если она уже запущена - всё-равно открывается список программ.

Автор: Felan 16.1.2017, 19:05
Ну тогда даже не знаю. Попробуй вот https://code.tutsplus.com/tutorials/reading-nfc-tags-with-android--mobile-17278 почитать. Прям готовый пример практически. Смотри фореграунд чтение.

Может неправильное событие, может неправильный формат метки.
Некоторое содержимое NDEF меток нельзя перехватить. Ну по крайней мере мне не удалось. Если записан URL то телефон всегда предлагает выбор приложений. Попробуй записать сначала что-нибудь свое сторонней программой, потом уже читать.

Метка точно доступна для чтения?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)