gpt4 book ai didi

android - 在循环中写入 NDEF 消息

转载 作者:行者123 更新时间:2023-11-29 00:08:33 24 4
gpt4 key购买 nike

我想在 while() 循环中写入不同的 NDEF 消息。

最后编辑:似乎微 Controller 不能处理数据那么快,所以我的问题无法解决。

//ndef.connect();
ndef.writeNdefMessage(message);
//ndef.close();

我的 write() 方法,简化了,没有所有的 try/catch

因此,在第一个循环中它可以正常工作,但接下来的循环就不行了。但经过多次循环后,它会再次工作一次。如此重复。

stop = 0;    
while(stop < 1000)
{
write();
stop++
}

write() 在一个循环中正常工作。

编辑:我用计时器替换了 while():

    new Timer().schedule(new TimerTask() {
@Override
public void run() {
write();
}
}, 2000);

但这太慢了……我每秒至少需要写 5 次。如果我将计时器周期设置为小于 2000,则它不起作用,与 while() 相同

EDIT2:我测量了消息传输和接收的速度。发送消息似乎需要大约 55ms,接收大约需要 7ms。这就是我想要的,但是如果我将我的计时器设置为在 100 毫秒后重复,例如,我从 writeNDEFmessage() 中得到这个错误:java.io.IOException: Tag is not ndef 。因此,如果我循环 10 次 writeNDEFmessage() 它在第一个循环中工作正常,但我在接下来的 9 次中收到异常。

编辑3:

onNewIntent() :

@Override
protected void onNewIntent(Intent intent)
{
try {
if(intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED) ||
intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)||
intent.getAction().equals(NfcAdapter.ACTION_TECH_DISCOVERED))
{
detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

if(detectedTag != lastDetectedTag)
{

lastDetectedTag = detectedTag;
setIntent(intent);
}


}
} catch (Exception e)
{
Log.e("", "onIntent >>> "+e.getMessage());

}

}

这是分配给一个按钮:

 public void testWrite()
{

final Timer timer = new Timer();

try {
ndef = Ndef.get(detectedTag);
ndef.connect();
} catch (IOException e) {
Log.e("", "Cannot connect");
e.printStackTrace();
}
timer.schedule(new TimerTask() {

@Override
public void run() {

transmit.writeTag(message), ndef)

}, 0, 200);

}

writeTag():

public boolean writeTag(String str, Ndef ndef) {


try {
message = getNdefMessage(str);
}
catch (Exception e)
{
toast("Message error");
}

int size = message.toByteArray().length;

try {


if (ndef != null) {

if(!ndef.isConnected())
{
ndef.connect();
Log.e("", ""+ndef.toString());
}

if (!ndef.isWritable()) {
return false;
}
if (ndef.getMaxSize() < size) {
toast("Tag capacity is " + ndef.getMaxSize() + " bytes, message is " + size + " bytes.");
return false;
}
try{

ndef.writeNdefMessage(message);
}
catch(IOException e){
toast("error send");
Log.e("IOException", e + "-+-");
return false;
}


return true;
}
}
catch (Exception e) {
toast("Failed to write tag");
}
return false;
}

transmitTransmit 类的一个对象,其中定义了writeTag()

onCreate():

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

textView = (TextView) findViewById(R.id.textView);
transmit = new Transmit(this);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
textView.setText("");
detectedTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
lastDetectedTag = detectedTag;
pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,
new Intent(this, getClass()).
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
IntentFilter filter2 = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
readTagFilters = new IntentFilter[]{tagDetected,filter2};
techListsArray = new String[][] { new String[] { NfcF.class.getName() } };


if (mNfcAdapter == null) {
// Stop here, we definitely need NFC

finish();
return;

}

if (!mNfcAdapter.isEnabled()) {

}


buttonListener(testButton);

}

最佳答案

来自 Ndef 文档的 close() 方法:“禁用此 TagTechnology 对象对标记的 I/O 操作,并释放资源。”

所以我认为当您调用 close() 时,内部的 TagTechnology 就会被释放。如果您在同一个 ndef 上调用 connect,它就是一个“陈旧”对象。每次都尝试通过将 Tag 对象传递给它来创建一个新的 Ndef 对象。

编辑:或者在您真正完成之前不要调用 close()。您仍然需要在第一次调用 connect()。此外,我总是先调用 isConnected() 以确保标签存在并已连接。

关于android - 在循环中写入 NDEF 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31983383/

24 4 0
文章推荐: android - 如何在 java 中编写用于添加覆盖 List 的代码?