在关闭/再次打开屏幕后,如何确保新的NFC意图传达给我的活动?

时间:2019-06-17 00:47:51

标签: android react-native android-intent nfc

我有一个React-native应用程序,该应用程序读取NFC标签并向其中写入URL。 它使用ForegroundDispatch来确保应用程序捕获了扫描的信息,并且在检测到链接时不会导航到浏览器。该链接仅在未启动应用程序时使用,它将打开浏览器并显示从我的服务器到外部用户的信息。

当我进入应用程序并关闭屏幕(电源按钮),然后再次打开屏幕并扫描NFC标签时,浏览器将打开。扫描的意图似乎没有传递到应用程序,而是由手机默认处理。第一次扫描打开浏览器后,我导航回到该应用程序,随后的扫描在该应用程序内正常运行。

以下是大多数手机上的扭曲:,它可以正常工作。在Pixel 3(Android 9),华为(Android 5.1),索尼(Android 7)和其他版本上均可使用。但是,当我使用UleFone X2(http://ulefone.com/product.html)时,会发生此问题。 我是否在做一些错误的操作初始化该应用程序,以使其即使在恢复后也能每次相同地进行处理?

从我的研究看来,当屏幕关闭并重新打开时,UleFone会禁用NFC,我是否没有正确初始化它?如果我打开最近使用的应用程序并离开我的应用程序,然后再回到该应用程序,则NFC会开始工作。

这是我的主要活动

public class MainActivity extends ReactActivity {
    private NfcAdapter mAdapter;
    private PendingIntent mPendingIntent;
    private IntentFilter[] mFilters;
    private String[][] mTechLists;
    private int mCount = 0;

    @Override
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    }

    @Override
    protected void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        mAdapter = NfcAdapter.getDefaultAdapter(this);
        mPendingIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try {
            ndef.addDataType("*/*");
        } catch (MalformedMimeTypeException e) {
            throw new RuntimeException("fail", e);
        };
        mFilters = new IntentFilter[] {
                ndef,
        };
        mTechLists = new String[][] { new String[] {NfcA.class.getName()}, new String[] {MifareClassic.class.getName()}, new String[] {Ndef.class.getName()},   };
        Log.d("scantest", "onCreate completed");
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mAdapter != null) mAdapter.disableForegroundDispatch(this);
        Log.d("scantest","onPause completed");
    }

    @Override
    public void onResume() {
        super.onResume();
        Intent intent = getIntent();
        if (mAdapter != null) mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);
        Log.d("scantest","onResume completed");
    }

预期行为: 在启动和恢复后,所有支持NFC的Android手机都以相同的方式在应用程序中处理NFC扫描。目的应始终传递到我的应用程序。

当前行为: 屏幕关闭/重新打开后,大多数手机都能正常工作。在某些手机(UleFone)上,如果我关闭/打开屏幕,则第一次扫描会打开浏览器,以下应用程序将在应用程序中运行。

当前解决方法

关闭/打开屏幕后,如果我使用最近使用的应用程序离开该应用程序(我什至不必单击其他应用程序,只需确保出现最近使用的应用程序图块),然后单击以返回对我的应用程序来说,NFC不会在第一次扫描时失败。

否则,第一次扫描将失败并打开浏览器。

1 个答案:

答案 0 :(得分:0)

一种解决方法是将该意图过滤器添加到您的活动中 https://developer.android.com/guide/topics/connectivity/nfc/nfc#tag-disc

<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>

使用此方法,您可以向android声明您的应用要捕获任何NFC标签。如果设备具有捕获nfc标签的另一个应用程序,则会显示一个菜单以供用户选择哪个应用程序具有NFC意图。