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



我有一个反应原生应用程序,它可以读取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 不会在第一次扫描时失败。

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

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

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

有了这个,你向安卓声明你的应用程序想要捕获任何NFC标签。如果设备有另一个捕获 nfc 标签的应用程序,则会向用户显示一个菜单,以选择哪个应用程序获取 NFC 意图。

相关内容

最新更新