14、NFC技术:使用Android Beam技术传输文本
Android Beam的基本理念就是两部(只能是两部)NFC设备靠近时(一般是背靠背),通过触摸一部NFC设备的屏幕,将数据推向另外一部NFC设备。在传递数据的过程中,两部NFC设备不能离得太远,否则NFC连接将中断。
Android SDK提供了如下两个用于传递消息的方法。
public void setNdefPushMessage(NdefMessage message, Activity activity, Activity ... activities);
public void setNdefPushMessageCallback(CreateNdefMessageCallback callback, Activity activity, Activity ... activities);
public NdefMessage createNdefMessage(NfcEvent event)
Demo


- import java.nio.charset.Charset;
- import java.util.Locale;
- import android.app.Activity;
- import android.app.PendingIntent;
- import android.content.Intent;
- import android.nfc.NdefMessage;
- import android.nfc.NdefRecord;
- import android.nfc.NfcAdapter;
- import android.nfc.NfcAdapter.CreateNdefMessageCallback;
- import android.nfc.NfcAdapter.OnNdefPushCompleteCallback;
- import android.nfc.NfcEvent;
- import android.os.Bundle;
- import android.os.Parcelable;
- import android.util.Log;
- import android.widget.EditText;
- import android.widget.Toast;
- /**
- * 两部android手机,进行传入文本信息。
- * @author dr
- *
- */
- public class AndroidBeamMainActivity extends Activity implements
- CreateNdefMessageCallback, OnNdefPushCompleteCallback {
- private EditText mBeamText;
- private NfcAdapter mNfcAdapter;
- private PendingIntent mPendingIntent;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_android_beam);
- mBeamText = (EditText) findViewById(R.id.edittext_beam_text);
- mNfcAdapter = mNfcAdapter.getDefaultAdapter(this);
- mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
- getClass()), 0);
- mNfcAdapter.setNdefPushMessageCallback(this, this);
- mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
- }
- @Override /** 窗口处理完成 */
- public void onNdefPushComplete(NfcEvent event) {
- Log.d("message", "complete");
- }
- @Override /** 如果另外一台手机,靠近当前这部手机 */
- public NdefMessage createNdefMessage(NfcEvent event) {
- String text = mBeamText.getText().toString().trim();
- if ("".equals(text))
- text = "默认文本";
- /*
- * "com.android.calculator2" 官方原生计算器包。
- * 当另外一部手机靠近这部手机时,会启动计算器。
- *
- * NdefMessage ndefMessage = new NdefMessage( new NdefRecord[] {
- * NdefRecord .createApplicationRecord("com.android.calculator2") });
- */
- NdefMessage ndefMessage = new NdefMessage(
- new NdefRecord[] { createTextRecord(text) });
- return ndefMessage;
- }
- @Override
- public void onResume() {
- super.onResume();
- if (mNfcAdapter != null)
- mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null,
- null);
- }
- @Override
- public void onPause() {
- super.onPause();
- if (mNfcAdapter != null)
- mNfcAdapter.disableForegroundDispatch(this);
- }
- @Override
- public void onNewIntent(Intent intent) {
- // 用于显示接收手机的信息。如果接收手机没有打开,会默认调用系统的黑界面。
- processIntent(intent);
- }
- /** 根据文本创建 NdefRecord 这个对象 */
- public NdefRecord createTextRecord(String text) {
- byte[] langBytes = Locale.CHINA.getLanguage().getBytes(
- Charset.forName("US-ASCII"));
- Charset utfEncoding = Charset.forName("UTF-8");
- byte[] textBytes = text.getBytes(utfEncoding);
- int utfBit = 0;
- char status = (char) (utfBit + langBytes.length);
- byte[] data = new byte[1 + langBytes.length + textBytes.length];
- data[0] = (byte) status;
- System.arraycopy(langBytes, 0, data, 1, langBytes.length);
- System.arraycopy(textBytes, 0, data, 1 + langBytes.length,
- textBytes.length);
- NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
- NdefRecord.RTD_TEXT, new byte[0], data);
- return record;
- }
- void processIntent(Intent intent) {
- Parcelable[] rawMsgs = intent
- .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
- NdefMessage msg = (NdefMessage) rawMsgs[0];
- String text = TextRecord.parse(msg.getRecords()[0]).getText();
- Toast.makeText(this, text, Toast.LENGTH_LONG).show();
- }
- }
- import java.io.UnsupportedEncodingException;
- import java.util.Arrays;
- import android.nfc.NdefRecord;
- public class TextRecord {
- private final String mText;
- private TextRecord(String text) {
- mText = text;
- }
- public String getText() {
- return mText;
- }
- // 将纯文本内容从NdefRecord对象中解析出来
- public static TextRecord parse(NdefRecord record) {
- if (record.getTnf() != NdefRecord.TNF_WELL_KNOWN)
- return null;
- if (!Arrays.equals(record.getType(), NdefRecord.RTD_TEXT))
- return null;
- try {
- byte[] payload = record.getPayload();
- /*
- * payload[0] contains the "Status Byte Encodings" field, per the
- * NFC Forum "Text Record Type Definition" section 3.2.1.
- *
- * bit7 is the Text Encoding Field.
- *
- * if (Bit_7 == 0): The text is encoded in UTF-8 if (Bit_7 == 1):
- * The text is encoded in UTF16
- *
- * Bit_6 is reserved for future use and must be set to zero.
- *
- * Bits 5 to 0 are the length of the IANA language code.
- */
- String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8"
- : "UTF-16";
- int languageCodeLength = payload[0] & 0x3f;
- String languageCode = new String(payload, 1, languageCodeLength,
- "US-ASCII");
- String text = new String(payload, languageCodeLength + 1,
- payload.length - languageCodeLength - 1, textEncoding);
- return new TextRecord(text);
- } catch (UnsupportedEncodingException e) {
- // should never happen unless we get a malformed tag.
- throw new IllegalArgumentException(e);
- }
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <EditText
- android:id="@+id/edittext_beam_text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="请输入要传输的文本"/>
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="5dp"
- android:text="请将当前设备靠近其他NFC设备,别忘了触摸屏幕哦!"
- android:textSize="16sp" />
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="10dp"
- android:src="@drawable/read_nfc_tag" />
- </LinearLayout>
14、NFC技术:使用Android Beam技术传输文本的更多相关文章
- NFC(13)使用Android Beam技术传输文件
注意 Android Beam技术传输文件时nfc只负责连接两个手机,而传输文件实际是用蓝牙模块.且目前接收文件功能只是系统完成,不用自写个接收程序. 传输文件相关的重要api 从Android4.1 ...
- NFC(12)使用Android Beam技术传输文本数据及它是什么
Android Beam技术是什么 Android Beam的基本理念就是两部(只能是1对1,不可像蓝牙那样1对多)NFC设备靠近时(一般是背靠背),通过触摸一部NFC设备的屏幕,将数据推向另外一部N ...
- 15、NFC技术:使用Android Beam技术传输文件
传输文件的API 从Android4.1开始,NfcAdapter类增加了如下两个推送数据的方法. NfcAdapter.setBeamPushUris NfcAdapter.setBeamPushU ...
- Android NFC开发(一)——初探NFC,了解当前前沿技术
Android NFC开发(一)--初探NFC,了解当前前沿技术 官方文档:http://developer.android.com/guide/topics/connectivity/nfc/ind ...
- NFC(6)NFC编程的几个重要类,NFC硬件启动android应用原理
用于NFC编程的几个重要类 Tag NFC 标签 NfcAdapter Nfc 的适配类 NdefMessage 描述NDEF格式的信息 NdefRecord 描述NDEF信息的一个信息段,类似tab ...
- [转载] Android逃逸技术汇编
本文转载自: http://blogs.360.cn/360mobile/2016/10/24/android_escape/ 摘 要 传统逃逸技术涉及网络攻防和病毒分析两大领域,网络攻防领域涉 ...
- Android官方技术文档翻译——Gradle 插件用户指南(6)
没想到翻译这篇<Gradle 插件用户指南>拖了差不多一个月,还跨年了.不过还好,在2号时终于一口气把剩下的给翻译完了(其实那天剩下的也就不到一章). 今天先发一下第六章,明天再发第七章. ...
- Android官方技术文档翻译——清单合并
本文译自Android官方技术文档<Manifest Merger>,原文地址:http://tools.android.com/tech-docs/new-build-system/us ...
- Android官方技术文档翻译——迁移 Gradle 项目到1.0.0 版本
本文译自Android官方技术文档<Migrating Gradle Projects to version 1.0.0>,原文地址:http://tools.android.com/te ...
随机推荐
- DXT纹理压缩
转:http://blog.csdn.net/lhc717/article/details/6802951 我们知道游戏中对于3D物体表面细节的表现最重要的还是靠贴图来实现的,那么越是高分辨率越是真彩 ...
- Merry Christmas 2015
祝大家圣诞快乐! 昨天下班在电梯里遇见HR大BOSS,她说公司今天上午有2200个员工要带小孩子来参加Children's Holidy Party...我问了句,那是不是有免费早餐和午餐啊,她说 & ...
- 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 ...
- Matlab多个Figure图合成一个Fig
案例:之前跑过的程序 已经生成了多个matlab图,现在需要进行合并到一个图中. 解决方案,利用图像句柄把figure图像中的参数读入到内存中,然后重新subplot绘制. 程序如下: clc;cle ...
- Android实现网络多线程文件下载
实现原理 (1)首先获得下载文件的长度,然后设置本地文件的长度. (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置. 如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M ...
- sysfs实例
转自:http://blog.chinaunix.net/u1/51562/showart_1076295.html 一:前言 在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象 ...
- 《OD大数据实战》MongoDB环境搭建
一.MongonDB环境搭建 1. 下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz 2. 解压 tar -zxvf ...
- LBS由ip查经纬度
LBS API: https://api.map.baidu.com/highacciploc/v1?qcip=223.104.5.201&qterm=pc&ak=NLwCqrDce4 ...
- 二维线性表 list实现
class Coordinate{ private int x; private int y; } List<Coordinate> list=new ArrayList<Coord ...
- HDU 2602 (简单的01背包) Bone Collector
很标准的01背包问题 //#define LOCAL #include <algorithm> #include <cstdio> #include <cstring&g ...