基本信息
源码名称:android nfc EasyTagWrite示例源码下载
源码大小:2.39M
文件格式:.zip
开发语言:Java
更新时间:2014-03-20
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
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();
// 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
}
}
}