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

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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(); } }); } }
Android NFC技术中的ISO-DEP协议(ISO 14443-4)提供了一种在NFC标签和Android设备之间进行通信的方式。以下是一个简单的ISO-DEP示例,您可以参考其中的代码实现。 首先,您需要在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.NFC"/> ``` 然后,在您的Activity类中,实现以下代码: ```java private NfcAdapter mAdapter; private PendingIntent mPendingIntent; private IsoDep mIsoDep; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAdapter = NfcAdapter.getDefaultAdapter(this); // 创建一个PendingIntent对象,用于在检测到标签时启动Activity mPendingIntent = PendingIntent.getActivity( this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); } @Override protected void onResume() { super.onResume(); // 检测NFC是否可用 if (mAdapter == null) { Toast.makeText(this, "NFC不可用", Toast.LENGTH_LONG).show(); return; } // 当前Activity在前台时,启动前台调度系统以检测标签 mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); } @Override protected void onPause() { super.onPause(); // 当前Activity不再处于前台时,停止前台调度系统 mAdapter.disableForegroundDispatch(this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 检测到标签时,获取IsoDep对象 if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); mIsoDep = IsoDep.get(tag); } // 如果获取到IsoDep对象,可以进行操作 if (mIsoDep != null) { try { mIsoDep.connect(); byte[] data = mIsoDep.transceive(new byte[] {0x00, 0x01, 0x02, 0x03}); // 发送一个命令并接收响应 Log.d("ISO-DEP", "取到的数据:" + Arrays.toString(data)); mIsoDep.close(); } catch (IOException e) { Log.e("ISO-DEP", "连接失败", e); } } } ``` 在这个示例中,我们使用了Android的前台调度系统来检测标签,并通过IsoDep对象进行操作。在onNewIntent()方法中,我们获取到IsoDep对象后,可以使用connect()方法连接标签,使用transceive()方法进行数据交换,最后使用close()方法关闭连接。 以上是一个简单的ISO-DEP示例,您可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值