获取当前活动以处理发现的NFC TAG

时间:2019-04-03 08:21:15

标签: java android nfc

我有一个带有多个活动的android应用。我希望当前活动能够处理nfc发现的事件,因为应用程序的状态决定了我想对标签执行什么操作

从所附的代码中可以看出,我已经为每个活动设置了意图,并在每个活动中实现了onResume,onPause和onNewIntent方法。

但是,由于某些原因,即使其他活动之一是活动活动,MainActivty也是唯一被调用的活动。例如。它是具有当前GUI的那个。

你们知道如何进行主动活动来处理发现的NFC吗?

任何帮助都非常感激:)

这是ApplicationManifest

<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <activity
        android:name=".ConfigureStableNamesActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED " />
            <category android:name="android.intent.category.DEFAULT" />
            <data
                android:host="www.nxp.com"
                android:pathPrefix="/products/identification_and_security/smart_label_and_tag_ics/ntag/series/NT3H1101_NT3H1201.html"
                android:scheme="http" />
        </intent-filter>
    </activity>

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />

            <!-- <action android:name="android.nfc.action.ACTION_TAG_DISCOVERED"/>-->
            <action android:name="android.nfc.action.NDEF_DISCOVERED " />
            <category android:name="android.intent.category.DEFAULT" />
            <data
                android:host="www.nxp.com"
                android:pathPrefix="/products/identification_and_security/smart_label_and_tag_ics/ntag/series/NT3H1101_NT3H1201.html"
                android:scheme="http" />
        </intent-filter>
    </activity>

在我的每项活动中,我都有这段代码来处理NFC发现的意图

@Override
protected void onResume() {
    super.onResume();
    ntagHandler.start();
}

@Override
protected void onPause() {
    super.onPause();
    ntagHandler.stop();
}

@Override
protected void onNewIntent(Intent intent) {
    try {
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        nfcHandler = new NearFieldCommunicationHandler(tag);
        nfcHandler.connect();

        // DO SOMETHING HERE
        // dataModel.readStableNames(nfcHandler);
    } catch(IOException e) {
        Toast.makeText(this, "Caught exception: " + e.toString(), Toast.LENGTH_LONG).show();
    }
}

1 个答案:

答案 0 :(得分:0)

您需要实现“前台调度系统”。它允许活动拦截意图并要求其优先于其他活动。请参阅:https://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc#java

  

首先在您的每个活动中全局创建未决Intent,如下所示:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
  

然后全局获取IntentFilter并使用null进行初始化,如下所示:

IntentFilter[] intentFiltersArray = null;

Write below code in onCreate() method:

IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try {
            ndef.addDataType("*/*");    /* YOU CAN TYPE HERE EITHER android.nfc.action.NDEF_DISCOVERED or
            android.nfc.action.ACTION_TAG_DISCOVERED */
        }
        catch (IntentFilter.MalformedMimeTypeException e) {
            throw new RuntimeException("fail", e);
        }
        IntentFilter[] intentFiltersArray = new IntentFilter[] {ndef, };
  

然后按如下所示全局获取techListsArray:

String[][] techListsArray = new String[][] { new String[] { NfcF.class.getName() } };

最后编写以下代码,以在活动失去(onPause())和重新获得(onResume())焦点时启用和禁用前台调度。必须从主线程调用enableForegroundDispatch(),并且仅在活动处于前台时才调用(调用onResume()可以保证做到这一点)

public void onPause() {
    super.onPause();
    nfcadapter.disableForegroundDispatch(this);
}

public void onResume() {
    super.onResume();
    nfcadapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
}

public void onNewIntent(Intent intent) {
    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    //do something with tagFromIntent
}