在循环中写入NDEF消息

时间:2015-08-13 08:41:44

标签: android while-loop nfc message ndef

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

最后编辑:微控制器似乎无法如此快速地处理数据,因此我的问题无法解决。

//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。这就是我想要的,但是如果我将我的计时器设置为在100ms之后重复,例如,我从writeNDEFmessage()得到了这个错误: java.io.IOException: Tag is not ndef。因此,如果我循环10次writeNDEFmessage(),它在第一次循环时工作正常,但我在下面的9中收到异常。

EDIT3:

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;
    }

transmit是来自Transmit类的对象,其中定义了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);

    }

1 个答案:

答案 0 :(得分:2)

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

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

编辑:或者只是在实际完成之前不要致电close()。您仍然需要第一次拨打connect()。另外,我总是首先调用isConnected()以确保标记存在并已连接。