NFC enableForegroundDispatch处理活动中的Beam

时间:2014-07-11 03:13:14

标签: android nfc intentfilter ndef android-beam

我正在处理的应用程序应该接收一个波束,然后从onResume调用processIntent(intent)函数。我遇到的问题是,当它收到光束时,会打开一个全新的应用实例,而不是只停留在活动中(我已经调用了enableForegroundDispatch)。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (mNfcAdapter == null){
        Toast.makeText(this, "No NFC on this device", Toast.LENGTH_LONG).show();
    }
    // Create a PendingIntent object so the Android system can populate it with the details of the tag when it is scanned.
    pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    // Declare intent filters to handle the intents that the developer wants to intercept.
    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndef.addDataType("application/com.sample.mime/string");
    } catch (MalformedMimeTypeException e) {
        Log.wtf("mimeexception", e);
        e.printStackTrace();
    }
    intentFiltersArray = new IntentFilter[] {ndef};

... ...
}

public void onResume() {
  super.onResume();
  // Enable the foreground dispatch when the Activity regains focus.
  NfcAdapter.getDefaultAdapter(this).enableForegroundDispatch(this, pendingIntent, intentFiltersArray, null);

  if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
        processIntent(getIntent());
  }
}

public void onPause() {
  super.onPause();
  // Disable the foreground dispatch when the Activity loses focus.
  NfcAdapter.getDefaultAdapter(this).disableForegroundDispatch(this);
}

void processIntent(Intent intent){
    // do stuff
}

这是清单中的活动

<activity
        android:name="com.example.app.opensthisonebutshouldnt"
        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="com.example.app.shouldopenthisone"
        android:label="@string/title_activity_create_invoice"
        android:launchMode="singleTop" >
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />\
            <category android:name="android.intent.category.DEFAULT" />\
            <data android:mimeType="application/com.example.nfctest/invoice" />
        </intent-filter>
</activity>

感谢输入

1 个答案:

答案 0 :(得分:1)

  1. application/com.sample.mime/string(在ndef.addDataType(...);中使用)看起来不像是有效的MIME类型。你确定你要打这种类型吗?即使你这样做,我也不确定Android是否能够处理它。接近您的有效MIME类型为application/com.sample.mime(没有/string部分)。这同样适用于/invoice的{​​{1}}部分。

  2. 如果您的前台调度意图过滤器与Beamed NDEF消息的第一条记录不匹配,您的应用可能会根据清单中的意图过滤器接收NFC事件。请注意,application/com.example.nfctest/invoice意图过滤器仅匹配NDEF消息的第一条记录

  3. 如果Beamed消息包含AAR(Android应用程序记录),并且您的NFC相关意图过滤器都不匹配Beamed NDEF消息的第一条记录,则在您的将启动具有类别NDEF_DISCOVERED的启动MAIN的意图过滤器的清单。 这似乎发生在您的情况下。因此请仔细检查您的前台调度是否与传入的NDEF消息实际匹配。否则,您的活动可能会根据应用清单中的定义重新启动。

  4. 检查LAUNCHER中的getIntent()只检查当前与您的活动相关联的意图(即最初开始您的活动或使用onResume()注册的意图)您的活动已恢复。但是,您注册的前台发送的事件将会在您的活动setIntent(...)方法中显示。因此,您需要覆盖该方法并在那里处理NFC事件:

    onNewIntent()