如何在我的应用中使用NFC时禁用默认的Android NFC应用

时间:2014-09-13 16:21:27

标签: java android nfc

在我的应用中,我使用NFC来阅读标签。我点击按钮启用NFC。打开进度对话框以读取NFC标签,完成后,NFC将被禁用。这一切都很好。但是当应用程序中未启用NFC并且我将NFC标签添加到手机时,默认的Android应用程序会读取NFC标签并将我的应用程序置于后台。

如何停用Android应用?

启用/禁用NFC的代码:

/**
 * @param activity The corresponding {@link Activity} requesting the foreground dispatch.
 * @param adapter  The {@link NfcAdapter} used for the foreground dispatch.
 */
public static void setupForegroundDispatch(final Activity activity, NfcAdapter adapter) {
    final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass());
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    final PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0);
    IntentFilter[] filters = new IntentFilter[1];
    String[][] techList = new String[][]{};

    // Notice that this is the same filter as in our manifest.
    filters[0] = new IntentFilter();
    filters[0].addAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
    filters[0].addCategory(Intent.CATEGORY_DEFAULT);
    try {
        filters[0].addDataType(MIME_TEXT_PLAIN);
    } catch (IntentFilter.MalformedMimeTypeException e) {
        throw new RuntimeException(activity.getString(R.string.exception_wrong_mime_type));
    }

    adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList);
}

/**
 * @param activity The corresponding {@link MainActivity} requesting to stop the foreground dispatch.
 * @param adapter  The {@link NfcAdapter} used for the foreground dispatch.
 */
public static void stopForegroundDispatch(final Activity activity, NfcAdapter adapter) {
    adapter.disableForegroundDispatch(activity);
}

3 个答案:

答案 0 :(得分:4)

您无法禁用此行为。启动了另一个应用程序,因为您的应用程序没有捕获标记。当你删除应用程序时,这将停止,但当然不是解决方案。

如果您想阻止这种情况,您应该抓住应用中的扫描标签,该标签位于前台 您已经知道如何使用enableForegroundDispatch执行此操作。扫描标签时不要禁用前台调度,而是创建一个标志或确定是否要对标签执行某些操作的内容。

例如:

  • 创建一个属性,例如doSomethingWithTheTag
  • doSomethingWithTheTag应为true的代码处理程序添加条件。如果它是false不对标记做某事。在大多数情况下,这将是您的onNewIntent覆盖,只需确保每个活动都覆盖该功能。
  • 当您的对话框打开时,将doSomethingWithTheTag设置为true
  • 阅读标签并进行处理
  • doSomethingWithTheTag设为false
  • 如果您现在扫描标记,它将被您的应用程序捕获,但不会发生任何事情。

希望我很清楚。祝你好运!

答案 1 :(得分:0)

我遇到了同样的问题,在我的手机中安装了2个nfc启用的应用程序。每当我启动我的应用程序立即默认应用程序打开,为此我创建一个BaseActivity并在我的所有活动中扩展它,并在那里我覆盖了两种方法

adapter.disableForegroundDispatch(mainActivity);
enableForegroundDispatch()

并且我对onNewIntent(Intent intent)方法只感兴趣的活动,我有一个像

的支票
@Override
protected void onNewIntent(Intent intent)
{
    if (!isThisDialogWindow)
        handleIntent(intent);
}

所以当我的应用运行时,我摆脱了默认应用的打开。

注意但是,当我的应用运行时,我仍有一个问题,有时仍会打开其他应用。请天才调查:​​-)

答案 2 :(得分:0)

我想我想出了一个简单的解决方案,就是在创建PendingIntent时,将第三个参数放在new Intent()中。所以:

    if (pendingIntent == null) {
        pendingIntent = PendingIntent.getActivity(this, 0, new Intent(), 0);
    }

然后将NFC适配器设置为:

adapter.enableForegroundDispatch(this, pendingIntent, null, null);

在所有您不想在扫描NFC标签时在自己的应用程序中发生任何事情的活动中执行此操作(尽管它会产生声音),并且您也不希望默认的Android NFC读者弹出。