Android NFC标签写入网址,感应到标签访问网页
首先在AndroidManifest.xml文件中添加如下配置<!-- SDK版本至少为14 --><uses-sdk android:minSdkVersion="14"/><!-- 添加NFC权限 --><uses-permission android:name="android.permission.NFC" /><!-- ...
·
首先在AndroidManifest.xml文件中添加如下配置
<!-- SDK版本至少为14 -->
<uses-sdk android:minSdkVersion="14"/>
<!-- 添加NFC权限 -->
<uses-permission android:name="android.permission.NFC" />
<!-- 要求当前设备必须要有NFC芯片 -->
<uses-feature android:name="android.hardware.nfc" android:required="true" />
然后创建一个NFC写标的类MainActivity
NFC主要相关类有NdefMessage、NdefRecord、Ndef、NdefFormatable,具体使用方法见如下代码及注释
package com.xindecoiot.nfcreadinfo;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.nfc.tech.NdefFormatable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private NfcAdapter mNfcAdapter;
private PendingIntent mPendingIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
super.onStart();
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
// 用于感应到NFC时启动该Activity
// 这里建议将处理NFC的子类的launchMode设置成singleTop模式,这样感应到标签时就会回调onNewIntent,而不会重复打开页面
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();
// 当页面不可见时,NFC标签不交给当前页面处理
if (mNfcAdapter != null) {
mNfcAdapter.disableForegroundDispatch(this);
}
}
// 将Activity的launchMode设置成singleTop,这样当感应到NFC标签时不会重复打开页面,而是回调该方法
@Override
public void onNewIntent(Intent intent) {
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
writeTag(detectedTag);
}
/**
* 写标
* @param tag
*/
public void writeTag(Tag tag) {
if (tag == null) {
return;
}
// 根据网址创建待写入的数据
NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord
.createUri(Uri.parse("https://www.himmy.cn"))});
// 获取内容字节大小
int size = ndefMessage.toByteArray().length;
try {
// 获取Nedf
Ndef ndef = Ndef.get(tag);
// 不为空表示该标签为Nedf格式
if (ndef != null) {
ndef.connect();
// 是否可写
if (!ndef.isWritable()) {
Toast.makeText(this, "标签不支持写入", Toast.LENGTH_SHORT).show();
return;
}
// 判断写入内容大小是否超出允许写入的最大值
if (ndef.getMaxSize() < size) {
Toast.makeText(this, "写入内容过大", Toast.LENGTH_SHORT).show();
return;
}
// 写入数据
ndef.writeNdefMessage(ndefMessage);
Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
} else { // 标签非Nedf格式的情况
NdefFormatable format = NdefFormatable.get(tag);
// 不为空表示该标签允许格式化成Ndef格式
if (format != null) {
format.connect();
// 格式化并写入Nedf内容
format.format(ndefMessage);
Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "标签不支持Nedf格式", Toast.LENGTH_SHORT).show();
}
}
} catch (Exception e) {
}
}
}
最后记得把MainActivity的启动模式设置成singleTop
<activity
android:name=".MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
测试
- 首先准备一台支持NFC功能的手机,打开我们写好的应用
- 准备一张NFC标签,靠近手机NFC读取区域(一般在背部)
- 提示写入成功后,关闭应用
- 再次将NFC标签靠近手机,将会提示访问我们写入标签的网页,点击确认就会打开浏览器访问该网页
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献17条内容
所有评论(0)