我有一个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不会在第一次扫描时失败。
否则,第一次扫描将失败并打开浏览器。
答案 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意图。