当前位置: 首页 > 知识库问答 >
问题:

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

岑鸣
2023-03-14

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

当我在应用程序中关闭屏幕(电源按钮),然后再次打开并扫描NFC标签时,浏览器打开。看起来扫描的意图不会传递到应用程序,而是由手机默认处理。在打开浏览器的第一次扫描之后,我导航回应用程序,下面的扫描在应用程序内部工作正常。

这里有一个转折:在大多数手机上,它都像预期的那样工作。适用于像素3(Android9)、华为(Android5.1)、索尼(Android7)和其他一些手机。但是当我使用UleFone X2(http://ulefone.com/product.html)时,就会出现这个问题。我是否做了一些不正确的事情来初始化应用程序,所以它每次都处理自己一样,即使是在恢复的时候?

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

这是我的主要活动:

java prettyprint-override">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个答案

谢骏奇
2023-03-14

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

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

有了这一点,你就可以向android声明你的应用程序想要捕捉任何NFC标签。若该设备有另一个应用程序捕捉nfc标签,则会向用户显示一个菜单,以选择哪个应用程序具有nfc意图。

 类似资料:
  • 问题内容: 在终端中工作时,我看到了最后一个Shell命令执行输出的历史记录。如果运行vim,我会看到全屏打开的文件。退出vim时,我可以再次看到最后一个shell命令的历史记录。 但是,当我从屏幕上使用vim时。我在退出vim时看到的是刚刚编辑的文件的足迹,而不是最后一个shell命令的历史记录。 我想看看外壳的历史。 我该如何实现这种行为? 我用了: terminal.app和iterm2.a

  • 问题内容: 你好! 我只是从Android Studio开始。我搜索了一个匹配的问题,但没有高兴,如果您已经看过这个问题,请大喊大叫! 我的主要活动只有一个按钮,它将打开第二个活动,该按钮将工作并打开。但是第二个活动显示为空白屏幕,而不是应该显示的文本。 对于任何不相关的复制/粘贴,我们深表歉意! 表现: 主要活动: 主类中的按钮代码 第二活动xml 谢谢! 问题答案: 您是否在setConten

  • 在我的应用程序中,我只有一个具有NFC意图的活动,但它仍然在所有其他活动中触发。有没有办法限制这种情况? 我想模仿NFC TagInfo处理其NFC意图的方式。他们只允许NFC读取他们的“扫描标签…”活动,并在所有其他活动中被阻止。

  • 问题内容: 我找到了几种解决方案,如何在Java中做到这一点,但没有找到如何在QML或Qt中做到这一点。我知道首先我应该在中设置许可。我应该怎么做才能在运行时从Qt打开和关闭屏幕锁定? 问题答案: 您可以使用Qt Android Extras模块并使用JNI从C ++调用相关的Java函数。就像是 :

  • 我一直在努力研究如何在我正在开发的应用程序中保持屏幕打开。网上有很多关于这方面的信息,但我还没有找到任何具体的颤动。我发现了各种关于使用唤醒锁的帖子,但当我尝试我的应用程序总是在启动时崩溃。不过,我宁愿不使用唤醒锁。 我找到的信息告诉我将以下内容放入MainActivity.java。 getWindow()。addFlags(WindowManager。layout params . FLAG