首先在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处理的基类

public class BaseNfcActivity extends AppCompatActivity {private NfcAdapter mNfcAdapter;private PendingIntent mPendingIntent;@Overrideprotected void onStart() {super.onStart();mNfcAdapter = NfcAdapter.getDefaultAdapter(this);// 用于感应到NFC时启动该Activity// 这里建议将处理NFC的子类的launchMode设置成singleTop模式,这样感应到标签时就会回调onNewIntent,而不会重复打开页面mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);}/*** 获得焦点,按钮可以点击*/@Overridepublic void onResume() {super.onResume();// 设置当该页面处于前台时,NFC标签会直接交给该页面处理if (mNfcAdapter != null) {mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);}}/*** 暂停Activity,界面获取焦点,按钮可以点击*/@Overridepublic void onPause() {super.onPause();// 当页面不可见时,NFC标签不交给当前页面处理if (mNfcAdapter != null) {mNfcAdapter.disableForegroundDispatch(this);}}
}

然后创建一个NFC写标的类,继承BaseNfcActivity

NFC主要相关类有NdefMessage、NdefRecord、Ndef、NdefFormatable,具体使用方法见如下代码及注释

public class MainActivity extends BaseNfcActivity{private String mPackageName = "com.android.mms"; // 短信APP包名
//    private String mPackageName = "com.tencent.mm"; // 微信APP包名@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}// 将Activity的launchMode设置成singleTop,这样当感应到NFC标签时不会重复打开页面,而是回调该方法@Overridepublic 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.createApplicationRecord(mPackageName)});//        NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord
//                .createUri(Uri.parse("http://www.baidu.com"))});// 获取内容字节大小int size = ndefMessage.toByteArray().length;try {// 获取NedfNdef 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

<activityandroid:name=".MainActivity"android:launchMode="singleTop"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>

测试

  1. 首先准备一台支持NFC功能的手机,打开我们写好的应用
  2. 准备一张NFC标签,靠近手机NFC读取区域(一般在背部)
  3. 提示写入成功后,关闭应用
  4. 再次将NFC标签靠近手机,将会打开相应的应用(短信或者微信)

Android NFC标签写入应用包名,感应到标签自动打开应用相关推荐

  1. java怎么获取手机权限,Android 获取手机全部应用包名以及权限

    Android 获取手机所有应用包名以及权限 package gongzibai.co.cc; import java.util.List; import android.app.Activity; ...

  2. Android获取本机浏览器包名,并调用指定浏览器打开网页

    昨天还在嘀咕着项目快做完了,接下来公司会安排什么事,结果今天就给了我一个新任务,其中要做的一个功能就是指定调用谷歌浏览器打开网页,如果没有该浏览器就提示客户进行下载,查找一番资料后,觉得这种东西还是要 ...

  3. Android Studio 完美修改应用包名

    我们平时新建项目有些朋友可能当时就是随意写的一个包名,然后在项目过程中, 又感觉这个包名不太好,所以就要对包名进行修改,根据我们正常的修改方式,是这样的. 在种情况是只能修改最外层的那个名称, 如果我 ...

  4. Android部分应用市场和包名

    开发过程中,可能会遇到 "软件评分评价" ."调用系统工具"."跳转第三方应用" 等等的需求,要实现这些调用跳转需要相对应的应用包名才可以. ...

  5. 五 Android Studio打包Eegret App (包名和签名,打出正式包)

    一 定义包名 如下图,在AndroidManifest.xml中的package就是包名 二 创建keystore 选择Build->Generate Signed APK 选择create n ...

  6. Android在一个APP中通过包名或类名启动另一个APP

    开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用.一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通 ...

  7. Android获取第三方程序的包名

    前言 有时我们需要在自己的程序调起第三方程序,这个时候我们就需要知道第三方程序的包名和入口界面的Activity. 下面我们介绍几种方式获取第三方程序的包名及程序入口Activity. 1.使用adb ...

  8. html标签库jar包,struts2的s标签库jar包

    这是struts2的s标签库jar包下载,Struts2的一些核心组件,帮助Struts2核心控制器更好的完成对web框架的设计,是使用Struts2不可缺少的组件,如果没有这个文件可能会造成一些软件 ...

  9. android 带手电筒的扫一扫(1 可以自动打开手电筒,2 可以自动对焦,增加识别率)

    android 扫一扫 功能: 1 可以类似于摩拜单车的扫一扫,自动打开手电筒图标让我们打开手电筒. 2 可以自动聚焦 解释说明: 功能1 加上了手电筒的效果 说明 在项目中 CaptureActiv ...

最新文章

  1. python深度神经网络量化_基于Python建立深度神经网络!你学会了嘛?
  2. hdu 1723 DP/递推
  3. win10 uwp 按下等待按钮
  4. Python 内建函数
  5. android simples 结构,android – 如何在simple_list_item_2中构造和显示信息?
  6. 初级Java开发与架构之间的差距不仅仅是开发时间
  7. [java]房屋出租系统
  8. ADS系列之SIPI仿真笔记:ADS多种版本的安装、卸载重装(一)
  9. python———两个栈实现一个队列
  10. Handler看这一篇就够了
  11. 关于总时差和自由时差的作用及理由
  12. Linux中各种 command not found问题解决
  13. B75经典门户商业版Discuz模板下载
  14. Linux 根目录结构,英文全称、文件夹作用
  15. 风云编程python基础语法(1)
  16. vin接口车架号vin查询车型
  17. linux查询系统硬件配置
  18. Excel设置选项按钮
  19. c#键盘事件代码keychar
  20. 指标管理是如何优化目标管理体系的!

热门文章

  1. Joomla模板下载
  2. oracle中wip差异原因,WIP工单差异分析
  3. HTML网页设计制作大作业(div+css) ~中华美德6页面带音乐 ~ 学生网页设计作业源码(中华文化)
  4. 不让登QQ恶作剧小程序
  5. 【机器学习概率统计】02 事件的关系:深入理解独立性
  6. ROS-Control专题:PR2的六个概念【6】
  7. amd显卡驱动linux编译安装,Debian 8 安装AMD/ATI显卡驱动
  8. 良/恶性乳腺肿瘤预测(逻辑回归分类器)
  9. hadoop入门8:自定义OutputFormat,根据需求数据输出不同的路径
  10. 中央部委首提元宇宙,多地政府积极响应并提前布局