编写NFC程序的基本步骤

1)设置权限,限制Android版本、安装的设备:

1
2
3
4
<uses-sdk android:minSdkVersion="14"/>
<uses-permission android:name="android.permission.NFC" />
<!-- 要求当前设备必须要有NFC芯片 -->
<uses-feature android:name="android.hardware.nfc" android:required="true"

public class NfcManager {

private NfcAdapter mNfcAdapter;
private boolean mEnabled;
private WeakReference<Activity> mActivityWeakReference;
private MessageListener mMessageListener;
private NfcAdapter.ReaderCallback mReaderCallback = new NfcAdapter.ReaderCallback() {
@Override
public void onTagDiscovered(Tag tag) {
processTag(tag);
}
};

private NfcManager(NfcAdapter nfcAdapter) {
mNfcAdapter = nfcAdapter;
}
public static NfcManager get(Context context) {
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(context);
if (nfcAdapter != null) {
return new NfcManager(nfcAdapter);
} else {
return null;
}
}
/**
* 设备是否支持nfc
*/
public static boolean testSupportNfc(Context context) {
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(context);
if (nfcAdapter == null) {
T.showShort(InspectionApplication_.getApplication(), Tools.getStringValue(
InspectionApplication_.getApplication(), R.string.dialog_not_support_NFC));
return false;
}
if (!nfcAdapter.isEnabled()) {
T.showShort(InspectionApplication_.getApplication(), Tools.getStringValue(
InspectionApplication_.getApplication(), R.string.please_open_nfc));
context.startActivity(new Intent("android.settings.NFC_SETTINGS"));
return false;
}
return true;
}
public synchronized boolean enable(Activity activity, MessageListener listener) {
if (mEnabled) {
return true;
}
if (!mNfcAdapter.isEnabled()) {
return false;
}
mNfcAdapter.enableReaderMode(activity, mReaderCallback, NfcAdapter.FLAG_READER_NFC_A, null);
mActivityWeakReference = new WeakReference<>(activity);
mMessageListener = listener;
mEnabled = true;
return true;
}
public synchronized boolean disable(Activity activity) {
if (!mEnabled) {
return true;
}
if (activity != mActivityWeakReference.get()) {
return false;
}
mNfcAdapter.disableReaderMode(activity);
mActivityWeakReference.clear();
mActivityWeakReference = null;
mMessageListener = null;
mEnabled = false;
return true;
}
private void processTag(Tag tag) {
try {
List<String> techs = Arrays.asList(tag.getTechList());
if (!techs.contains("android.nfc.tech.Ndef")) {
Log.e("NDEF not included");
return;
}
String msg = "BEGIN:VCARD\n" + "VERSION:2.1\n" + "中国湖北省武汉市\n"
+ "武汉大学计算机学院\n" + "END:ABCDE";
byte[] textBytes = msg.getBytes();
//将字节数组封装到一个NdefRecord实例中去
NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
NdefRecord.RTD_TEXT, new byte[] {}, textBytes);
//新建NdefRecord数组,本例中数组只有一个元素
NdefRecord[] records2 = {textRecord};
//新建一个NdefMessage实例
NdefMessage message = new NdefMessage(records2);

Ndef ndef2 = Ndef.get(tag);
// 打开连接
ndef2.connect();
// 写入NDEF信息
ndef2.writeNdefMessage(message);
// 关闭连接
ndef2.close();
Ndef ndef = Ndef.get(tag);
NdefMessage ndefMessage = ndef.getCachedNdefMessage();
NdefRecord[] records = ndefMessage.getRecords();
if (records == null || records.length == 0) {
KLog.e("NDEF record not found");
return;
}
NdefRecord record = records[0];
final String textType = "text/plain";
if (!record.toMimeType().equals(textType)) {
Log.e("NDEF record is not " + textType);
return;
}
if (mMessageListener == null) {
return;
}
byte[] payload = record.getPayload();
byte length = payload[0];
int start = 1 + length;
mMessageListener
.onMessage(new String(Arrays.copyOfRange(payload, start, payload.length)));
} catch (Exception e) {
Log.e(e);
}
}
public interface MessageListener {
void onMessage(String message);
}

}
/////////////////////////////////

NFCSActivity

onResume(){

closeToNfc()

}

public void closeToNfc() {
if (!NfcManager.testSupportNfc(mContext)) {
return;
}
final NfcManager manager = NfcManager.get(mContext);
if (manager == null) {
return;
}
final DataWrapper<AlertDialog> dataWrapper = new DataWrapper<>();
final NfcManager.MessageListener listener = new NfcManager.MessageListener() {
@Override
public void onMessage(final String message) {
Message msg=new Message();
msg.what=1;
msg.obj=message;
handler.sendMessage(msg);

}
};
manager.enable(mContext, listener);

}
///////////////////////////////
LinearLayout rootlayout = new LinearLayout(mContext);
rootlayout.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
UnitUtils.dip2px(mContext, 48)));
rootlayout.setOrientation(LinearLayout.HORIZONTAL);
TextView text_Name = new TextView(mContext);
LinearLayout.LayoutParams text_Name_Params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
text_Name.setLayoutParams(text_Name_Params);
text_Name.setId(View.generateViewId());
text_Name.setText(R.string.activity_nfc_id);
rootlayout.addView(text_Name);

EditText et_name = new EditText(mContext);
LinearLayout.LayoutParams et_Name_Params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
et_name.setLayoutParams(et_Name_Params);
et_name.setId(View.generateViewId());
et_name.setMaxLines(1);
if(msg.obj!=null){
et_name.setText(msg.obj.toString());
mNFCs.add(msg.obj.toString());
}
et_name.setSelection(et_name.getText().length());
rootlayout.addView(et_name);
linear.addView(rootlayout);

}

}
};

NFC读写电子便签总结的更多相关文章

  1. Android再学习-便签开发小结-20141119

    这几天的便签开发,首先遇到的问题就是数据库操作问题.现在已经可以读写数据库了,并能将数据放在正确的位置显示. 专门建立了一个数据库操作的包,命名为"...database".新建一 ...

  2. Android自动化测试 - MonkeyRunner(二) 锤子便签测试脚本

    来源于:http://testerhome.com/topics/878 # encoding=utf-8 #导入python中自带的time模块和sys模块,脚本中都要用到它们. import ti ...

  3. 20151217JS便签

    JS便签: 根据一个数值来改变Repeater行数的颜色 <script type="text/javascript"> var query = document.ge ...

  4. win7桌面便签。自带的

    新建WIN7下的桌面便签小程序 桌面—>新建 快捷方式-> 输入%windir%\system32\StikyNot.exe

  5. ios UIWebView截获html并修改便签内容(转载)

    ios UIWebView截获html并修改便签内容 博客分类: iphone开发iphone开发phoneGap uiwebviewstringByEvaluatingJavaScriptFromS ...

  6. localStorage 便签功能实现

    之前利用localStorage写过手机便签应用,因为蛋疼的换了台三星的屌丝级手机,木 有了测试的工具,没能继续优化维护下去.而在网页上实现便签功能目前来说似乎没有太大 的意义,因为不论是 Firef ...

  7. Win8启用便签

    启动或显示 Sticky Notes : Win+R--->StikyNot.exe 备份Sticky Notes保存位置 : %AppData%\Microsoft\Sticky Notes\ ...

  8. 修复Windows7的便签问题

    工作的时候,喜欢利用Windows的附件“便签”,将自己要做的事情一一列在上面,显示在桌面上, 今天突然发现便签损坏,系统是元数据损坏,后来在网上查到解决方法,特此记录: 1. 以管理员身份运行 cm ...

  9. android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)

    如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...

随机推荐

  1. 【转】WPF自定义控件与样式(11)-等待/忙/正在加载状态-控件实现

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要有三种实现方式: 简单忙碌状态控件BusyBox: Win8/win10效果忙 ...

  2. python -- Pythonic

    所谓Pythonic,就是极具Python特色的Python代码(明显区别于其它语言的写法的代码) 总结如下: 两变量的内容交换 Python:a,b = b,a 非Python:t=a;a=b;b= ...

  3. redis实战 -- python知识散记

    -- time.time() -- row.to_dict() -- json.dumps(row.to_dict()) #!/usr/bin/env python import time def s ...

  4. Mysql Window 解压版 忘记密码

    1. 首先检查mysql服务是否启动,若已启动则先将其停止服务,可在开始菜单的运行,使用命令: net stop mysql 打开第一个cmd1窗口,切换到mysql的bin目录,运行命令: mysq ...

  5. Mac下,如何把项目托管到github

    以前一直使用的是svn,如下图: 附个下载链接:链接: https://pan.baidu.com/s/1nv6z5XJ 密码: pwqe:不太熟悉的小伙伴可以参考我写的一篇本地搭建svn服务器的博客 ...

  6. docker必须要sudo,但是sudo的话,又获得不了环境变量怎么办?

    方法1 sudo usermod -a -G docker $USER 方法2 sudo -E docker-compose ... 在sudo后面加上-E

  7. php冒泡排序详解笔记

    冒泡 /* * 冒泡排序(从小到大) * 介绍: * 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. * 思路: * 比较相邻的元素.如果第一个比第二个大,就交换他 ...

  8. ux.form.field.GridDate 支持快速选择日期的日期控件

    效果如图,亲测6.2.1版本可用 /** *支持快速选择日期的日期控件 */ Ext.define('ux.form.field.GridDate', { extend: 'Ext.form.fiel ...

  9. 11.7luffycity项目(2)

    2018-11-7 18:53:17 等把项目做完再发完整代码和github连接 这里只整理笔记和新学的知识点! 1.url的两种写法 urls.py from django.conf.urls im ...

  10. 把项目挂载到composer上

    1.打开composer的安装包列表网站,点击submit 2.把刚才初始化了composer的项目push到github上(至于怎么push,最简单就是用git了) 3.然后把github的网址复制 ...