Android NFC-V写标签+;onclick侦听器

Android NFC-V写标签+;onclick侦听器,android,nfc,iso-15693,Android,Nfc,Iso 15693,单击按钮后,我想在标签(ISO 15963)上写入数据。当活动打开时,我可以在标记上写入数据。我只是不知道如何做的应用程序开始配合标签后,点击按钮。有没有什么方法可以在不调用新活动的情况下执行此操作?多谢各位 代码: }您可以将标签存储在活动的字段中。单击按钮时,可以执行标记操作的逻辑。通过这些修改,它应该可以工作: public class MainActivity extends Activity { private Tag mTag; private IntentFilt

单击按钮后,我想在标签(ISO 15963)上写入数据。当活动打开时,我可以在标记上写入数据。我只是不知道如何做的应用程序开始配合标签后,点击按钮。有没有什么方法可以在不调用新活动的情况下执行此操作?多谢各位

代码:


}

您可以将标签存储在活动的字段中。单击按钮时,可以执行标记操作的逻辑。通过这些修改,它应该可以工作:

public class MainActivity extends Activity {

    private Tag mTag;
    private IntentFilter[] mFilters;
    private String[][] mTechLists;
    private PendingIntent mPendingIntent;
    private Button wbutton;
    private NfcAdapter myNfcAdapter;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wbutton = (Button) findViewById(R.id.button1);
        wbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                writeTag(mTag);
            }
        });
        configureNfc();
    }

    private void configureNfc(){
        myNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
        IntentFilter intnfcv = new IntentFilter(
                NfcAdapter.ACTION_TECH_DISCOVERED);
        mFilters = new IntentFilter[] { 
                intnfcv};
        mTechLists = new String[][] { new String[] {
                NfcV.class.getName() }};
    }

    private synchronized void writeTag(Tag tag){
        if(mTag !=null){
            try {
                new WriteVecinityTagTask().execute().get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            mTag=null;
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (myNfcAdapter != null) {
            myNfcAdapter.enableForegroundDispatch(this, mPendingIntent,
                    mFilters, mTechLists);
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        myNfcAdapter.disableForegroundDispatch(this);
    }

    @Override
    public void onNewIntent(Intent intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent);
        if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {
            mTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
        }
    }

    private class WriteVecinityTagTask extends AsyncTask<Void, Void, Boolean>{

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            String message = (result) ? "WRITE OK" : "ERROR";
            Toast.makeText(MainActivity.this, message , Toast.LENGTH_SHORT).show();
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            try{
                NfcV vecinityTag = NfcV.get(mTag);
                vecinityTag.connect();
                vecinityTag.transceive(
                        new byte[] {0x00, 0x21, (byte) 0,0x31, 0x31, 0x31, 0x31}
                        );
                vecinityTag.close();
            }catch(IOException e){
                e.printStackTrace();
                return false;
            }
            return true;
        }
    }
}
公共类MainActivity扩展活动{
私有标记mTag;
私人意向过滤器[]多个过滤器;
私有字符串[][]mtechlist;
私人悬而未决的侵权行为;
私人按钮;
私人NfcAdapter myNfcAdapter;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wbutton=(按钮)findViewById(R.id.button1);
wbutton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
书写标记(mTag);
}
});
configureNfc();
}
私有void configureNfc(){
myNfcAdapter=NfcAdapter.getDefaultAdapter(此);
mPendingIntent=pendingent.getActivity(this,0,newintent(this,
getClass()).addFlags(Intent.FLAG\u ACTIVITY\u SINGLE\u TOP),0);
IntentFilter intnfcv=新IntentFilter(
NfcAdapter.行动(技术发现);
mFilters=新的IntentFilter[]{
intnfcv};
mTechLists=新字符串[][{new String[]{
NfcV.class.getName()};
}
私有同步的void writeTag(标记标记){
如果(mTag!=null){
试一试{
新建WriteVecinityTagTask().execute().get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
mTag=null;
}
}
@凌驾
恢复时公开作废(){
super.onResume();
if(myNfcAdapter!=null){
myNfcAdapter.enableForegroundDispatch(此,mpendingContent,
过滤器、技术清单);
}
}
@凌驾
公共无效暂停(){
super.onPause();
myNfcAdapter.disableForegroundDispatch(本);
}
@凌驾
公共帐篷(意向){
//在此之后调用onResume来处理意图
设定意图(intent);
if(NfcAdapter.ACTION\u TECH\u DISCOVERED.equals(getIntent().getAction())){
mTag=getIntent().getParcelableExtra(NfcAdapter.EXTRA_标记);
}
}
私有类WriteVecinityTagTask扩展了AsyncTask{
@凌驾
受保护的void onPostExecute(布尔结果){
super.onPostExecute(结果);
字符串消息=(结果)?“写入确定”:“错误”;
Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();
}
@凌驾
受保护的布尔doInBackground(Void…params){
试一试{
NfcV vecinityTag=NfcV.get(mTag);
vecinityTag.connect();
vecinityTag.收发器(
新字节[]{0x00,0x21,(字节)0,0x31,0x31,0x31,0x31}
);
vecinityTag.close();
}捕获(IOE异常){
e、 printStackTrace();
返回false;
}
返回true;
}
}
}

现在我对使用此代码将数据写入标记有点困惑。我想我只能使用nfcv.transceive将数据写入标记,因为我的标记来自nfcv类。现在代码看起来非常好,但我遇到了与以前一样的问题,因为每次在onClick vecinityTag.isConnected()-is not connected.mTag=getIntent().getParcelableExtra(NfcAdapter.EXTRA_标记)中都会遇到同样的问题;需要的就是这样。现在它起作用了。谢谢。在设计这样的应用程序时,您应该记住,点击NFC标记和单击按钮都是UI事件。因此,在您的方法中,用户首先需要轻触标签,将标签放在手机可触及的位置,同时触摸屏幕上的按钮。通常,您会让用户先单击按钮,然后等待标记被点击。
public class MainActivity extends Activity {

    private Tag mTag;
    private IntentFilter[] mFilters;
    private String[][] mTechLists;
    private PendingIntent mPendingIntent;
    private Button wbutton;
    private NfcAdapter myNfcAdapter;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wbutton = (Button) findViewById(R.id.button1);
        wbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                writeTag(mTag);
            }
        });
        configureNfc();
    }

    private void configureNfc(){
        myNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
        IntentFilter intnfcv = new IntentFilter(
                NfcAdapter.ACTION_TECH_DISCOVERED);
        mFilters = new IntentFilter[] { 
                intnfcv};
        mTechLists = new String[][] { new String[] {
                NfcV.class.getName() }};
    }

    private synchronized void writeTag(Tag tag){
        if(mTag !=null){
            try {
                new WriteVecinityTagTask().execute().get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            mTag=null;
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (myNfcAdapter != null) {
            myNfcAdapter.enableForegroundDispatch(this, mPendingIntent,
                    mFilters, mTechLists);
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        myNfcAdapter.disableForegroundDispatch(this);
    }

    @Override
    public void onNewIntent(Intent intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent);
        if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {
            mTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
        }
    }

    private class WriteVecinityTagTask extends AsyncTask<Void, Void, Boolean>{

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            String message = (result) ? "WRITE OK" : "ERROR";
            Toast.makeText(MainActivity.this, message , Toast.LENGTH_SHORT).show();
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            try{
                NfcV vecinityTag = NfcV.get(mTag);
                vecinityTag.connect();
                vecinityTag.transceive(
                        new byte[] {0x00, 0x21, (byte) 0,0x31, 0x31, 0x31, 0x31}
                        );
                vecinityTag.close();
            }catch(IOException e){
                e.printStackTrace();
                return false;
            }
            return true;
        }
    }
}