• Easy Tag Write(1)


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

  • 相关阅读:
    数据处理——时间数据处理
    数据处理——异常值检测
    数据处理——缺失值处理
    数据分析——数据校验
    Python之Pandas知识点
    Python基础知识之疑点难点
    Python习题(第3课)
    跳一跳小外挂(附完整代码)
    《软件工程》实训报告
    用户使用手册与测试报告(团队作业)
  • 原文地址:https://www.cnblogs.com/jyycnblogs/p/6035277.html
Copyright © 2020-2023  润新知