android tag 快捷_Android NFC读写Tag快速框架

这篇文章只讲NFC读写非接卡、读写标签的方式,且这里只讲符合TypeA和IsoDep技术标准的Tag,其他类型的Tag框架类似,只是有些许差别

添加权限

AndroidManifests.xml中添加:

添加intent filter

AndroidManifests.xml中添加:

android:name=".MainActivity"

android:label="@string/app_name"

android:launchMode="singleTask"

android:screenOrientation="portrait"

android:windowSoftInputMode="adjustUnspecified|stateHidden">

android:name="android.nfc.action.TECH_DISCOVERED"

android:resource="@xml/nfc_tech_filter"/>

添加过滤列表

res/xml文件夹下新建nfc_tech_filter.xml:

android.nfc.tech.IsoDep

android.nfc.tech.NfcA

Activity

先直接贴代码:

public class MainActivity extends AppCompatActivity {

// NFC相关

private NfcAdapter nfcAdapter;

private PendingIntent pendingIntent;

public static String[][] TECHLISTS; //NFC技术列表

public static IntentFilter[] FILTERS; //过滤器

static {

try {

TECHLISTS = new String[][] { { IsoDep.class.getName() }, { NfcA.class.getName() } };

FILTERS = new IntentFilter[] { new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED, "*/*") };

} catch (Exception ignored) {

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

nfcAdapter = NfcAdapter.getDefaultAdapter(this);

pendingIntent = PendingIntent.getActivity(this, 0,

new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

onNewIntent(getIntent());

}

//处理NFC触发

@Override

protected void onNewIntent(Intent intent) {

//从intent中获取标签信息

Parcelable p = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

if (p != null) {

Tag tag = (Tag) p;

isodep = IsoDep.get(tag);

if (isodep != null){

isoDep.connect(); // 建立连接

byte[] data = new byte[20];

byte[] response = isoDep.transceive(data); // 传送消息

isoDep.close(); // 关闭连接

}

}

}

//程序恢复

@Override

protected void onResume() {

super.onResume();

if (nfcAdapter != null) {

// 这行代码是添加调度,效果是读标签的时候不会弹出候选程序,直接用本程序处理

nfcAdapter.enableForegroundDispatch(this, pendingIntent, FILTERS, TECHLISTS);

}

}

//程序暂停

@Override

protected void onPause() {

if (nfcAdapter != null)

nfcAdapter.disableForegroundDispatch(this); // 取消调度

}

}

使用NFC读写Tag主要流程是:

设置系统调度 -> 系统调用onNewIntent(Intent intent) -> 获取Tag -> 获取读写通道 -> 进行读写 -> 最后取消系统调度

读写Tag流程:

建立连接

读写

关闭连接

需要注意的是有些卡片关闭连接后再次建立连接会重置内部状态,具体参照卡片特性来定具体的读写方式。

附一张系统的调度图:

nfc_tag_dispatch.png

参考链接

Tag的使用 package com.yarin.android.qiehuan; import android.app.AlertDialog; import android.app.Dialog; import android.app.TabActivity; import android.content.DialogInterface; import android.graphics.Color; import android.os.Bundle; import android.widget.TabHost; import android.widget.TabHost.OnTabChangeListener; public class Activity01 extends TabActivity { //声明TabHost对象 TabHost mTabHost; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //取得TabHost对象 mTabHost = getTabHost(); /* 为TabHost添加标签 */ //新建一个newTabSpec(newTabSpec) //设置其标签和图标(setIndicator) //设置内容(setContent) mTabHost.addTab(mTabHost.newTabSpec("test1") .setIndicator("TAB 1",getResources().getDrawable(R.drawable.img1)) .setContent(R.id.textview1)); mTabHost.addTab(mTabHost.newTabSpec("test2") .setIndicator("TAB 2",getResources().getDrawable(R.drawable.img2)) .setContent(R.id.textview2)); mTabHost.addTab(mTabHost.newTabSpec("test3") .setIndicator("TAB 3",getResources().getDrawable(R.drawable.img3)) .setContent(R.id.textview3)); //设置TabHost的背景颜色 mTabHost.setBackgroundColor(Color.argb(150, 22, 70, 150)); //设置TabHost的背景图片资源 //mTabHost.setBackgroundResource(R.drawable.bg0); //设置当前显示哪一个标签 mTabHost.setCurrentTab(0); //标签切换事件处理,setOnTabChangedListener mTabHost.setOnTabChangedListener(new OnTabChangeListener() { // TODO Auto-generated method stub @Override public void onTabChanged(String tabId) { Dialog dialog = new AlertDialog.Builder(Activity01.this) .setTitle("善谢谢提醒") .setMessage("现在选中了:"+tabId+"标签") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.cancel(); } }).create();//创建按钮 dialog.show(); } }); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值