[英]How to read multiple payload from nfc tags and store the payloads into an arraylist?
嗨 Stackers 我还是编码新手,需要一些帮助。 现在我有两个 NFC 标签,两个标签都使用不同的地理坐标(经度、纬度)存储。 目前,我能够从 NFC 标签读取有效载荷。 我想要的是将来自两个 NFC 标签的有效载荷存储到一个数组列表中。 当我读取第一个标签时,它确实将有效负载存储到数组列表中,但是当读取第二个标签时,有效负载将覆盖前一个有效负载。
安卓清单:
<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/AppTheme">
<activity android:name=".arraylist"></activity>
<activity
android:name=".MainActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="*"
android:scheme="geo" />
</intent-filter>
</activity>
</application>
主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter == null) {
Toast.makeText(this, "nfc not supported", Toast.LENGTH_SHORT).show();
finish();
return;
}
if (!nfcAdapter.isEnabled()) {
startActivity(new Intent("android.settings.NFC_SETTINGS"));
Toast.makeText(this, "nfc not yet open", Toast.LENGTH_SHORT).show();
}
mPendingIntent = PendingIntent.getActivity(this,0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0 );
}
private void readIntent(Intent intent){
list = new ArrayList<>();
Parcelable[] parcelables = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
for(int i=0; i<parcelables.length; i ++){
NdefMessage message =(NdefMessage)parcelables[i];
NdefRecord[] records = message.getRecords();
for(int j=0; j<records.length; j++){
NdefRecord record = records[j];
byte[] original = record.getPayload();
byte[] value = Arrays.copyOfRange(original,0,original.length);
String payload = new String(value);
if(list != null){
list.add(payload);
System.out.println(list);
}
}
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
readIntent(intent);
}
@Override
protected void onResume() {
super.onResume();
nfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
}
@Override
protected void onPause() {
super.onPause();
nfcAdapter.disableForegroundDispatch(this);
}
这是我的输出:I/System.out: [geo:1.523534,103.633690]
但我的期望输出是:[geo:1.523534, 103.633690, geo:1.5364496, 103.656321]
那么如何才能实现第二个标签有效载荷不会覆盖前一个有效载荷呢?
这次的问题是,您没有像在之前的类似问题中那样创建 Fragment 的new
实例,而是在每次读取卡片时创建一个new
的数组列表,从而取消引用第一个列表对象以使其成为被垃圾收集删除。
这是一个经典的变量初始化问题。
每次读取卡片时都会调用readIntent
。 因此,删除创建新列表的 `readIntent 的第一行。
例如
private void readIntent(Intent intent){
Parcelable[] parcelables = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
....
然后在您的类定义中只初始化一次数组列表。
例如
public class MainActivity extends AppCompatActivity {
private ArrayList<String> list = new ArrayList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.