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

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

Easy Tag Write(1)的更多相关文章

  1. Easy Tag Write(3.3)

    package skyseraph.android.util; /** * @Title : Constant.java * @Package : tcl.nfc.tv.util * @ClassNa ...

  2. Easy Tag Write(3.2)

    package skyseraph.android.util; /** * @Title : LogUtil.java * @Package : tcl.nfc.phone.util * @Class ...

  3. Easy Tag Write(2)

    package skyseraph.android.util.nfc; import com.google.common.collect.BiMap; import com.google.common ...

  4. Easy Tag Write(3.1)

    package skyseraph.android.util; import skyseraph.easytagwrite.R; import android.app.Dialog; import a ...

  5. [LeetCode] 70. Climbing Stairs_ Easy tag: Dynamic Programming

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  6. [LeetCode] 437. Path Sum III_ Easy tag: DFS

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  7. [LeetCode] 257. Binary Tree Paths_ Easy tag: DFS

    Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...

  8. [LeetCode] 101. Symmetric Tree_ Easy tag: BFS

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  9. JUnit5学习之五:标签(Tag)和自定义注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. [软件推荐]Windows文件夹多标签工具Clover

    Clover 是 Windows Explorer 资源管理器的一个扩展,为其增加类似谷歌 Chrome 浏览器的多标签页功能,目前最新版本为:3.1.7 Clover 把 Chrome 标签页有的样 ...

  2. 关于rc.local

    1.rc.loacl的启动 /etc/rc.d/rc.local

  3. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  4. 指针与数组的区别 —— 《C语言深度剖析》读书心得

    原书很多已经写的很清楚很精炼了,我也无谓做无意义的搬运,仅把一些基础和一些我自己以前容易搞混的地方写一下. 1. 意义: 指针: 指针也是一种类型,长度为4字节,其存放的内容只能是一个地址(4字节). ...

  5. ccf模板生成

    问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的.例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 而当用户为 Jerr ...

  6. linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作

    一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...

  7. 数据库使用数据泵迁移遇到LOB字段

    impdp system/Clic1234 attach=SYS_IMPORT_ILEARN_TRA desc ILEARN_TRA.NOTIFI_TACTIC desc ILEARN_TRA.MSG ...

  8. .net web 小基累

    获取当前网站的根目录:HttpContext.Current.Request.PhysicalApplicationPath+“Content”

  9. 加快ArcGIS Server创建缓存速度,CachingTools的实例数

    大比例尺的缓存,由于文件非常大,创建非常花费时间,在硬件设备已固定的情况下,调整Caching tools的实例数是加快创建缓存的方法之一. 简单来说:CachingTools的最大并行实例数决定了C ...

  10. 老司机带你走进Core Animation

    为什么时隔这么久我又回来了呢? 回来圈粉. 开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理.不过既然我现在回来了,那么这将是一个井喷的 ...