6

我有一堂课,它创建了与 NFC 和两个活动的连接。它们都创建了该类的对象,以便它们可以连接到 NFC。早些时候它以某种方式工作,但现在我遇到了问题 - 我的应用程序在NewIntent上没有做任何事情,即使在第一个活动上也是如此。取而代之的是,我可以从名为“标签”(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);

}

活动一:

@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);

 }
4

5 回答 5

7

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

于 2014-05-26T11:07:22.883 回答
4

尝试从 NFC 标签打开我的应用程序时,我遇到了类似的问题。我在我的 AndroidManifest.xml 中为方案“magicnfc”注册了一个意图过滤器,但它打开了 Android OS Tags 应用程序而不是我的。

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

幸运的是,应用可以注册 NDEF_DISCOVERED(更高优先级的过滤器)并打开而不是标签应用。

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

更多信息在这里:http: //developer.android.com/guide/topics/connectivity/nfc/nfc.html

但是我发现我不得不重写 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];
        }
    }
}

对我来说,我所需要的只是:

String uri = intent.getDataString();

祝你好运!

于 2014-08-19T21:57:26.657 回答
3

您可以侦听使用意图激活的所有ACTION_TAG_DISCOVERED标签,而不是使用以下代码过滤特定标签:

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);
}

NFCAdapter 文档

如果您为过滤器和 techLists 参数传递 null ,它们充当通配符并将导致前台活动通过 ACTION_TAG_DISCOVERED 意图接收所有标签。

于 2015-05-16T17:23:48.400 回答
0

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

类应该是它本身,而不是第二类。

正确的代码应该是:

@Override
protected void onNewIntent(Intent intent)
{
    super.onNewIntent(intent);
    Intent i = new Intent(this, NfcDisplayLabelActivity1.class);
    startActivity(i);
 }
于 2020-12-10T16:32:38.630 回答
-4

I was seeing "New tag collected" from build-in app called "Tags" because my application didn't work properly.

When it works ok, it has higher priority than "Tags" and phone reads tags from my application. But when it works unproperly and phone collect a tag, "Tags" application is activated and "Tags" application talks to my device.

After repairing code, my app has higher priority and phone reads tags using my application.

于 2012-11-15T11:50:44.170 回答