| 对比项 | NFC | 蓝牙 | 红外 |
|---|---|---|---|
| 网络类型 | 点对点 | 单点对多点 | 点对点 |
| 有效距离 | <=0.1m | <=10m,最新的蓝牙4.0有效距离可达100m | 一般在1m以内,热技术连接,不稳定 |
| 传输速度 | 最大424kbps | 最大24Mbps | 慢速115.2kbps,快速4Mbps |
| 建立时间 | <0.1s | 6s | 0.5s |
| 安全性 | 安全,硬件实现 | 安全,软件实现 | 不安全,使用IRFM时除外 |
| 通信模式 | 主动-主动/被动 | 主动-主动 | 主动-主动 |
| 成本 | 低 | 中 | 低 |
<uses-sdk android:minSdkVersion="14"/> <uses-permission android:name="android.permission.NFC" /> <!-- 要求当前设备必须要有NFC芯片 --> <uses-feature android:name="android.hardware.nfc" android:required="true" />
<activity android:name=".TagTextActivity" android:launchMode="singleTop"/>
/**
* 1.子类需要在onCreate方法中做Activity初始化。
* 2.子类需要在onNewIntent方法中进行NFC标签相关操作。
* 当launchMode设置为singleTop时,第一次运行调用onCreate方法,
* 第二次运行将不会创建新的Activity实例,将调用onNewIntent方法
* 所以我们获取intent传递过来的Tag数据操作放在onNewIntent方法中执行
* 如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())
* 只要NFC标签靠近就执行
*/
public class BaseNfcActivity extends AppCompatActivity {
private NfcAdapter mNfcAdapter;
private PendingIntent mPendingIntent;
/**
* 启动Activity,界面可见时
*/
@Override
protected void onStart() {
super.onStart();
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
//一旦截获NFC消息,就会通过PendingIntent调用窗口
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);
}
/**
* 获得焦点,按钮可以点击
*/
@Override
public void onResume() {
super.onResume();
//设置处理优于所有其他NFC的处理
if (mNfcAdapter != null)
mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
}
/**
* 暂停Activity,界面获取焦点,按钮可以点击
*/
@Override
public void onPause() {
super.onPause();
//恢复默认状态
if (mNfcAdapter != null)
mNfcAdapter.disableForegroundDispatch(this);
}
}
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(tag);
ndef.writeNdefMessage(ndefMessage);
public class RunAppActivity extends BaseNfcActivity{
private String mPackageName = "com.android.mms";//短信
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onNewIntent(Intent intent) {
if (mPackageName == null)
return;
//1.获取Tag对象
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
writeNFCTag(detectedTag);
}
/**
* 往标签写数据的方法
*
* @param tag
*/
public void writeNFCTag(Tag tag) {
if (tag == null) {
return;
}
NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord
.createApplicationRecord(mPackageName)});
//转换成字节获得大小
int size = ndefMessage.toByteArray().length;
try {
//2.判断NFC标签的数据类型(通过Ndef.get方法)
Ndef ndef = Ndef.get(tag);
//判断是否为NDEF标签
if (ndef != null) {
ndef.connect();
//判断是否支持可写
if (!ndef.isWritable()) {
return;
}
//判断标签的容量是否够用
if (ndef.getMaxSize() < size) {
return;
}
//3.写入数据
ndef.writeNdefMessage(ndefMessage);
Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
} else { //当我们买回来的NFC标签是没有格式化的,或者没有分区的执行此步
//Ndef格式类
NdefFormatable format = NdefFormatable.get(tag);
//判断是否获得了NdefFormatable对象,有一些标签是只读的或者不允许格式化的
if (format != null) {
//连接
format.connect();
//格式化并将信息写入标签
format.format(ndefMessage);
Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "写入失败", Toast.LENGTH_SHORT).show();
}
}
} catch (Exception e) {
}
}
}
//直接接受一个Uri public NdefRecord createUri(String uriString); //接受一个Uri的对象 public NdefRecord createUri(Uri uri);
NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord
.createApplicationRecord(mPackageName)});
NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord
.createUri(Uri.parse(
8
0x08
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程素材网。
- 全部评论(0)
- 商品推荐
机械节能产品生产企业官网模板...
¥20.00
大气智能家居家具装修装饰类企业通用网站模板...
¥20.00
礼品公司网站模板
¥25.00
宽屏简约大气婚纱摄影影楼模板...
¥25.00
蓝白WAP手机综合医院类整站源码(独立后台)...
¥25.00
苏ICP备2024110244号-2
苏公网安备32050702011978号
增值电信业务经营许可证编号:苏B2-20251499
| Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部