Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何确保在屏幕再次关闭/打开后,新的NFC意图传递到我的活动中?_Android_React Native_Android Intent_Nfc - Fatal编程技术网

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

Android 如何确保在屏幕再次关闭/打开后,新的NFC意图传递到我的活动中?,android,react-native,android-intent,nfc,Android,React Native,Android Intent,Nfc,我有一个react原生应用程序,它读取NFC标记并向它们写入URL。 它使用ForegroundDispatch确保应用程序捕获扫描的信息,并且在检测到链接时不会导航到浏览器。该链接仅在应用程序未启动时使用,它会打开浏览器并向外部用户显示来自我的服务器的信息 当我在应用程序中关闭屏幕(电源按钮),然后再次打开并扫描NFC标签时,浏览器打开。看起来扫描的意图没有传递到应用程序,而是由手机默认处理。在打开浏览器的第一次扫描之后,我导航回应用程序,以下扫描在应用程序内部工作正常 这里是一个转折点:在大

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

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

这里是一个转折点:在大多数手机上,它都能正常工作。在Pixel 3(安卓9)上工作,在华为(安卓5.1)上工作,在索尼(安卓7)上工作,还有其他一些。但是当我使用UleFone X2()时,就会出现这个问题。 我是否做了一些错误的操作来初始化应用程序,使其每次都能处理相同的问题,即使是在恢复时

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

这是我的主要活动:

public类MainActivity扩展了ReactActivity{
私人NfcAdapter mAdapter;
私人悬而未决的侵权行为;
私人意向过滤器[]多个过滤器;
私有字符串[][]mtechlist;
私有整数mCount=0;
@凌驾
公共帐篷(意向){
super.onNewIntent(意向);
设定意图(intent);
tagFromIntent=intent.getParcelableExtra(NfcAdapter.EXTRA_标记);
}
@凌驾
创建时受保护的void(Bundle savedState){
super.onCreate(savedState);
mAdapter=NfcAdapter.getDefaultAdapter(此);
mpendingent=PendingIntent.getActivity(这个,0,
新的Intent(this,getClass()).addFlags(Intent.FLAG\u ACTIVITY\u SINGLE\u TOP),0;
IntentFilter ndef=新的IntentFilter(NfcAdapter.ACTION\u ndef\u发现);
试一试{
ndef.addDataType(“*/*”);
}捕获(格式错误的dmimetype异常){
抛出新的运行时异常(“失败”,e);
};
mFilters=新的意向过滤器[]{
ndef,
};
mTechLists=newstring[]{newstring[]{NfcA.class.getName()},newstring[]{MifareClassic.class.getName()},newstring[]{Ndef.class.getName()},};
Log.d(“扫描测试”、“创建完成”);
}
@凌驾
受保护的void onPause(){
super.onPause();
如果(mAdapter!=null)mAdapter.disableForegroundDispatch(此);
Log.d(“扫描测试”、“暂停完成”);
}
@凌驾
恢复时公开作废(){
super.onResume();
Intent=getIntent();
如果(mAdapter!=null)mAdapter.enableforgrounddispatch(this、mpendingcontent、mfilter、mtechlist);
日志d(“扫描测试”、“恢复完成”);
}
预期行为: 所有支持NFC的Android手机在启动和恢复后都以相同的方式在应用程序中处理NFC扫描。目的应该始终传递到我的应用程序中

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

当前解决方案

关闭/打开屏幕后,如果我使用最近的应用离开应用程序(我甚至不必单击其他应用程序,只需确保最近的应用程序磁贴出现),然后单击返回到我的应用程序,NFC在第一次扫描时不会失败


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

一个解决方法是将此意向筛选器添加到您的活动中



通过此操作,您可以向android声明您的应用程序希望捕获任何NFC标记。如果设备中有另一个应用程序捕获NFC标记,则会向用户显示一个菜单,以选择哪个应用程序具有NFC意图。

我不确定这是否是我的解决方法。我不想在发现标记时启动我的应用程序。从文档中可以看到:
启动应用程序n当您要处理的NFC标记被扫描时,您的应用程序可以在Android清单中筛选一个、两个或所有三个NFC意图。但是,您通常希望筛选操作NDEF,以便在应用程序启动时获得最大的控制权。
并且我已经在MainActivity中筛选NDEF。也许UleFone NFC堆栈中存在一个错误:未检测到NDEF NFC标记为NDEF。您可以尝试将NDEF上的过滤器替换为已发现的标记,并添加关于已发现的技术的日志?
<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>