Как отключить TECH_DISCOVERED в приложении? - PullRequest
0 голосов
/ 12 июня 2019

Я использовал DeepLink для запуска своего приложения после определения определенного URL-адреса из NFC следующим образом.

        <activity
            android:name=".view.main.MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />

                <data
                    android:host="example.com"
                    android:scheme="http" />
            </intent-filter>

            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_tech_filter" />
        </activity>

Однако это работает, даже когда я уже запустил свое приложение.Таким образом, повторяющиеся действия продолжают появляться.И иногда это приводит мое приложение к сбоям или сбоям .Я просто хочу использовать Deeplink, пока я не использую свое приложение.

Есть ли способ решить эту проблему?

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Похоже, что решение Динеша должно работать, но если оно доставляет вам проблемы, вы можете попробовать альтернативное (более сложное) решение. Вы можете использовать метод NfcAdapter.enableForegroundDispatch(), чтобы взять под контроль действие android.nfc.action.TECH_DISCOVERED внутри своей деятельности и убедиться, что оно ничего не делает.

Вы можете сделать это, добавив следующие два метода к вашему MainActivity (или добавив код к уже существующим):

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

    //create a broadcast intent that doesn't trigger anything
    Intent localIntent = new Intent("fake.action");
    localIntent.setPackage(getApplicationContext().getPackageName());
    localIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);

    //set the NFC adapter to trigger our broadcast intent
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    nfcAdapter.enableForegroundDispatch(
            this,
            PendingIntent.getBroadcast(this, 0, localIntent, PendingIntent.FLAG_UPDATE_CURRENT),
            new IntentFilter[] {new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED)},
            new String[][] { { "android.nfc.tech.IsoDep" /* add other tag types as necessary */ } });

}

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

Теперь, когда ваша активность видна и обнаружен тег NFC, никакие действия не будут инициированы. (Или, более конкретно, он инициирует широковещательную рассылку, для которой не зарегистрирован ни один метод.)

Надеюсь, это поможет.

1 голос
/ 12 июня 2019

Вы можете использовать launchMode="singleTop".Таким образом, если действие уже запущено и находится на вершине стека, любые новые запуски будут маршрутизироваться через этот экземпляр, и вы получите это как обратный вызов в методе onNewIntent().

<activity android:name=".view.main.MainActivity" 
          android:launchMode="singleTop" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...