假设我想做一个应用程序,当用户点击“扫描标签”按钮时扫描nfc标签。
目前我有一些问题,即使我花了最后一个星期试图找出自己的问题?
我面临的主要问题是,该应用程序将扫描背景中的nfc标签(或至少看起来像它),并将打开我的应用程序的新示例,但名称为“nfc服务”(这不是我命名的我的应用程序)。
我面临的另一个问题是,在代码中,当我尝试调用我的“readtag()”方法时,它只有在打开我之前说过的“nfc服务”时才起作用,否则它不会读取标记,而只会中断。据我所知,readtag()方法似乎是在后台运行的,而不是我告诉它的时候。
热释光;dr:我不想让我的应用程序在后台扫描nfc标签,只需要按一下按钮。
非常感谢您的帮助,特别是因为我的截止日期是明天?t-t型
下面是我的一些代码(很遗憾,我不能全部显示):
androidmanifest公司:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ips.software.iasset_ips">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.IAssetIPS">
<activity android:name=".WebViews.AssetInfoWebView"></activity>
<activity android:name=".Activities.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<action android:name="android.nfc.action.TECH_DISCOVERED" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
</activity>
</application>
</manifest>
xml/nfc技术过滤器:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
</tech-list>
</resources>
主要活动:(仅与问题相关的部分)
// package + all the imports
// ...
public class MainActivity extends AppCompatActivity {
private Button scanButton;
NfcAdapter adapter;
Tag tag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
configureScanButton();
}
private void configureScanButton() {
scanButton= findViewById(R.id.scanButton);
scanButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
readTag();
}
});
}
public void readTag() {
adapter = NfcAdapter.getDefaultAdapter(this); // initialize the nfc reader
checkNfcSupport(); // check if device supports nfc, if not close and Toast.show
tag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG); // read the tag
decodeSerialNumberFromTag(); // can't show you this function, but it's only decoding, it shouldn't be the cause of the problem
Toast.makeText(this, "Serial Number: " + serialNumber, Toast.LENGTH_LONG).show();
}
}
所以是的,我想就这些,如果我能在任何时候扫描一个新标签时调用readtag()方法也会很好。
我说得太多了,提前谢谢你:d
1条答案
按热度按时间prdp8dxp1#
启动应用程序与nfc标签交互的唯一方法是通过nfc服务,但如果您对其进行适当的编程,就有可能实现所需的行为。
首先,manifest intent过滤器实际上只是告诉nfc服务在正确类型的标记进入范围时启动/重新启动应用程序。
与应用程序的“launchmode”进行交互,如中所述https://stackoverflow.com/a/64834600/2373819
在应用程序运行时处理nfc标记的方法是使用
enableForegroundDispatch
或者用更好的enableReaderMode
告诉nfc服务在标记进入范围时以不同方式传递标记对象的api。一个更好的例子
enableReaderMode
用于读写的api位于https://stackoverflow.com/a/64921434/2373819 (可以忽略写入位)只有当你按下一个按钮时才对标签做一些事情,这不是正常的工作流程,因为标签可能在范围内,也可能不在范围内,即你在当前工作中实际在做什么
readTag
方法时,您按下按钮只是处理Intent
它是在活动启动时存储的,实际上没有对标记执行读取的i/o操作。标记uid和存储在标记上的任何ndef消息在进入范围时都已缓存在标记对象/意图中。做类似的事
enableReaderMode
在onTagDiscovered
方法将标记对象存储为活动类中的全局变量,然后在按下按钮并检查标记对象是否为时对其进行处理null
i、 e.用户已按下按钮,但标签不在范围内。如果要在按下按钮时读取其他未缓存的数据,则需要处理标记或范围错误以及其他i/o错误,就像在标记进入范围时立即处理标记一样,只是您更有可能拥有它们。
我想说,在你的应用程序中使用nfc来
enableForegroundDispatch
或者用更好的enableReaderMode
作为nfc服务向您发送标记对象,即使您当时不想对它做任何操作,因为这将阻止nfc服务启动另一个应用程序来处理它,甚至阻止它自己在您的应用程序顶部显示有关进入范围的标记的基本信息屏幕。e、 g.在中有一个空方法onNewIntent
或者onTagDiscovered