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