Приложението за Android активира NFC само за една дейност

Възможно ли е да активирате NFC само за една дейност в android за приложение с NFC?

Прочетох това, Четене на NFC тагове само от определена дейност

Но устройствата все още сканират за тагове за всички дейности на приложението.

РЕДАКТИРАНЕ:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.nfccheckout" >

    <uses-feature
        android:name="android.hardware.nfc"
        android:required="true" />

    <uses-permission android:name="android.permission.NFC" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".activities.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".activities.ReceiveActivity"
            android:label="@string/title_activity_receive" >
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="application/json+com.example.nfccheckout" />
            </intent-filter>
        </activity>
        <activity
            android:name=".activities.CreatePayloadActivity"
            android:label="@string/title_activity_create_payload" >
        </activity>
        <activity
            android:name=".activities.ConfirmationActivity"
            android:label="@string/title_activity_confirmation" >
        </activity>
    </application>

</manifest>

person Tiago Veloso    schedule 05.06.2014    source източник
comment
Моля, публикувайте своя манифест.   -  person CommonsWare    schedule 05.06.2014
comment
@CommonsWare добави манифеста   -  person Tiago Veloso    schedule 05.06.2014
comment
Ако искате да сканирате Nfc, когато тази конкретна дейност се изпълнява, тогава използвайте решението на @Michael Roland и също така премахнете филтъра за намерения от манифеста за тази дейност.   -  person Ravi Bhatt    schedule 06.06.2014
comment
Моля, задайте решението на @Michael като решение на вашия проблем. Наистина работи.   -  person Kaitiff    schedule 29.04.2015
comment
Опитайте това, което по същество представлява задаване на празно намерение като ваше PendingIntent в дейностите, в които не искате нищо да се случва с NFC (и също така не искате стандартният четец на Android да изскача): stackoverflow.com/a/57237196/5147164   -  person policenauts    schedule 28.07.2019


Отговори (2)


Ако искате да забраните обработката на събития за откриване на NFC (NDEF_DISCOVERED, TECH_DISCOVERED, TAG_DISCOVERED), докато определена дейност е на преден план, трябва да регистрирате тази дейност за система за изпращане на преден план. След това тази дейност може да игнорира тези събития (които би получила в своя onNewIntent() метод.

Това ще попречи на събитията за откриване на NFC да бъдат доставени до всички други дейности (така че тези във вашето приложение и във всяко друго инсталирано приложение), които имат филтър за намерение за откриване на NFC, регистриран в манифеста.

Този метод обаче няма да деактивира NFC модема на устройството. Така че NFC чипът все още ще търси етикети, но те просто няма да бъдат докладвани на нито едно приложение.

Така че всички дейности, за които искате да деактивирате NFC, ще направят нещо подобно:

public void onResume() {
    super.onResume();
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}

public void onPause() {
    super.onPause();
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    nfcAdapter.disableForegroundDispatch(this);
}

public void onNewIntent(Intent intent) {
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
        // drop NFC events
    }
}
person Michael Roland    schedule 05.06.2014
comment
Възможно ли е това на Flutter? Използвам FlutterNFCKit, но не можах да намеря начин да приложа това. - person cocos2dbeginner; 05.10.2020

Вашият ReceiveActivity е настроен да се задейства всеки път, когато се срещне NDEF таг с посочения тип MIME. Ако не искате това поведение, трябва да направите нещо, като например да премахнете този <intent-filter>.

person CommonsWare    schedule 05.06.2014