Android NFC技术(三)——初次开发Android NFC你须知道NdefMessage和NdefRecord
Android NFC技术(三)——初次开发Android NFC你须知道NdefMessage和NdefRecord
这最近也是有好多天没写博客了,除了到处张罗着搬家之外,依旧还是许许多多的琐事阻碍着学习,加上使用NFC开发,也是需要具有NFC功能的测试机,也到买了一个,所以,也说了两天的概念
Android NFC开发(一)——初探NFC,了解当前前沿技术
Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法
今天,咋们就来用一个小栗子做药引,一起进入Android NFC开发的世界,首先,你必须要知道的是这两个类
- NdefMessage
- NdefRecord
NdefMessage
主要是描述NDEF格式的信息
NdefRecord
这个是秒速NDEF信息的一个信息段
这两个都是Android NCF技术的核心类,无论是读写NFC标签还是通过Android Beam技术传递数据都需要这两个类
开发步骤
1.获取Tag对象
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
2.判断NFC标签的数格式
Ndef ndef = Ndef.get(tag);
3.写入数据
ndef.wrriteNdefMessage(ndefMessage);
准备工作都做好了,我们就直接来写程序了,我们新建一个程序——NFCDemo
我们的需求是这样的:我们的软件把手机上所有安装好的应用排列,然后我们点击一个就开始拿着这个软件,等我们的NFC标签靠近,就把软件写进去,然后,我们每次只要把NFC标签开进有NFC的手机上就会直接运行我们写入的程序了,这个原理有点儿类似门卡,你的先买一个NFC标签
然后我们就开始写了,大致的情况是这样的,我们主页有一个按钮,点击之后跳转到一个界面,是我们手机安装程序的包名列表,我们选中一个回到主Activity,然后等待NFC标签刷入,成功之后,我们就直接用NFC靠近手机就能启动这个程序了,跟门卡登记,然后开门的道理是一样的
主页是这样的
我们点击之后跳转到ListActivity
ListActivity
package com.lgl.nfcdemo;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* 读取手机软件列表
*
* @author LGL
*/
public class ListActivity extends android.app.ListActivity implements
AdapterView.OnItemClickListener {
//返回码
private static final int CODE = 1;
//封装所有软件
private List<String> mPackage = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//这里继承了ListActivity显示列表,不需要加载layout
//获取手机上所有的包
PackageManager manager = getPackageManager();
//把他们装起来
List<PackageInfo> packageInfos = manager.getInstalledPackages(PackageManager.GET_ACTIVITIES);
//遍历
for (PackageInfo pi : packageInfos) {
//添加软件名和包名
mPackage.add(pi.applicationInfo.loadLabel(manager) + "\n" + pi.packageName);
}
//官方的适配器
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, mPackage);
setListAdapter(arrayAdapter);
//设置单击事件
getListView().setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent();
intent.putExtra("package", mPackage.get(i));
setResult(CODE,intent);
finish();
}
}
这段代码应该清晰易懂吧,继承lListActivity,获取手机的应用排列,点击之后携带包名finish();
MainActivity
package com.lgl.nfcdemo;
import android.app.PendingIntent;
import android.content.Intent;
import android.nfc.FormatException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.gms.common.api.GoogleApiClient;
import java.io.IOException;
/**
* NFC读写
* Created by lgl on 16/3/1.
*/
public class MainActivity extends AppCompatActivity {
private Button btn_list;
//选中的包名
private String mPackNmae;
private NfcAdapter mNfcAdapter;
private PendingIntent mPendingIntent;
private GoogleApiClient client;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_list = (Button) findViewById(R.id.btn_list);
//初始化NfcAdapter
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
//初始化PendingIntent
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);
//点击跳转
btn_list = (Button) findViewById(R.id.btn_list);
btn_list.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,ListActivity.class);
startActivityForResult(intent,1);
}
});
}
//当设置android:launchMode="singleTop"时调用
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//没有选择的话就不执行操作了
if (mPackNmae == null) {
return;
}
//1.获取Tag对象
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
//写入程序
writeNFC(tag);
}
//NFC写入
private void writeNFC(Tag tag) {
//null不执行操作,强调写程序的逻辑性
if (tag == null) {
return;
}
NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord.createApplicationRecord(mPackNmae)});
//获得写入大小
int size = ndefMessage.toByteArray().length;
//2.判断是否是NDEF标签
try {
Ndef ndef = Ndef.get(tag);
if(ndef != null) {
//说明是NDEF标签,开始连接
ndef.connect();
//判断是否可写
if(!ndef.isWritable()){
Toast.makeText(this, "当前设备不支持写入",Toast.LENGTH_LONG).show();
return;
}
//判断大小
if(ndef.getMaxSize() < size){
Toast.makeText(this, "容量太小了",Toast.LENGTH_LONG).show();
return;
}
//写入
try {
ndef.writeNdefMessage(ndefMessage);
Toast.makeText(this, "写入成功",Toast.LENGTH_LONG).show();
} catch (FormatException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
//使当前窗口置顶,权限高于三重过滤
@Override
protected void onResume() {
super.onResume();
if (mNfcAdapter != null) {
//设置当前activity为栈顶
mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
}
}
@Override
protected void onPause() {
super.onPause();
//恢复栈
if (mNfcAdapter != null) {
mNfcAdapter.disableForegroundDispatch(this);
}
}
}
这里东西多了点,不过仔细看会发现,也就是一些判断,真正的关键代码就那几句,
layout_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<Button
android:layout_marginTop="15dp"
android:id="@+id/btn_list"
android:layout_width="200dp"
android:layout_height="45dp"
android:text="绑定应用程序"
android:layout_gravity="center_horizontal" />
<TextView
android:gravity="center_horizontal"
android:textSize="14sp"
android:text="你可以将NFC标签靠近手机背部"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:layout_weight="1"
android:background="@mipmap/nfc"
android:layout_width="match_parent"
android:layout_height="0dp" />
</LinearLayout>
我们来简单的运行一下
然后我们靠近NFC就算写入成功了,以后我们只要拿着NFC靠近手机就自动打开我们写入的那个程序了,原理和门卡有点类似,下节接着讲NFC和网络交互的那些事
Demo下载:http://download.csdn.net/detail/qq_26787115/9457135
Android NFC技术(三)——初次开发Android NFC你须知道NdefMessage和NdefRecord的更多相关文章
- 【转】android 电池(三):android电池系统
关键词:android电池系统电池系统架构 uevent power_supply驱动 平台信息: 内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV3 ...
- Xamarin Android教程如何使用Xamarin开发Android应用
Xamarin Android教程如何使用Xamarin开发Android应用 在了解了Xamarin和Andriod系统之后,下面我们需要了解一下如何使用这些工具和系统来开发我们的应用程序. And ...
- android 电池(三):android电池系统【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/8709838 一.电池系统结构 Android中的电池使用方式主要有三种:AC.USB. ...
- Android笔记--Bitmap(三) 针对不用Android版本的位图管理
Bitmap(三) | Android不同版本的相应操作 在不同的Android版本中.位图的存储方式是不同的. 1.小于等于 Android 2.2 (API level 8) 垃圾收集器回收内存时 ...
- Android笔记(三十三) Android中线程之间的通信(五)Thread、Handle、Looper和MessageQueue
ThreadLocal 往下看之前,需要了解一下Java的ThreadLocal类,可参考博文: 解密ThreadLocal Looper.Handler和MessageQueue 我们分析一下之前的 ...
- Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息
先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest; import android.app.Activity; import and ...
- Android笔记(三十) Android中线程之间的通信(二)Handler消息传递机制
什么是Handler 之前说过了,Android不允许主线程(MainThread)外的线程(WorkerThread)去修改UI组件,但是又不能把所有的更新UI的操作都放在主线程中去(会造成ANR) ...
- Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)
一.搭建Android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 下载地址:Eclipse:http://www.eclipse.org/downloads/ ...
- C#使用Xamarin开发Android应用程序 -- 系列文章
Xamarin开发Android应用程序 利用Xamaria构建Android应用-公交发车信息屏 Xamarin版的C# SVG路径解析器 C#使用Xamarin开发可移植移动应用(1.入门与Xam ...
随机推荐
- android 图片网络下载github开源框架之Universal-Image-Loader
最近在做妙趣剪纸项目,剪纸应用项目链接.发扬传统文化,大家多多关注. 需要自己搭建服务器,我用的是新浪sae,简直秒杀京东云几条街,把图片放在网上下载,但是图片经常下载要遇到很多问题,包括oom等.所 ...
- Java之String类型详解
字符串的特点 A:字符串一旦被赋值,就不能改变. 注意:这里指的是字符串的内容不能改变,而不是引用不能改变. B:字面值作为字符串对象和通过构造方法创建对象的不同 String s = new Str ...
- XMPP(一)-openfire服务端的安装和搭建
XMPP全称:可扩展通讯和表示协议 简介:可扩展通讯和表示协议 (XMPP) 可用于服务类实时通讯.表示和需求响应服务中的XML数据元流式传输.XMPP以Jabber协议为基础,而Jabber是即时通 ...
- 【安卓开发】Facebook工程师是如何改进他们Android客户端的
原文出处: Facebook 译文出处:penkzhou 欢迎分享原创到伯乐头条 作为世界上最大的社交网络,Facebook的Android客户端面临着各种各样的使用环境(地理环境.Andro ...
- Struts 1 之<bean>标签库
<bean:write>标签 <bean:write>能输出request.session.application.page四个域中能访问到的变量,与EL表达式不同的是,如果变 ...
- android 选项卡TabHost
选项卡主要有TabHost.TabWiget和 FramentLayout3个组件组成,用于实现一个多标签的用户界面,通过他可以将一个复杂的对话分隔成若干个标签页,实现对信息的分类显示和管理.使用给组 ...
- 14 Fragment 注意点
API 过时问题 API 23过时 public void onAttach(Activity activity)替换为public void onAttach(Context context) 注意 ...
- Linux2.6--Linus电梯
内核为了处理来自IO层的请求,需要进行相应的优化,因为当请求很多时,且请求的块又都几种在一块,那么如果按照顺序处理这些请求无疑是很大的时间开销,所以,我们需要寻求方法来处理这种情况(当然, ...
- Android初级教程进程间的通信AIDL
在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activi ...
- Java-IO之PrintWriter(字符打印输出流)
PrintWriter是字符类型的打印输出流,继承于Writer,用于向文本输出流打印对象的格式化表示形式. PrintWriter的主要函数: PrintWriter(OutputStream ou ...