Java &引用;“收集新标签”;而不是读取应用程序的标签-NFC android

Java &引用;“收集新标签”;而不是读取应用程序的标签-NFC android,java,android,tags,nfc,nexus-s,Java,Android,Tags,Nfc,Nexus S,我有一个类,它创建了与NFC的连接和两个活动。它们都创建了该类的对象,以便可以连接到NFC。 之前它不知怎么工作了,但现在我遇到了问题——我的应用程序在WinEvent上没有做任何事情,即使是在第一个活动上。取而代之的是,我可以从名为“标签”(Nexus S)的内置应用程序中看到“收集的新标签” 我该怎么办 类别: public NFCForegroundUtil(Activity activity) { super(); this.activity = activity;

我有一个类,它创建了与NFC的连接和两个活动。它们都创建了该类的对象,以便可以连接到NFC。 之前它不知怎么工作了,但现在我遇到了问题——我的应用程序在WinEvent上没有做任何事情,即使是在第一个活动上。取而代之的是,我可以从名为“标签”(Nexus S)的内置应用程序中看到“收集的新标签”

我该怎么办

类别:

public NFCForegroundUtil(Activity activity)
{
    super();
    this.activity = activity;
    mAdapter = NfcAdapter.getDefaultAdapter(activity
            .getApplicationContext());

    mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent(
            activity, activity.getClass())
            .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
    IntentFilter ndef2 = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    IntentFilter ndef3 = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);

    try
    {
        ndef2.addDataType("*/*");
    }
    catch (MalformedMimeTypeException e)
    {
        throw new RuntimeException("fail", e);
    }

    mFilters = new IntentFilter[] {ndef, ndef2, ndef3 };

    mTechLists = new String[][] { new String[] {
            // android.nfc.tech.NfcV.class.getName(),
            android.nfc.tech.NfcA.class.getName(),
            android.nfc.tech.IsoDep.class.getName() } };

    mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);

}
活动1:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    nfcForegroundUtil = new NFCForegroundUtil(this);

}

 @Override
protected void onNewIntent(Intent intent)
{

    super.onNewIntent(intent);
    Intent i = new Intent(this, NfcDisplayLabelActivity2.class);
    startActivity(i);

 }
我看到从名为“标签”的内置应用程序中收集的“新标签”,因为我的应用程序无法正常工作

当它工作正常时,它的优先级高于“标签”,手机会从我的应用程序中读取标签。但当它工作不正常,手机收集标签时,“标签”应用程序被激活,“标签”应用程序与我的设备对话


修复代码后,我的应用程序具有更高的优先级,手机会使用我的应用程序读取标签。

进入设置->应用程序->所有->标签(在我的情况下)->禁用

尝试从NFC标签打开我的应用程序时,我遇到了类似的问题。我已经在我的AndroidManifest.xml中为方案“magicnfc”注册了一个intentfilter,但它打开了Android操作系统标签应用程序,而不是我的

我发现NFC意图(在我的案例中发现的TECH_)比基于通用方案的意图过滤器具有更高的优先级。因为Tags应用程序注册了TECH_发现的,所以它被打开了,而不是我的

幸运的是,应用程序可以注册NDEF_发现(一个更高优先级的过滤器)并打开,而不是标签应用程序

当我点击标签时,我的应用程序打开了

更多信息请点击此处:

但我发现我必须重写函数onNewIntent,代码如下:

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
    String uri = intent.getDataString();

    Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    if (rawMsgs != null) {
        msgs = new NdefMessage[rawMsgs.length];
        for (int i = 0; i < rawMsgs.length; i++) {
            msgs[i] = (NdefMessage) rawMsgs[i];
        }
    }
}
祝你好运

您可以使用
ACTION\u TAG\u DISCOVERED
intent监听所有激活的标记,而不是使用以下代码筛选特定的标记:

public NFCForegroundUtil(Activity activity)
{
    super();
    this.activity = activity;
    mAdapter = NfcAdapter.getDefaultAdapter(activity
            .getApplicationContext());

    mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent(
            activity, activity.getClass())
            .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 
0);

    // See below
    mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
}
从:

如果将筛选器和TechList参数的值都传递为null,则这些参数将充当通配符,并将导致前台活动通过ACTION_TAG_接收所有标记


你的问题是当你初始化意图时

这个类应该是它自己,而不是第二个类

正确的代码应该是:

@Override
protected void onNewIntent(Intent intent)
{
    super.onNewIntent(intent);
    Intent i = new Intent(this, NfcDisplayLabelActivity1.class);
    startActivity(i);
 }

如果你仍然有问题,请查看我的答案。这个答案中确实没有任何有用的数据。简单地说“哦,我更正了我的应用程序,现在它可以工作了”,并不能告诉社区关于应用程序是如何更正的,以及您最初的错误做法。这不是解决方案。他应该过滤技术列表中的正确标签,或者使用adapter.enableforgrounddispatch(this,pendingent,null,null);如下面一个很好的答案所示,当应用程序前景化时
@Override
protected void onNewIntent(Intent intent)
{
    super.onNewIntent(intent);
    Intent i = new Intent(this, NfcDisplayLabelActivity1.class);
    startActivity(i);
 }