标签:name uri array script spinner val for throw manage
1 package skyseraph.easytagwrite; 2 3 import skyseraph.android.util.CustomDialog; 4 import skyseraph.android.util.LogUtil; 5 import skyseraph.android.util.MyConstant; 6 import skyseraph.android.util.nfc.BobNdefMessage; 7 8 import android.app.Activity; 9 import android.app.AlertDialog; 10 import android.app.Dialog; 11 import android.app.PendingIntent; 12 import android.content.Context; 13 import android.content.DialogInterface; 14 import android.content.Intent; 15 import android.content.IntentFilter; 16 import android.graphics.Color; 17 import android.nfc.NdefMessage; 18 import android.nfc.NfcAdapter; 19 import android.nfc.Tag; 20 import android.nfc.tech.Ndef; 21 import android.nfc.tech.NdefFormatable; 22 import android.os.AsyncTask; 23 import android.os.Bundle; 24 import android.provider.Settings; 25 import android.util.DisplayMetrics; 26 import android.view.Menu; 27 import android.view.MenuItem; 28 import android.view.View; 29 import android.view.WindowManager; 30 import android.widget.AdapterView; 31 import android.widget.AdapterView.OnItemSelectedListener; 32 import android.widget.ArrayAdapter; 33 import android.widget.Button; 34 import android.widget.EditText; 35 import android.widget.Spinner; 36 import android.widget.TextView; 37 import android.widget.Toast; 38 39 import java.io.IOException; 40 41 public class MainActivity extends Activity { 42 private static final String TAG_ASSIST = "[MainActivity]-"; 43 44 // NFC Declarations 45 private NfcAdapter mNfcAdapter = null; 46 47 private IntentFilter[] mFilters = null; 48 49 private PendingIntent mPendingIntent = null; 50 51 private String[][] mTechLists = null; 52 53 private Context mContext; 54 55 private NdefMessage NDEFMsg2Write = null; 56 57 // UI 58 private EditText mEditText1 = null; 59 60 private EditText mEditText2 = null; 61 62 private TextView mTextView1 = null; 63 64 private TextView mTextView2 = null; 65 66 private Spinner mSpinner = null; 67 68 private ArrayAdapter mAdapter = null; 69 70 private Button writeUrlButton, saveUrlButton, exitButton; 71 72 private static final String[] spinnerStr = { 73 "TNF_ABSOLUTE_URI", "TNF_MIME_MEDIA", "TNF_WELL_KNOWN RTD-TEXT", 74 "TNF_WELL_KNOWN RTD-URI", "TNF_EXTERNAL_TYPE", 75 }; 76 77 private String payloadStr = ""; 78 79 private String typeStr = ""; 80 81 private int tagTypeFlag = 0;// 82 83 private AlertDialog alertDialog = null; 84 85 @Override 86 protected void onCreate(Bundle savedInstanceState) { 87 super.onCreate(savedInstanceState); 88 setContentView(R.layout.activity_main); 89 mContext = this; 90 91 checkNFCFunction(); // NFC Check 92 initUI();// Init UI 93 initNFC();// Init NFC 94 } 95 96 @Override 97 public boolean onCreateOptionsMenu(Menu menu) { 98 // Inflate the menu; this adds items to the action bar if it is present. 99 getMenuInflater().inflate(R.menu.main, menu); 100 return true; 101 } 102 103 @Override 104 public boolean onOptionsItemSelected(MenuItem item) { 105 // TODO Auto-generated method stub 106 super.onOptionsItemSelected(item); 107 switch (item.getItemId()) 108 // item clicked 109 { 110 case R.id.action_settings: 111 // Intent setnfc = new 112 // Intent(Settings.ACTION_WIRELESS_SETTINGS); 113 Intent setnfc = new Intent(Settings.ACTION_NFC_SETTINGS); 114 startActivity(setnfc); 115 break; 116 case R.id.action_about: 117 dialog(); 118 break; 119 } 120 return true; 121 } 122 123 protected void dialog() { 124 AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 125 builder.setTitle(getString(R.string.dialog_notice)); 126 alertDialog = builder.create(); 127 builder.setCancelable(true);// back 128 alertDialog.setCanceledOnTouchOutside(true); 129 alertDialog.show(); 130 } 131 132 @Override 133 public void onResume() { 134 super.onResume(); 135 if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) { 136 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "ACTION_TECH_DISCOVERED"); 137 // get NFC object 138 Tag detectTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG); 139 // validate that this tag can be written 140 if (supportedTechs(detectTag.getTechList())) { 141 switch (tagTypeFlag) { 142 case 0:// ABSOLUTE_URI 143 NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_ABSOLUTE_URI(payloadStr, false); 144 // writeNdefMessageToTag(NDEFMsg2Write, detectTag); // By 145 // Function 146 new WriteTask(this, NDEFMsg2Write, detectTag).execute(); // By 147 // AsyncTask 148 // Class 149 break; 150 case 1:// MIME_MEDIA 151 NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_MIME_MEDIA(payloadStr, 152 "application/skyseraph.nfc_demo", false); 153 // writeNdefMessageToTag(NDEFMsg2Write, detectTag); 154 new WriteTask(this, NDEFMsg2Write, detectTag).execute(); 155 break; 156 case 2:// RTD_TEXT 157 NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_RTD_TEXT(payloadStr, false, 158 false); 159 // writeNdefMessageToTag(NDEFMsg2Write, detectTag); 160 new WriteTask(this, NDEFMsg2Write, detectTag).execute(); 161 break; 162 case 3:// RTD_URI 163 NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_RTD_URI(payloadStr, (byte)0x01, 164 false); 165 // writeNdefMessageToTag(NDEFMsg2Write, detectTag); 166 new WriteTask(this, NDEFMsg2Write, detectTag).execute(); 167 break; 168 case 4:// EXTERNAL_TYPE 169 NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_EXTERNAL_TYPE(payloadStr, false); 170 // writeNdefMessageToTag(NDEFMsg2Write, detectTag); 171 new WriteTask(this, NDEFMsg2Write, detectTag).execute(); 172 break; 173 default:// RTD_URI 174 NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_RTD_URI(payloadStr, (byte)0x01, 175 false); 176 // writeNdefMessageToTag(NDEFMsg2Write, detectTag); 177 new WriteTask(this, NDEFMsg2Write, detectTag).execute(); 178 break; 179 } 180 } else { 181 Toast.makeText(mContext, "This tag type is not supported", Toast.LENGTH_SHORT).show(); 182 } 183 } 184 } 185 186 @Override 187 public void onNewIntent(Intent intent) { 188 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "Discovered tag with intent: " + intent); 189 setIntent(intent); 190 } 191 192 @Override 193 public void onPause() { 194 super.onPause(); 195 if (alertDialog != null) 196 alertDialog.cancel(); 197 disableForegroundDispatch(); 198 } 199 200 private void initUI() { 201 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into initUI"); 202 // TODO Auto-generated method stub 203 mEditText1 = (EditText)this.findViewById(R.id.write_ndef_tag_et1); 204 mEditText2 = (EditText)this.findViewById(R.id.write_ndef_tag_et2); 205 mTextView1 = (TextView)findViewById(R.id.write_ndef_tag_tv1); 206 mTextView2 = (TextView)findViewById(R.id.write_ndef_tag_tv2); 207 208 saveUrlButton = (Button)findViewById(R.id.write_ndef_tag_saveBtn); 209 saveUrlButton.setOnClickListener(new View.OnClickListener() { 210 public void onClick(View v) { 211 writeUrlButton.setEnabled(true); 212 switch (tagTypeFlag) { 213 case 0:// ABSOLUTE_URI 214 payloadStr = mEditText1.getText().toString(); 215 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr); 216 mTextView1.setText("(Touch NFC Tag to write-ABSOLUTE_URI): " + payloadStr); 217 mTextView1.setTextColor(Color.BLUE); 218 break; 219 case 1:// MIME_MEDIA 220 payloadStr = mEditText2.getText().toString(); 221 typeStr = mEditText1.getText().toString(); 222 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr 223 + ",typeStr=" + typeStr); 224 mTextView1.setText("Touch NFC Tag to write-MIME_MEDIA): " + typeStr); 225 mTextView1.setTextColor(Color.BLUE); 226 mTextView2 227 .setText("Touch NFC Tag to write-MIME_MEDIA,Data): " + payloadStr); 228 mTextView2.setTextColor(Color.BLUE); 229 break; 230 case 2:// RTD_TEXT 231 payloadStr = mEditText1.getText().toString(); 232 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr); 233 mTextView1.setText("(Touch NFC Tag to write-RTD_TEXT): " + payloadStr); 234 mTextView1.setTextColor(Color.BLUE); 235 break; 236 case 3:// RTD_URI 237 payloadStr = mEditText1.getText().toString(); 238 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr); 239 mTextView1.setText("(Touch NFC Tag to write-RTD_URI): http://www." 240 + payloadStr); 241 mTextView1.setTextColor(Color.BLUE); 242 break; 243 case 4:// EXTERNAL_TYPE_SMS 244 typeStr = "skyseraph.nfc_demo:externalType"; 245 payloadStr = mEditText2.getText().toString(); 246 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr); 247 mTextView1.setText("Touch NFC Tag to write-EXTERNAL_TYPE): " + payloadStr); 248 mTextView1.setTextColor(Color.BLUE); 249 break; 250 default:// RTD_URI 251 payloadStr = mEditText1.getText().toString(); 252 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr); 253 mTextView1.setText("(Touch NFC Tag to write): http://www." + payloadStr); 254 mTextView1.setTextColor(Color.BLUE); 255 break; 256 } 257 } 258 }); 259 260 writeUrlButton = (Button)this.findViewById(R.id.write_ndef_tag_writeBtn); 261 writeUrlButton.setEnabled(false); 262 writeUrlButton.setOnClickListener(new View.OnClickListener() { 263 public void onClick(View view) { 264 // Write to a tag for as long as the dialog is shown. 265 enableForegroundDispatch(); 266 AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 267 builder.setTitle("Touch tag to write").setOnCancelListener( 268 new DialogInterface.OnCancelListener() { 269 @Override 270 public void onCancel(DialogInterface dialog) { 271 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "mTagWriter - onCancel"); 272 disableForegroundDispatch(); 273 } 274 }); 275 alertDialog = builder.create(); 276 alertDialog.setCanceledOnTouchOutside(false); 277 alertDialog.show(); 278 } 279 }); 280 281 exitButton = (Button)findViewById(R.id.write_ndef_tag_exitBtn); 282 exitButton.setOnClickListener(new View.OnClickListener() { 283 public void onClick(View v) { 284 finish(); 285 } 286 }); 287 288 mSpinner = (Spinner)findViewById(R.id.write_ndef_tag_sp); 289 mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, spinnerStr); 290 mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 291 mSpinner.setAdapter(mAdapter); 292 mSpinner.setOnItemSelectedListener(new SpinnerXMLSelectedListener()); 293 mSpinner.setVisibility(View.VISIBLE); 294 mSpinner.setSelection(0, true); 295 } 296 297 class SpinnerXMLSelectedListener implements OnItemSelectedListener { 298 public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 299 LogUtil.i(MyConstant.TAG, 300 TAG_ASSIST + "What you have selected=" + mAdapter.getItem(arg2) + ",position=" 301 + arg2); 302 saveUrlButton.setEnabled(true); 303 writeUrlButton.setEnabled(false); 304 switch (arg2) { 305 case 0:// ABSOLUTE_URI 306 tagTypeFlag = 0; 307 mTextView1 308 .setText("Please input a absolute uri,exp: http://www.baidu.com/index.html"); 309 mTextView1.setTextColor(Color.RED); 310 mEditText2.setVisibility(View.GONE); 311 mTextView2.setVisibility(View.GONE); 312 break; 313 case 1:// MIME_MEDIA 314 tagTypeFlag = 1; 315 mTextView2 316 .setText("Please input a mime_media, exp: application/skyseraph.nfc_demo"); 317 mTextView1.setTextColor(Color.RED); 318 mEditText2.setVisibility(View.VISIBLE); 319 mTextView2.setVisibility(View.VISIBLE); 320 mTextView1 321 .setText("Please input your mime_media data, exp: This is a MIME_MEDIA"); 322 mTextView2.setTextColor(Color.RED); 323 break; 324 case 2:// RTD TEXT 325 tagTypeFlag = 2; 326 mTextView1.setText("Please input a RTD TEXT,exp: This is an RTD-TEXT"); 327 mTextView1.setTextColor(Color.RED); 328 mEditText2.setVisibility(View.GONE); 329 mTextView2.setVisibility(View.GONE); 330 break; 331 case 3: // RTD URI 332 tagTypeFlag = 3; 333 mTextView1.setText("Please input a RTD uri,exp: baidu.com"); 334 mTextView1.setTextColor(Color.RED); 335 mEditText2.setVisibility(View.GONE); 336 mTextView2.setVisibility(View.GONE); 337 break; 338 case 4:// EXTERNAL_TYPE 339 tagTypeFlag = 4; 340 mTextView1 341 .setText("Please input a EXTERNAL_TYPE, exp: This is an EXTERNAL_TYPE"); 342 mTextView1.setTextColor(Color.RED); 343 mEditText2.setVisibility(View.GONE); 344 mTextView2.setVisibility(View.GONE); 345 break; 346 default:// RTD_URI 347 tagTypeFlag = 3; 348 mTextView1.setText("Please input a RTD uri,exp: baidu.com"); 349 mTextView1.setTextColor(Color.RED); 350 mEditText2.setVisibility(View.GONE); 351 mTextView2.setVisibility(View.GONE); 352 break; 353 } 354 } 355 356 public void onNothingSelected(AdapterView<?> arg0) { 357 358 } 359 } 360 361 /** 362 * Init NFC 363 */ 364 private void initNFC() { 365 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into initNFC"); 366 mPendingIntent = PendingIntent.getActivity(this, 0, 367 new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 368 // FLAG_ACTIVITY_SINGLE_TOP: not creating multiple instances of the same 369 // application. 370 IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); 371 IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); 372 IntentFilter techDetected = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); 373 // ndef.addDataScheme("http"); 374 // Intent filters for writing to a tag 375 mFilters = new IntentFilter[] { 376 ndefDetected, 377 };// just trying to find a tag,not ndef or tech 378 379 mTechLists = new String[][] { 380 new String[] { 381 Ndef.class.getName() 382 }, new String[] { 383 NdefFormatable.class.getName() 384 } 385 }; 386 } 387 388 /** 389 * @param message 390 * @param detectedTag 391 * @return 392 */ 393 boolean writeNdefMessageToTag(NdefMessage message, Tag detectedTag) { 394 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into writeNdefMessageToTag"); 395 int size = message.toByteArray().length; 396 try { 397 Ndef ndef = Ndef.get(detectedTag); 398 if (ndef != null) { 399 ndef.connect(); 400 401 if (!ndef.isWritable()) { 402 Toast.makeText(this, "Tag is read-only.", Toast.LENGTH_LONG).show(); 403 return false; 404 } 405 if (ndef.getMaxSize() < size) { 406 Toast.makeText( 407 this, 408 "The data cannot written to tag, Tag capacity is " + ndef.getMaxSize() 409 + " bytes, message is " + size + " bytes.", Toast.LENGTH_LONG) 410 .show(); 411 return false; 412 } 413 414 ndef.writeNdefMessage(message); 415 ndef.close(); 416 String str = "Message is written tag, message=" + message; 417 Toast.makeText(this, str, Toast.LENGTH_LONG).show(); 418 return true; 419 } else { 420 NdefFormatable ndefFormat = NdefFormatable.get(detectedTag); 421 if (ndefFormat != null) { 422 try { 423 ndefFormat.connect(); 424 ndefFormat.format(message); 425 ndefFormat.close(); 426 Toast.makeText(this, "The data is written to the tag ", Toast.LENGTH_SHORT) 427 .show(); 428 return true; 429 } catch (IOException e) { 430 Toast.makeText(this, "Failed to format tag", Toast.LENGTH_SHORT).show(); 431 return false; 432 } 433 } else { 434 Toast.makeText(this, "NDEF is not supported", Toast.LENGTH_SHORT).show(); 435 return false; 436 } 437 } 438 } catch (Exception e) { 439 Toast.makeText(this, "Write opreation is failed", Toast.LENGTH_SHORT).show(); 440 } 441 return false; 442 } 443 444 /** 445 * @Title: supportedTechs 446 * @Description: Check Support Techs 447 * @param @param techs 448 * @param @return 449 * @return boolean 450 * @throws 451 */ 452 public static boolean supportedTechs(String[] techs) { 453 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into supportedTechs"); 454 for (String s : techs) { 455 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "all supportedTechs = " + s); 456 } 457 boolean ultralight = false; 458 boolean nfcA = false; 459 boolean ndef = false; 460 for (String tech : techs) { 461 if (tech.equals("android.nfc.tech.MifareUltralight")) { 462 ultralight = true; 463 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "supportedTechs is:ultralight"); 464 } else if (tech.equals("android.nfc.tech.NfcA")) { 465 nfcA = true; 466 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "supportedTechs is:NfcA"); 467 } else if (tech.equals("android.nfc.tech.Ndef") 468 || tech.equals("android.nfc.tech.NdefFormatable")) { 469 ndef = true; 470 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "supportedTechs is:Ndef/NdefFormatable"); 471 } else if (tech.equals("android.nfc.tech.MifareClassic")) { 472 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "supportedTechs is:MifareClassic"); 473 } 474 } 475 if (ultralight && nfcA && ndef) { 476 return true; 477 } else { 478 return false; 479 } 480 } 481 482 /** 483 * enable TagWrite 484 */ 485 private void enableForegroundDispatch() { 486 if (mNfcAdapter != null) { 487 mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists); 488 } 489 } 490 491 /** 492 * disable TagWrite 493 */ 494 private void disableForegroundDispatch() { 495 if (mNfcAdapter != null) { 496 mNfcAdapter.disableForegroundDispatch(this); 497 } 498 } 499 500 /** 501 * NFC Function Check By skyseraph 2013-2 502 */ 503 private void checkNFCFunction() { 504 // TODO Auto-generated method stub 505 mNfcAdapter = NfcAdapter.getDefaultAdapter(this); 506 // check the NFC adapter first 507 if (mNfcAdapter == null) { 508 // mTextView.setText("NFC apdater is not available"); 509 Dialog dialog = null; 510 CustomDialog.Builder customBuilder = new CustomDialog.Builder(mContext); 511 customBuilder 512 .setTitle(getString(R.string.inquire)) 513 .setMessage(getString(R.string.nfc_notice2)) 514 .setIcon(R.drawable.dialog_icon2) 515 .setNegativeButton(getString(R.string.no), 516 new DialogInterface.OnClickListener() { 517 public void onClick(DialogInterface dialog, int which) { 518 dialog.dismiss(); 519 finish(); 520 } 521 }) 522 .setPositiveButton(getString(R.string.yes), 523 new DialogInterface.OnClickListener() { 524 public void onClick(DialogInterface dialog, int which) { 525 dialog.dismiss(); 526 finish(); 527 } 528 }); 529 dialog = customBuilder.create(); 530 dialog.setCancelable(false);// back 531 dialog.setCanceledOnTouchOutside(false); 532 SetDialogWidth(dialog).show(); 533 return; 534 } else { 535 if (!mNfcAdapter.isEnabled()) { 536 Dialog dialog = null; 537 CustomDialog.Builder customBuilder = new CustomDialog.Builder(mContext); 538 customBuilder 539 .setTitle(getString(R.string.inquire)) 540 .setMessage(getString(R.string.nfc_notice3)) 541 .setIcon(R.drawable.dialog_icon2) 542 .setNegativeButton(getString(R.string.no), 543 new DialogInterface.OnClickListener() { 544 public void onClick(DialogInterface dialog, int which) { 545 dialog.dismiss(); 546 finish(); 547 } 548 }) 549 .setPositiveButton(getString(R.string.yes), 550 new DialogInterface.OnClickListener() { 551 public void onClick(DialogInterface dialog, int which) { 552 dialog.dismiss(); 553 Intent setnfc = new Intent( 554 Settings.ACTION_WIRELESS_SETTINGS); 555 // Intent setnfc = new 556 // Intent(Settings.ACTION_NFC_SETTINGS); 557 startActivity(setnfc); 558 } 559 }); 560 dialog = customBuilder.create(); 561 dialog.setCancelable(false);// back 562 dialog.setCanceledOnTouchOutside(false); 563 SetDialogWidth(dialog).show(); 564 return; 565 } 566 } 567 } 568 569 /** 570 * @param dialog 571 * @return 572 */ 573 private Dialog SetDialogWidth(Dialog dialog) { 574 DisplayMetrics dm = new DisplayMetrics(); 575 getWindowManager().getDefaultDisplay().getMetrics(dm); 576 int screenWidth = dm.widthPixels; 577 int screenHeight = dm.heightPixels; 578 WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); 579 if (screenWidth > screenHeight) { 580 params.width = (int)(((float)screenHeight) * 0.875); 581 582 } else { 583 params.width = (int)(((float)screenWidth) * 0.875); 584 } 585 dialog.getWindow().setAttributes(params); 586 587 return dialog; 588 } 589 590 /** 591 *********************************************************************** @Title :WriteNdefTag.java 592 * @Package :skyseraph.nfc_demo.tag.write 593 * @ClassName : WriteTask 594 * @Description : TODO 595 * @author : skyseraph00@163.com 596 * @date : 2013-9-13 上午11:38:58 597 * @version : V1.0 598 */ 599 static class WriteTask extends AsyncTask<Void, Void, Void> { 600 Activity host = null; 601 602 NdefMessage msg = null; 603 604 Tag tag = null; 605 606 String text = null; 607 608 WriteTask(Activity host, NdefMessage msg, Tag tag) { 609 LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into WriteTask AsyncTask"); 610 this.host = host; 611 this.msg = msg; 612 this.tag = tag; 613 } 614 615 @Override 616 protected Void doInBackground(Void... arg0) { 617 int size = msg.toByteArray().length; 618 619 try { 620 Ndef ndef = Ndef.get(tag); 621 622 if (ndef == null) { 623 NdefFormatable formatable = NdefFormatable.get(tag); 624 if (formatable != null) { 625 try { 626 formatable.connect(); 627 try { 628 formatable.format(msg); 629 } catch (Exception e) { 630 text = "Failed to format tag,Tag refused to format"; 631 } 632 } catch (Exception e) { 633 text = "Failed to connect tag,Tag refused to connect"; 634 } finally { 635 formatable.close(); 636 } 637 } else { 638 text = "NDEF is not supported in this Tag"; 639 } 640 } else { 641 ndef.connect(); 642 643 try { 644 if (!ndef.isWritable()) { 645 text = "Tag is read-only"; 646 } else if (ndef.getMaxSize() < size) { 647 text = "The data cannot written to tag,Message is too big for tag,Tag capacity is " 648 + ndef.getMaxSize() + " bytes, message is " + size + " bytes."; 649 } else { 650 ndef.writeNdefMessage(msg); 651 text = "Message is written tag, message=" + msg; 652 } 653 } catch (Exception e) { 654 text = "Tag refused to connect"; 655 } finally { 656 ndef.close(); 657 } 658 } 659 } catch (Exception e) { 660 text = "Write opreation is failed,General exception: " + e.getMessage(); 661 LogUtil.i(MyConstant.TAG, TAG_ASSIST 662 + "Exception when writing tag,Write opreation is failed" + text); 663 } 664 665 return (null); 666 } 667 668 @Override 669 protected void onPostExecute(Void unused) { 670 if (text != null) { 671 Toast.makeText(host, text, Toast.LENGTH_SHORT).show(); 672 } 673 674 // host.finish(); // after writed, auto finish 675 } 676 } 677 }
package skyseraph.easytagwrite;
import skyseraph.android.util.CustomDialog;import skyseraph.android.util.LogUtil;import skyseraph.android.util.MyConstant;import skyseraph.android.util.nfc.BobNdefMessage;
import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.PendingIntent;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Color;import android.nfc.NdefMessage;import android.nfc.NfcAdapter;import android.nfc.Tag;import android.nfc.tech.Ndef;import android.nfc.tech.NdefFormatable;import android.os.AsyncTask;import android.os.Bundle;import android.provider.Settings;import android.util.DisplayMetrics;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.WindowManager;import android.widget.AdapterView;import android.widget.AdapterView.OnItemSelectedListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.Spinner;import android.widget.TextView;import android.widget.Toast;
import java.io.IOException;
public class MainActivity extends Activity {    private static final String TAG_ASSIST = "[MainActivity]-";
    // NFC Declarations    private NfcAdapter mNfcAdapter = null;
    private IntentFilter[] mFilters = null;
    private PendingIntent mPendingIntent = null;
    private String[][] mTechLists = null;
    private Context mContext;
    private NdefMessage NDEFMsg2Write = null;
    // UI    private EditText mEditText1 = null;
    private EditText mEditText2 = null;
    private TextView mTextView1 = null;
    private TextView mTextView2 = null;
    private Spinner mSpinner = null;
    private ArrayAdapter mAdapter = null;
    private Button writeUrlButton, saveUrlButton, exitButton;
    private static final String[] spinnerStr = {            "TNF_ABSOLUTE_URI", "TNF_MIME_MEDIA", "TNF_WELL_KNOWN RTD-TEXT",            "TNF_WELL_KNOWN RTD-URI", "TNF_EXTERNAL_TYPE",    };
    private String payloadStr = "";
    private String typeStr = "";
    private int tagTypeFlag = 0;//
    private AlertDialog alertDialog = null;
    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mContext = this;
        checkNFCFunction(); // NFC Check        initUI();// Init UI        initNFC();// Init NFC    }
    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }
    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // TODO Auto-generated method stub        super.onOptionsItemSelected(item);        switch (item.getItemId())        // item clicked        {            case R.id.action_settings:                // Intent setnfc = new                // Intent(Settings.ACTION_WIRELESS_SETTINGS);                Intent setnfc = new Intent(Settings.ACTION_NFC_SETTINGS);                startActivity(setnfc);                break;            case R.id.action_about:                dialog();                break;        }        return true;    }
    protected void dialog() {        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);        builder.setTitle(getString(R.string.dialog_notice));        alertDialog = builder.create();        builder.setCancelable(true);// back        alertDialog.setCanceledOnTouchOutside(true);        alertDialog.show();    }
    @Override    public void onResume() {        super.onResume();        if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {            LogUtil.i(MyConstant.TAG, TAG_ASSIST + "ACTION_TECH_DISCOVERED");            // get NFC object            Tag detectTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);            // validate that this tag can be written            if (supportedTechs(detectTag.getTechList())) {                switch (tagTypeFlag) {                    case 0:// ABSOLUTE_URI                        NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_ABSOLUTE_URI(payloadStr, false);                        // writeNdefMessageToTag(NDEFMsg2Write, detectTag); // By                        // Function                        new WriteTask(this, NDEFMsg2Write, detectTag).execute(); // By                                                                                 // AsyncTask                                                                                 // Class                        break;                    case 1:// MIME_MEDIA                        NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_MIME_MEDIA(payloadStr,                                "application/skyseraph.nfc_demo", false);                        // writeNdefMessageToTag(NDEFMsg2Write, detectTag);                        new WriteTask(this, NDEFMsg2Write, detectTag).execute();                        break;                    case 2:// RTD_TEXT                        NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_RTD_TEXT(payloadStr, false,                                false);                        // writeNdefMessageToTag(NDEFMsg2Write, detectTag);                        new WriteTask(this, NDEFMsg2Write, detectTag).execute();                        break;                    case 3:// RTD_URI                        NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_RTD_URI(payloadStr, (byte)0x01,                                false);                        // writeNdefMessageToTag(NDEFMsg2Write, detectTag);                        new WriteTask(this, NDEFMsg2Write, detectTag).execute();                        break;                    case 4:// EXTERNAL_TYPE                        NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_EXTERNAL_TYPE(payloadStr, false);                        // writeNdefMessageToTag(NDEFMsg2Write, detectTag);                        new WriteTask(this, NDEFMsg2Write, detectTag).execute();                        break;                    default:// RTD_URI                        NDEFMsg2Write = BobNdefMessage.getNdefMsg_from_RTD_URI(payloadStr, (byte)0x01,                                false);                        // writeNdefMessageToTag(NDEFMsg2Write, detectTag);                        new WriteTask(this, NDEFMsg2Write, detectTag).execute();                        break;                }            } else {                Toast.makeText(mContext, "This tag type is not supported", Toast.LENGTH_SHORT).show();            }        }     }
    @Override    public void onNewIntent(Intent intent) {        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "Discovered tag with intent: " + intent);        setIntent(intent);    }
    @Override    public void onPause() {        super.onPause();        if (alertDialog != null)            alertDialog.cancel();        disableForegroundDispatch();    }
    private void initUI() {        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into initUI");        // TODO Auto-generated method stub        mEditText1 = (EditText)this.findViewById(R.id.write_ndef_tag_et1);        mEditText2 = (EditText)this.findViewById(R.id.write_ndef_tag_et2);        mTextView1 = (TextView)findViewById(R.id.write_ndef_tag_tv1);        mTextView2 = (TextView)findViewById(R.id.write_ndef_tag_tv2);
        saveUrlButton = (Button)findViewById(R.id.write_ndef_tag_saveBtn);        saveUrlButton.setOnClickListener(new View.OnClickListener() {            public void onClick(View v) {                writeUrlButton.setEnabled(true);                switch (tagTypeFlag) {                    case 0:// ABSOLUTE_URI                        payloadStr = mEditText1.getText().toString();                        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr);                        mTextView1.setText("(Touch NFC Tag to write-ABSOLUTE_URI): " + payloadStr);                        mTextView1.setTextColor(Color.BLUE);                        break;                    case 1:// MIME_MEDIA                        payloadStr = mEditText2.getText().toString();                        typeStr = mEditText1.getText().toString();                        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr                                + ",typeStr=" + typeStr);                        mTextView1.setText("Touch NFC Tag to write-MIME_MEDIA): " + typeStr);                        mTextView1.setTextColor(Color.BLUE);                        mTextView2                                .setText("Touch NFC Tag to write-MIME_MEDIA,Data): " + payloadStr);                        mTextView2.setTextColor(Color.BLUE);                        break;                    case 2:// RTD_TEXT                        payloadStr = mEditText1.getText().toString();                        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr);                        mTextView1.setText("(Touch NFC Tag to write-RTD_TEXT): " + payloadStr);                        mTextView1.setTextColor(Color.BLUE);                        break;                    case 3:// RTD_URI                        payloadStr = mEditText1.getText().toString();                        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr);                        mTextView1.setText("(Touch NFC Tag to write-RTD_URI):  http://www."                                + payloadStr);                        mTextView1.setTextColor(Color.BLUE);                        break;                    case 4:// EXTERNAL_TYPE_SMS                        typeStr = "skyseraph.nfc_demo:externalType";                        payloadStr = mEditText2.getText().toString();                        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr);                        mTextView1.setText("Touch NFC Tag to write-EXTERNAL_TYPE): " + payloadStr);                        mTextView1.setTextColor(Color.BLUE);                        break;                    default:// RTD_URI                        payloadStr = mEditText1.getText().toString();                        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "payloadStr=" + payloadStr);                        mTextView1.setText("(Touch NFC Tag to write): http://www." + payloadStr);                        mTextView1.setTextColor(Color.BLUE);                        break;                }            }        });
        writeUrlButton = (Button)this.findViewById(R.id.write_ndef_tag_writeBtn);        writeUrlButton.setEnabled(false);        writeUrlButton.setOnClickListener(new View.OnClickListener() {            public void onClick(View view) {                // Write to a tag for as long as the dialog is shown.                enableForegroundDispatch();                AlertDialog.Builder builder = new AlertDialog.Builder(mContext);                builder.setTitle("Touch tag to write").setOnCancelListener(                        new DialogInterface.OnCancelListener() {                            @Override                            public void onCancel(DialogInterface dialog) {                                LogUtil.i(MyConstant.TAG, TAG_ASSIST + "mTagWriter - onCancel");                                disableForegroundDispatch();                            }                        });                alertDialog = builder.create();                alertDialog.setCanceledOnTouchOutside(false);                alertDialog.show();            }        });
        exitButton = (Button)findViewById(R.id.write_ndef_tag_exitBtn);        exitButton.setOnClickListener(new View.OnClickListener() {            public void onClick(View v) {                finish();            }        });
        mSpinner = (Spinner)findViewById(R.id.write_ndef_tag_sp);        mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, spinnerStr);        mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);        mSpinner.setAdapter(mAdapter);        mSpinner.setOnItemSelectedListener(new SpinnerXMLSelectedListener());        mSpinner.setVisibility(View.VISIBLE);        mSpinner.setSelection(0, true);    }
    class SpinnerXMLSelectedListener implements OnItemSelectedListener {        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {            LogUtil.i(MyConstant.TAG,                    TAG_ASSIST + "What you have selected=" + mAdapter.getItem(arg2) + ",position="                            + arg2);            saveUrlButton.setEnabled(true);            writeUrlButton.setEnabled(false);            switch (arg2) {                case 0:// ABSOLUTE_URI                    tagTypeFlag = 0;                    mTextView1                            .setText("Please input a absolute uri,exp: http://www.baidu.com/index.html");                    mTextView1.setTextColor(Color.RED);                    mEditText2.setVisibility(View.GONE);                    mTextView2.setVisibility(View.GONE);                    break;                case 1:// MIME_MEDIA                    tagTypeFlag = 1;                    mTextView2                            .setText("Please input a mime_media, exp: application/skyseraph.nfc_demo");                    mTextView1.setTextColor(Color.RED);                    mEditText2.setVisibility(View.VISIBLE);                    mTextView2.setVisibility(View.VISIBLE);                    mTextView1                            .setText("Please input your mime_media data, exp: This is a MIME_MEDIA");                    mTextView2.setTextColor(Color.RED);                    break;                case 2:// RTD TEXT                    tagTypeFlag = 2;                    mTextView1.setText("Please input a RTD TEXT,exp: This is an RTD-TEXT");                    mTextView1.setTextColor(Color.RED);                    mEditText2.setVisibility(View.GONE);                    mTextView2.setVisibility(View.GONE);                    break;                case 3: // RTD URI                    tagTypeFlag = 3;                    mTextView1.setText("Please input a RTD uri,exp: baidu.com");                    mTextView1.setTextColor(Color.RED);                    mEditText2.setVisibility(View.GONE);                    mTextView2.setVisibility(View.GONE);                    break;                case 4:// EXTERNAL_TYPE                    tagTypeFlag = 4;                    mTextView1                            .setText("Please input a EXTERNAL_TYPE, exp: This is an EXTERNAL_TYPE");                    mTextView1.setTextColor(Color.RED);                    mEditText2.setVisibility(View.GONE);                    mTextView2.setVisibility(View.GONE);                    break;                default:// RTD_URI                    tagTypeFlag = 3;                    mTextView1.setText("Please input a RTD uri,exp: baidu.com");                    mTextView1.setTextColor(Color.RED);                    mEditText2.setVisibility(View.GONE);                    mTextView2.setVisibility(View.GONE);                    break;            }        }
        public void onNothingSelected(AdapterView<?> arg0) {
        }    }
    /**     * Init NFC     */    private void initNFC() {        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into initNFC");        mPendingIntent = PendingIntent.getActivity(this, 0,                new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);        // FLAG_ACTIVITY_SINGLE_TOP: not creating multiple instances of the same        // application.        IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);        IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);        IntentFilter techDetected = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);        // ndef.addDataScheme("http");        // Intent filters for writing to a tag        mFilters = new IntentFilter[] {            ndefDetected,        };// just trying to find a tag,not ndef or tech
        mTechLists = new String[][] {                new String[] {                    Ndef.class.getName()                }, new String[] {                    NdefFormatable.class.getName()                }        };    }
    /**     * @param message     * @param detectedTag     * @return     */    boolean writeNdefMessageToTag(NdefMessage message, Tag detectedTag) {        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into writeNdefMessageToTag");        int size = message.toByteArray().length;        try {            Ndef ndef = Ndef.get(detectedTag);            if (ndef != null) {                ndef.connect();
                if (!ndef.isWritable()) {                    Toast.makeText(this, "Tag is read-only.", Toast.LENGTH_LONG).show();                    return false;                }                if (ndef.getMaxSize() < size) {                    Toast.makeText(                            this,                            "The data cannot written to tag, Tag capacity is " + ndef.getMaxSize()                                    + " bytes, message is " + size + " bytes.", Toast.LENGTH_LONG)                            .show();                    return false;                }
                ndef.writeNdefMessage(message);                ndef.close();                String str = "Message is written tag, message=" + message;                Toast.makeText(this, str, Toast.LENGTH_LONG).show();                return true;            } else {                NdefFormatable ndefFormat = NdefFormatable.get(detectedTag);                if (ndefFormat != null) {                    try {                        ndefFormat.connect();                        ndefFormat.format(message);                        ndefFormat.close();                        Toast.makeText(this, "The data is written to the tag ", Toast.LENGTH_SHORT)                                .show();                        return true;                    } catch (IOException e) {                        Toast.makeText(this, "Failed to format tag", Toast.LENGTH_SHORT).show();                        return false;                    }                } else {                    Toast.makeText(this, "NDEF is not supported", Toast.LENGTH_SHORT).show();                    return false;                }            }        } catch (Exception e) {            Toast.makeText(this, "Write opreation is failed", Toast.LENGTH_SHORT).show();        }        return false;    }
    /**     * @Title: supportedTechs     * @Description: Check Support Techs     * @param @param techs     * @param @return     * @return boolean     * @throws     */    public static boolean supportedTechs(String[] techs) {        LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into supportedTechs");        for (String s : techs) {            LogUtil.i(MyConstant.TAG, TAG_ASSIST + "all supportedTechs = " + s);        }        boolean ultralight = false;        boolean nfcA = false;        boolean ndef = false;        for (String tech : techs) {            if (tech.equals("android.nfc.tech.MifareUltralight")) {                ultralight = true;                LogUtil.i(MyConstant.TAG, TAG_ASSIST + "supportedTechs is:ultralight");            } else if (tech.equals("android.nfc.tech.NfcA")) {                nfcA = true;                LogUtil.i(MyConstant.TAG, TAG_ASSIST + "supportedTechs is:NfcA");            } else if (tech.equals("android.nfc.tech.Ndef")                    || tech.equals("android.nfc.tech.NdefFormatable")) {                ndef = true;                LogUtil.i(MyConstant.TAG, TAG_ASSIST + "supportedTechs is:Ndef/NdefFormatable");            } else if (tech.equals("android.nfc.tech.MifareClassic")) {                LogUtil.i(MyConstant.TAG, TAG_ASSIST + "supportedTechs is:MifareClassic");            }        }        if (ultralight && nfcA && ndef) {            return true;        } else {            return false;        }    }
    /**     * enable TagWrite     */    private void enableForegroundDispatch() {        if (mNfcAdapter != null) {            mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);        }    }
    /**     * disable TagWrite     */    private void disableForegroundDispatch() {        if (mNfcAdapter != null) {            mNfcAdapter.disableForegroundDispatch(this);        }    }
    /**     * NFC Function Check By skyseraph 2013-2     */    private void checkNFCFunction() {        // TODO Auto-generated method stub        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);        // check the NFC adapter first        if (mNfcAdapter == null) {            // mTextView.setText("NFC apdater is not available");            Dialog dialog = null;            CustomDialog.Builder customBuilder = new CustomDialog.Builder(mContext);            customBuilder                    .setTitle(getString(R.string.inquire))                    .setMessage(getString(R.string.nfc_notice2))                    .setIcon(R.drawable.dialog_icon2)                    .setNegativeButton(getString(R.string.no),                            new DialogInterface.OnClickListener() {                                public void onClick(DialogInterface dialog, int which) {                                    dialog.dismiss();                                    finish();                                }                            })                    .setPositiveButton(getString(R.string.yes),                            new DialogInterface.OnClickListener() {                                public void onClick(DialogInterface dialog, int which) {                                    dialog.dismiss();                                    finish();                                }                            });            dialog = customBuilder.create();            dialog.setCancelable(false);// back            dialog.setCanceledOnTouchOutside(false);            SetDialogWidth(dialog).show();            return;        } else {            if (!mNfcAdapter.isEnabled()) {                Dialog dialog = null;                CustomDialog.Builder customBuilder = new CustomDialog.Builder(mContext);                customBuilder                        .setTitle(getString(R.string.inquire))                        .setMessage(getString(R.string.nfc_notice3))                        .setIcon(R.drawable.dialog_icon2)                        .setNegativeButton(getString(R.string.no),                                new DialogInterface.OnClickListener() {                                    public void onClick(DialogInterface dialog, int which) {                                        dialog.dismiss();                                        finish();                                    }                                })                        .setPositiveButton(getString(R.string.yes),                                new DialogInterface.OnClickListener() {                                    public void onClick(DialogInterface dialog, int which) {                                        dialog.dismiss();                                        Intent setnfc = new Intent(                                                Settings.ACTION_WIRELESS_SETTINGS);                                        // Intent setnfc = new                                        // Intent(Settings.ACTION_NFC_SETTINGS);                                        startActivity(setnfc);                                    }                                });                dialog = customBuilder.create();                dialog.setCancelable(false);// back                dialog.setCanceledOnTouchOutside(false);                SetDialogWidth(dialog).show();                return;            }        }    }
    /**     * @param dialog     * @return     */    private Dialog SetDialogWidth(Dialog dialog) {        DisplayMetrics dm = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(dm);        int screenWidth = dm.widthPixels;        int screenHeight = dm.heightPixels;        WindowManager.LayoutParams params = dialog.getWindow().getAttributes();        if (screenWidth > screenHeight) {            params.width = (int)(((float)screenHeight) * 0.875);
        } else {            params.width = (int)(((float)screenWidth) * 0.875);        }        dialog.getWindow().setAttributes(params);
        return dialog;    }
    /**     *********************************************************************** @Title :WriteNdefTag.java     * @Package :skyseraph.nfc_demo.tag.write     * @ClassName : WriteTask     * @Description : TODO     * @author : skyseraph00@163.com     * @date : 2013-9-13 上午11:38:58     * @version : V1.0     */    static class WriteTask extends AsyncTask<Void, Void, Void> {        Activity host = null;
        NdefMessage msg = null;
        Tag tag = null;
        String text = null;
        WriteTask(Activity host, NdefMessage msg, Tag tag) {            LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into WriteTask AsyncTask");            this.host = host;            this.msg = msg;            this.tag = tag;        }
        @Override        protected Void doInBackground(Void... arg0) {            int size = msg.toByteArray().length;
            try {                Ndef ndef = Ndef.get(tag);
                if (ndef == null) {                    NdefFormatable formatable = NdefFormatable.get(tag);                    if (formatable != null) {                        try {                            formatable.connect();                            try {                                formatable.format(msg);                            } catch (Exception e) {                                text = "Failed to format tag,Tag refused to format";                            }                        } catch (Exception e) {                            text = "Failed to connect tag,Tag refused to connect";                        } finally {                            formatable.close();                        }                    } else {                        text = "NDEF is not supported in this Tag";                    }                } else {                    ndef.connect();
                    try {                        if (!ndef.isWritable()) {                            text = "Tag is read-only";                        } else if (ndef.getMaxSize() < size) {                            text = "The data cannot written to tag,Message is too big for tag,Tag capacity is "                                    + ndef.getMaxSize() + " bytes, message is " + size + " bytes.";                        } else {                            ndef.writeNdefMessage(msg);                            text = "Message is written tag, message=" + msg;                        }                    } catch (Exception e) {                        text = "Tag refused to connect";                    } finally {                        ndef.close();                    }                }            } catch (Exception e) {                text = "Write opreation is failed,General exception: " + e.getMessage();                LogUtil.i(MyConstant.TAG, TAG_ASSIST                        + "Exception when writing tag,Write opreation is failed" + text);            }
            return (null);        }
        @Override        protected void onPostExecute(Void unused) {            if (text != null) {                Toast.makeText(host, text, Toast.LENGTH_SHORT).show();            }
            // host.finish(); // after writed, auto finish        }    }}
标签:name uri array script spinner val for throw manage
原文地址:http://www.cnblogs.com/jyycnblogs/p/6035277.html