Android Beam的基本理念

Android Beam的基本理念就是两部(只能是两部)NFC设备靠近时(一般是背靠背),通过触摸一部NFC设备的屏幕,将数据推向另外一部NFC设备。在传递数据的过程中,两部NFC设备不能离得太远,否则NFC连接将中断。

Android Beam API

Android SDK提供了如下两个用于传递消息的方法。

NfcAdapter.setNdefPushMessage
NfcAdapter.setNdefPushMessageCallback

public void setNdefPushMessage(NdefMessage message, Activity activity, Activity ... activities);

public void setNdefPushMessageCallback(CreateNdefMessageCallback callback, Activity activity, Activity ... activities);

public NdefMessage createNdefMessage(NfcEvent event)

Demo

          
  1. import java.nio.charset.Charset;
  2. import java.util.Locale;
  3.  
  4. import android.app.Activity;
  5. import android.app.PendingIntent;
  6. import android.content.Intent;
  7. import android.nfc.NdefMessage;
  8. import android.nfc.NdefRecord;
  9. import android.nfc.NfcAdapter;
  10. import android.nfc.NfcAdapter.CreateNdefMessageCallback;
  11. import android.nfc.NfcAdapter.OnNdefPushCompleteCallback;
  12. import android.nfc.NfcEvent;
  13. import android.os.Bundle;
  14. import android.os.Parcelable;
  15. import android.util.Log;
  16. import android.widget.EditText;
  17. import android.widget.Toast;
  18.  
  19. /**
  20. * 两部android手机,进行传入文本信息。
  21. * @author dr
  22. *
  23. */
  24. public class AndroidBeamMainActivity extends Activity implements
  25. CreateNdefMessageCallback, OnNdefPushCompleteCallback {
  26.  
  27. private EditText mBeamText;
  28.  
  29. private NfcAdapter mNfcAdapter;
  30. private PendingIntent mPendingIntent;
  31.  
  32. @Override
  33. public void onCreate(Bundle savedInstanceState) {
  34. super.onCreate(savedInstanceState);
  35.  
  36. setContentView(R.layout.activity_android_beam);
  37. mBeamText = (EditText) findViewById(R.id.edittext_beam_text);
  38.  
  39. mNfcAdapter = mNfcAdapter.getDefaultAdapter(this);
  40. mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
  41. getClass()), 0);
  42.  
  43. mNfcAdapter.setNdefPushMessageCallback(this, this);
  44. mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
  45. }
  46.  
  47. @Override /** 窗口处理完成 */
  48. public void onNdefPushComplete(NfcEvent event) {
  49. Log.d("message", "complete");
  50. }
  51.  
  52. @Override /** 如果另外一台手机,靠近当前这部手机 */
  53. public NdefMessage createNdefMessage(NfcEvent event) {
  54. String text = mBeamText.getText().toString().trim();
  55. if ("".equals(text))
  56. text = "默认文本";
  57. /*
  58. * "com.android.calculator2" 官方原生计算器包。
  59. * 当另外一部手机靠近这部手机时,会启动计算器。
  60. *
  61. * NdefMessage ndefMessage = new NdefMessage( new NdefRecord[] {
  62. * NdefRecord .createApplicationRecord("com.android.calculator2") });
  63. */
  64. NdefMessage ndefMessage = new NdefMessage(
  65. new NdefRecord[] { createTextRecord(text) });
  66.  
  67. return ndefMessage;
  68. }
  69.  
  70. @Override
  71. public void onResume() {
  72. super.onResume();
  73. if (mNfcAdapter != null)
  74. mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null,
  75. null);
  76. }
  77.  
  78. @Override
  79. public void onPause() {
  80. super.onPause();
  81. if (mNfcAdapter != null)
  82. mNfcAdapter.disableForegroundDispatch(this);
  83. }
  84.  
  85. @Override
  86. public void onNewIntent(Intent intent) {
  87. // 用于显示接收手机的信息。如果接收手机没有打开,会默认调用系统的黑界面。
  88. processIntent(intent);
  89. }
  90.  
  91. /** 根据文本创建 NdefRecord 这个对象 */
  92. public NdefRecord createTextRecord(String text) {
  93. byte[] langBytes = Locale.CHINA.getLanguage().getBytes(
  94. Charset.forName("US-ASCII"));
  95. Charset utfEncoding = Charset.forName("UTF-8");
  96. byte[] textBytes = text.getBytes(utfEncoding);
  97. int utfBit = 0;
  98. char status = (char) (utfBit + langBytes.length);
  99. byte[] data = new byte[1 + langBytes.length + textBytes.length];
  100. data[0] = (byte) status;
  101. System.arraycopy(langBytes, 0, data, 1, langBytes.length);
  102. System.arraycopy(textBytes, 0, data, 1 + langBytes.length,
  103. textBytes.length);
  104. NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
  105. NdefRecord.RTD_TEXT, new byte[0], data);
  106.  
  107. return record;
  108. }
  109.  
  110. void processIntent(Intent intent) {
  111. Parcelable[] rawMsgs = intent
  112. .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
  113.  
  114. NdefMessage msg = (NdefMessage) rawMsgs[0];
  115. String text = TextRecord.parse(msg.getRecords()[0]).getText();
  116. Toast.makeText(this, text, Toast.LENGTH_LONG).show();
  117. }
  118. }
  1. import java.io.UnsupportedEncodingException;
  2. import java.util.Arrays;
  3. import android.nfc.NdefRecord;
  4.  
  5. public class TextRecord {
  6. private final String mText;
  7.  
  8. private TextRecord(String text) {
  9. mText = text;
  10. }
  11.  
  12. public String getText() {
  13. return mText;
  14. }
  15.  
  16. // 将纯文本内容从NdefRecord对象中解析出来
  17. public static TextRecord parse(NdefRecord record) {
  18.  
  19. if (record.getTnf() != NdefRecord.TNF_WELL_KNOWN)
  20. return null;
  21. if (!Arrays.equals(record.getType(), NdefRecord.RTD_TEXT))
  22. return null;
  23.  
  24. try {
  25. byte[] payload = record.getPayload();
  26. /*
  27. * payload[0] contains the "Status Byte Encodings" field, per the
  28. * NFC Forum "Text Record Type Definition" section 3.2.1.
  29. *
  30. * bit7 is the Text Encoding Field.
  31. *
  32. * if (Bit_7 == 0): The text is encoded in UTF-8 if (Bit_7 == 1):
  33. * The text is encoded in UTF16
  34. *
  35. * Bit_6 is reserved for future use and must be set to zero.
  36. *
  37. * Bits 5 to 0 are the length of the IANA language code.
  38. */
  39. String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8"
  40. : "UTF-16";
  41. int languageCodeLength = payload[0] & 0x3f;
  42. String languageCode = new String(payload, 1, languageCodeLength,
  43. "US-ASCII");
  44. String text = new String(payload, languageCodeLength + 1,
  45. payload.length - languageCodeLength - 1, textEncoding);
  46. return new TextRecord(text);
  47. } catch (UnsupportedEncodingException e) {
  48. // should never happen unless we get a malformed tag.
  49. throw new IllegalArgumentException(e);
  50. }
  51. }
  52.  
  53. }
  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. <EditText
  8. android:id="@+id/edittext_beam_text"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:hint="请输入要传输的文本"/>
  12.  
  13. <TextView
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:layout_marginBottom="5dp"
  17. android:text="请将当前设备靠近其他NFC设备,别忘了触摸屏幕哦!"
  18. android:textSize="16sp" />
  19.  
  20. <ImageView
  21. android:layout_width="match_parent"
  22. android:layout_height="match_parent"
  23. android:layout_margin="10dp"
  24. android:src="@drawable/read_nfc_tag" />
  25.  
  26. </LinearLayout>
 

14、NFC技术:使用Android Beam技术传输文本的更多相关文章

  1. NFC(13)使用Android Beam技术传输文件

    注意 Android Beam技术传输文件时nfc只负责连接两个手机,而传输文件实际是用蓝牙模块.且目前接收文件功能只是系统完成,不用自写个接收程序. 传输文件相关的重要api 从Android4.1 ...

  2. NFC(12)使用Android Beam技术传输文本数据及它是什么

    Android Beam技术是什么 Android Beam的基本理念就是两部(只能是1对1,不可像蓝牙那样1对多)NFC设备靠近时(一般是背靠背),通过触摸一部NFC设备的屏幕,将数据推向另外一部N ...

  3. 15、NFC技术:使用Android Beam技术传输文件

    传输文件的API 从Android4.1开始,NfcAdapter类增加了如下两个推送数据的方法. NfcAdapter.setBeamPushUris NfcAdapter.setBeamPushU ...

  4. Android NFC开发(一)——初探NFC,了解当前前沿技术

    Android NFC开发(一)--初探NFC,了解当前前沿技术 官方文档:http://developer.android.com/guide/topics/connectivity/nfc/ind ...

  5. NFC(6)NFC编程的几个重要类,NFC硬件启动android应用原理

    用于NFC编程的几个重要类 Tag NFC 标签 NfcAdapter Nfc 的适配类 NdefMessage 描述NDEF格式的信息 NdefRecord 描述NDEF信息的一个信息段,类似tab ...

  6. [转载] Android逃逸技术汇编

    本文转载自: http://blogs.360.cn/360mobile/2016/10/24/android_escape/ 摘    要 传统逃逸技术涉及网络攻防和病毒分析两大领域,网络攻防领域涉 ...

  7. Android官方技术文档翻译——Gradle 插件用户指南(6)

    没想到翻译这篇<Gradle 插件用户指南>拖了差不多一个月,还跨年了.不过还好,在2号时终于一口气把剩下的给翻译完了(其实那天剩下的也就不到一章). 今天先发一下第六章,明天再发第七章. ...

  8. Android官方技术文档翻译——清单合并

    本文译自Android官方技术文档<Manifest Merger>,原文地址:http://tools.android.com/tech-docs/new-build-system/us ...

  9. Android官方技术文档翻译——迁移 Gradle 项目到1.0.0 版本

    本文译自Android官方技术文档<Migrating Gradle Projects to version 1.0.0>,原文地址:http://tools.android.com/te ...

随机推荐

  1. DXT纹理压缩

    转:http://blog.csdn.net/lhc717/article/details/6802951 我们知道游戏中对于3D物体表面细节的表现最重要的还是靠贴图来实现的,那么越是高分辨率越是真彩 ...

  2. Merry Christmas 2015

    祝大家圣诞快乐! 昨天下班在电梯里遇见HR大BOSS,她说公司今天上午有2200个员工要带小孩子来参加Children's Holidy Party...我问了句,那是不是有免费早餐和午餐啊,她说 & ...

  3. AdventureWorksDW2008R2 attach: Unable to open the physical file. Operating system error 5: "5(Access is denied.)

    http://stackoverflow.com/questions/26014133/adventureworksdw2008r2-attach-unable-to-open-the-physica ...

  4. Matlab多个Figure图合成一个Fig

    案例:之前跑过的程序 已经生成了多个matlab图,现在需要进行合并到一个图中. 解决方案,利用图像句柄把figure图像中的参数读入到内存中,然后重新subplot绘制. 程序如下: clc;cle ...

  5. Android实现网络多线程文件下载

    实现原理 (1)首先获得下载文件的长度,然后设置本地文件的长度. (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置. 如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M ...

  6. sysfs实例

    转自:http://blog.chinaunix.net/u1/51562/showart_1076295.html 一:前言 在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象 ...

  7. 《OD大数据实战》MongoDB环境搭建

    一.MongonDB环境搭建 1. 下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz 2. 解压 tar -zxvf ...

  8. LBS由ip查经纬度

    LBS API: https://api.map.baidu.com/highacciploc/v1?qcip=223.104.5.201&qterm=pc&ak=NLwCqrDce4 ...

  9. 二维线性表 list实现

    class Coordinate{ private int x; private int y; } List<Coordinate> list=new ArrayList<Coord ...

  10. HDU 2602 (简单的01背包) Bone Collector

    很标准的01背包问题 //#define LOCAL #include <algorithm> #include <cstdio> #include <cstring&g ...