用于描述NDEF格式数据的两个重要的类

NdefMessage:描述NDEF格式的信息
NdefRecord:描述NDEF信息的一个信息段 

NdefMessage和NdefRecord是Android NFC技术的核心类,无论读写NDEF格式的NFC标签,还是通过Android Beam技术传递Ndef格式的数据,都需要这两个类。

 
向NFC标签写入数据的步骤
获取Tag对象

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

判断NFC标签的数据类型(通过Ndef.get方法)

Ndef ndef = Ndef.get(tag);

写入数据

ndef.writeNdefMessage(ndefMessage);

示例:自动启动Android应用程序
      
 最终效果:写入后,关闭程序,回到主页面,然后拿NFC标签靠近手机后盖上部,程序回自动运行。  实现代码如下所示。
  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. import android.app.ListActivity;
  5. import android.content.Intent;
  6. import android.content.pm.PackageInfo;
  7. import android.content.pm.PackageManager;
  8. import android.os.Bundle;
  9. import android.view.View;
  10. import android.widget.AdapterView;
  11. import android.widget.AdapterView.OnItemClickListener;
  12. import android.widget.ArrayAdapter;
  13.  
  14. /**
  15. * LIST列表,显示所有的包。
  16. * @author dr
  17. */
  18. public class InstalledApplicationListActivity extends ListActivity implements
  19. OnItemClickListener {
  20.  
  21. private List<String> mPackages = new ArrayList<String>();
  22.  
  23. @Override
  24. public void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26.  
  27. // 获取所有程序包名称,并且循环显示出来。
  28. PackageManager packageManager = getPackageManager();
  29. List<PackageInfo> packageInfos = packageManager
  30. .getInstalledPackages(PackageManager.GET_ACTIVITIES);
  31. for (PackageInfo packageInfo : packageInfos) {
  32. mPackages.add(packageInfo.applicationInfo.loadLabel(packageManager)
  33. + "\n" + packageInfo.packageName);
  34. }
  35.  
  36. ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
  37. android.R.layout.simple_list_item_1, android.R.id.text1,
  38. mPackages);
  39. setListAdapter(arrayAdapter);
  40. // 列表项,单击事件。
  41. getListView().setOnItemClickListener(this);
  42. }
  43.  
  44. @Override
  45. public void onItemClick(AdapterView<?> parent, View view, int position,
  46. long id) {
  47. Intent intent = new Intent();
  48. // 把选中的包名传过去
  49. intent.putExtra("package_name", mPackages.get(position));
  50. setResult(1, intent);
  51. finish();
  52.  
  53. }
  54.  
  55. }
  1. mport android.app.Activity;
  2. import android.app.PendingIntent;
  3. import android.content.Intent;
  4. import android.nfc.NdefMessage;
  5. import android.nfc.NdefRecord;
  6. import android.nfc.NfcAdapter;
  7. import android.nfc.Tag;
  8. import android.nfc.tech.Ndef;
  9. import android.os.Bundle;
  10. import android.view.View;
  11. import android.widget.Button;
  12. import android.widget.Toast;
  13.  
  14. public class RunApplicationActivity extends Activity {
  15.  
  16. private Button mSelectAutoRunApplication;
  17. private String mPackageName;
  18. private NfcAdapter mNfcAdapter;
  19. private PendingIntent mPendingIntent;
  20.  
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. // TODO Auto-generated method stub
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_auto_run_application);
  26.  
  27. mSelectAutoRunApplication = (Button) findViewById(R.id.button_select_auto_run_application);
  28.  
  29. mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
  30. // 一旦截获NFC消息后,通过PendingIntent来调用
  31. mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
  32. getClass()), 0);
  33.  
  34. }
  35.  
  36. public void onResume() { // 当窗口获得焦点时
  37. super.onResume();
  38.  
  39. if (mNfcAdapter != null)
  40. // (一旦截获NFC消息)优先级,优于所有的(处理NFC标签)窗口
  41. mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null,
  42. null);
  43. }
  44.  
  45. public void onPause() { //
  46. super.onPause();
  47.  
  48. if (mNfcAdapter != null)
  49. // 取消,把窗口恢复到正常状态。
  50. mNfcAdapter.disableForegroundDispatch(this);
  51. }
  52.  
  53. public void onClick_SelectAutoRunApplication(View view) {
  54. Intent intent = new Intent(this, InstalledApplicationListActivity.class);
  55. startActivityForResult(intent, 0);
  56. }
  57.  
  58. /**
  59. * 因为此Activity配置配件中设置成singleTop(第2次运行onCreate将不会创建新的窗口实例),
  60. * 不能在onCreate中获取Intent传过来的TAG数据。 但是,会调用此方法,onNewIntent也是Activity里面的方法。
  61. */
  62. public void onNewIntent(Intent intent) {
  63. if (mPackageName == null)
  64. return;
  65. // 获得Tag。
  66. Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  67. // 写入标签。
  68. writeNFCTag(detectedTag);
  69. }
  70.  
  71. public void writeNFCTag(Tag tag) {
  72. if (tag == null) {
  73. return;
  74. }
  75. NdefMessage ndefMessage = new NdefMessage(
  76. new NdefRecord[] { NdefRecord
  77. .createApplicationRecord(mPackageName) });
  78. int size = ndefMessage.toByteArray().length;
  79. try {
  80. // 判断NFC标签的数据类型。
  81. Ndef ndef = Ndef.get(tag);
  82. if (ndef != null) {
  83. ndef.connect(); // 建立连接
  84.  
  85. if (!ndef.isWritable()) { // 判断NFC标签是否可写。
  86. return;
  87. }
  88. if (ndef.getMaxSize() < size) { // 最大尺寸<写入尺寸。
  89. return;
  90. }
  91. // 写入数据。
  92. ndef.writeNdefMessage(ndefMessage);
  93. Toast.makeText(this, "ok", Toast.LENGTH_LONG).show();
  94. }
  95.  
  96. } catch (Exception e) {
  97. // TODO: handle exception
  98. }
  99. }
  100.  
  101. @Override
  102. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  103. if (resultCode == 1) {
  104. mSelectAutoRunApplication.setText(data.getExtras().getString(
  105. "package_name"));
  106. String temp = mSelectAutoRunApplication.getText().toString();
  107. mPackageName = temp.substring(temp.indexOf("\n") + 1);
  108.  
  109. }
  110.  
  111. }
  112.  
  113. }
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6.  
  7. <Button
  8. android:id="@+id/button_select_auto_run_application"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:onClick="onClick_SelectAutoRunApplication"
  12. android:text="选择已安装的应用程序" />
  13.  
  14. <TextView
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:layout_marginBottom="5dp"
  18. android:text="请将NFC标签或贴纸靠近手机背面"
  19. android:textSize="16sp" />
  20.  
  21. <ImageView
  22. android:layout_width="match_parent"
  23. android:layout_height="match_parent"
  24. android:layout_margin="10dp"
  25. android:src="@drawable/read_nfc_tag" />
  26.  
  27. </LinearLayout>
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2. package="cn.eoe.run.application"
  3. android:versionCode="1"
  4. android:versionName="1.0" >
  5.  
  6. <uses-sdk
  7. android:minSdkVersion="15"
  8. android:targetSdkVersion="15" />
  9.  
  10. <uses-permission android:name="android.permission.NFC" />
  11.  
  12. <application
  13. android:icon="@drawable/ic_launcher"
  14. android:label="@string/app_name"
  15. android:theme="@style/AppTheme" >
  16. <activity
  17. android:name=".RunApplicationActivity"
  18. android:label="@string/title_activity_auto_run_application"
  19. android:launchMode="singleTop"
  20. android:screenOrientation="portrait" >
  21. <intent-filter>
  22. <action android:name="android.intent.action.MAIN" />
  23.  
  24. <category android:name="android.intent.category.LAUNCHER" />
  25. </intent-filter>
  26. </activity>
  27. <activity
  28. android:name=".InstalledApplicationListActivity"
  29. android:label="@string/title_activity_installed_application_list"
  30. android:screenOrientation="portrait" />
  31.  
  32. </application>
  33.  
  34. </manifest>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

7、NFC技术:让Android自动运行程序的更多相关文章

  1. 【转】]Android实现开机自动运行程序

    有些时候,应用需要在开机时就自动运行,例如某个自动从网上更新内容的后台service.怎样实现开机自动运行的应用?在撰写本文时,联想到高焕堂先生以“Don't call me, I'll call y ...

  2. Android实现开机自动运行程序

    有些时候,应用需要在开机时就自动运行,例如某个自动从网上更新内容的后台service.怎样实现开机自动运行的应用?在撰写本文时,联想到高焕堂先生以“Don't call me, I'll call y ...

  3. 如何在Linux实现自动运行程序

    1.开机启动时 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init. init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /etc/rc. ...

  4. 如何在LINUX中开机、登陆、退出、定时、定期自动运行程序

    1.开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /et ...

  5. 第一次通过AVD Manager创建了一个虚拟设备,但是在Android Studio运行程序时却无设备可选

    第一次通过AVD Manager创建了一个虚拟设备,但是在Android Studio运行程序时却无设备可选 原因是adb.exe未运行起来 至于adb.exe未正常运行起来的原因多半是5037端口被 ...

  6. CentOS开机自动运行程序的脚本

    有些时候我们需要在服务器里设置一个脚本,让他一开机就自己启动.方法如下: cd /etc/init.dvi youshell.sh   #将youshell.sh修改为你自己的脚本名编写自己的脚本后保 ...

  7. /etc/rc.local 与 /etc/init.d Linux 开机自动运行程序

    1. /etc/rc.local 这是使用者自订开机启动程序,把需要开机自动运行的程序写在这个脚本里 --------引用---------------------- 在完成 run level 3 ...

  8. Android Studio运行程序,检测不到(夜神、Genymotion)模拟器

    用了统一给的android studio,运行程序,检测不到模拟器(夜神). 又新建了一个系统的模拟器,运行,提示ANDROID_SDK_ROOT is undefined 在环境变量中配置之后,夜神 ...

  9. [VC]VC实现开机自动运行程序

    有时候,我们需要在计算机启动的时候就启动某些程序,不要人干预.这里,提供一种让程序开机自动运行的方法.见下面代码: BOOL CXXX::SetAutoRun(CString strPath) { C ...

随机推荐

  1. React-非dom属性-dangerouslySetInnerHTML标签

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  2. WPF之RichTextBox丢失光标仍然选中文本

    描述:开发中完成了一个类似于Word的悬浮工具栏功能,选中文本之后可以自动弹出一个工具栏.可以修改字体.字体大小等功能,问题来了,我发现当去进行操作的时候原本选中的RichTextBox的内容的颜色会 ...

  3. [iOS]iPhone推送原理

    推送原理,先上图 说一下原理吧, 由App向iOS设备发送一个注册通知 iOS向APNs远程推送服务器发送App的Bundle Id和设备的UDID APNs根据设备的UDID和App的Bundle ...

  4. 我们为什么需要DTO(数据传输对象)

    原文:http://www.cnblogs.com/Gyoung/archive/2013/03/23/2977233.html DTO即数据传输对象(Data Transfer Object).之前 ...

  5. 【算法题】- 求和等于K子数组

    一整数(有正有负)数组,用尽量少的时间计算数组中和为某个整数的所有子数组 public class SumK { public static void main(String[] args) { in ...

  6. mysql中的连接

    SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. join可以分为内连接和外连接,外连接分为左连接.右连接和全连接 现有两个表 员工表和部门表 员工表 部门表 1.内连接( ...

  7. USACO Section 4.2: The Perfect Stall

    这题关键就在将题转换成最大流模板题.首先有一个原始点,N个cow个点, M个barn点和一个终点,原始点到cow点和barn点到终点的流都为1,而cow对应的barn就是cow点到对应barn点的流, ...

  8. SPOJ 227 Ordering the Soldiers 线段树 / 树状数组

    题意:设原数组为a[i],pos[i]代表第 i 个位置之前有多少个数比a[i]大,求原数组a[i]. 这个题意是看了别人的题解才明白,我自己没读出来…… 方法:假设我们从左往右放,因为后面的数还有可 ...

  9. c++异常 连续抛出异常

      今天天遇到这样一个问题,连续两次抛出异常,但是只有一个catch,会导致core这个时候会导致core, 单线程编程中可能很少遇到这样的问题,但是多线程中是很容易遇到的, 举个例子:catch代码 ...

  10. BZOJ 2743 采花(树状数组)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2743 题意:给出一个数列,每个询问查询[L,R]中至少出现两次的数字有多少种? 思路:(1 ...