Android Beam技术是什么

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

使用Android Beam技术传输文本数据

  目前2015-09-05在android支持的nfc设备上,只要我们提供数据类型就可,不用手动像socket那样手动write(data),由系统完成,

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

  NfcAdapter.setNdefPushMessage

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

  NfcAdapter.setNdefPushMessageCallback ,这是一个回调,直到需要传输数据时才准备数据.

public void setNdefPushMessageCallback(CreateNdefMessageCallback callback, Activity activity, Activity ... activities);
public NdefMessage createNdefMessage(NfcEvent event)

使用Android Beam技术传输文本示例

 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;
/*
* 两个nfc设备通信示例
* 本例中使用第2种方法传递数据,NfcAdapter.setNdefPushMessageCallback
*/
public class AndroidBeamMainActivity extends Activity
implements CreateNdefMessageCallback //传输数据的方法
, OnNdefPushCompleteCallback {//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); //设置当前aty为处理nfc的应用,注意aty为singleTop
mNfcAdapter = mNfcAdapter.getDefaultAdapter(this);
mPendingIntent = PendingIntent.getActivity(this, , new Intent(this,getClass()), ); //数据传输函数回调
mNfcAdapter.setNdefPushMessageCallback(this, this);
//传输完毕回调
mNfcAdapter.setOnNdefPushCompleteCallback(this, this); }
/*
* from OnNdefPushCompleteCallback
* 数据传输完毕的回调.
*/
@Override
public void onNdefPushComplete(NfcEvent event) {
Log.d("message", "complete");
} /*
* 这是CreateNdefMessageCallback的回调,
* 创建一个NdefMessage.这里是把EditText中内容封装成NdefMessage
* NdefMessage中record的类型可以自己随意,如text,uri,application
*
*/
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
String text = mBeamText.getText().toString().trim();
if ("".equals(text))
text = "默认文本"; /*
* 创建一个ApplicationRecord类型的record
* 启动计算器.
*/
/*NdefMessage ndefMessage = new NdefMessage(
new NdefRecord[] { NdefRecord.createApplicationRecord("com.android.calculator2") });*/ /*
* 根据txt创建一个NdefRecord,并把它放入到NdefMessage中.
*/
NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{createTextRecord(text)}); return ndefMessage;
} /*
*注册当前aty为nfc处理功能
*/
@Override
public void onResume() {
super.onResume();
if (mNfcAdapter != null)
mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null,
null); }
/*
*注销当前aty处理nfc的功能
*/
@Override
public void onPause() {
super.onPause();
if (mNfcAdapter != null)
mNfcAdapter.disableForegroundDispatch(this);
} @Override
public void onNewIntent(Intent intent) {
/*
* 当本aty启动时,有另个nfc设备通过beam与本机配对并传来数据时,
* 本函数接收数据,并用toast提示出来.
* 如果要aty未启动,那么系统调用默认的处理程序.
*/
processIntent(intent);
} /*
* 根据文本创建一个NdefRecord,
* 注意ndef文本格式规范
* 1,这些数据的第1个字节描述了数据的状态,
   * 2,然后若干个字节描述文本的语言编码,
   * 3,最后剩余字节表示文本数据。
*/
public NdefRecord createTextRecord(String text) {
//语言编码
byte[] langBytes = Locale.CHINA.getLanguage().getBytes(Charset.forName("US-ASCII")); //设置text的字符编码为utf8
Charset utfEncoding = Charset.forName("UTF-8");
byte[] textBytes = text.getBytes(utfEncoding);
int utfBit = ;
char status = (char) (utfBit + langBytes.length);
//申请空间
byte[] data = new byte[ + langBytes.length + textBytes.length];
//第1字节是状态码
data[] = (byte) status;
System.arraycopy(langBytes, , data, , langBytes.length);
System.arraycopy(textBytes, , data, + langBytes.length,textBytes.length);
NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,NdefRecord.RTD_TEXT, new byte[], data); return record;
} void processIntent(Intent intent) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); NdefMessage msg = (NdefMessage) rawMsgs[];
String text = TextRecord.parse(msg.getRecords()[]).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;
} 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[] & 0x80) == ) ? "UTF-8"
: "UTF-16";
int languageCodeLength = payload[] & 0x3f;
String languageCode = new String(payload, , languageCodeLength,"US-ASCII");
String text = new String(payload, languageCodeLength + ,
payload.length - languageCodeLength - , textEncoding);
return new TextRecord(text);
} catch (UnsupportedEncodingException e) {
// should never happen unless we get a malformed tag.
throw new IllegalArgumentException(e);
}
}
}

NFC(12)使用Android Beam技术传输文本数据及它是什么的更多相关文章

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

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

  2. 14、NFC技术:使用Android Beam技术传输文本

    Android Beam的基本理念 Android Beam的基本理念就是两部(只能是两部)NFC设备靠近时(一般是背靠背),通过触摸一部NFC设备的屏幕,将数据推向另外一部NFC设备.在传递数据的过 ...

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

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

  4. [Android Traffic] 让android应用在传输网络数据的时候更省电

    到今年6月,我国的手机网民已经达到了3.88亿,超过了电脑终端.相信有智能机的同学都用过手机上网冲浪.但是手机的电量很快被用光了恐怕是每个人都不能忍受的一件事情.而打开数据连接进行网络数据的传输是很耗 ...

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

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

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

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

  7. 10、NFC技术:读写NFC标签中的文本数据

    代码实现过程如下: 读写NFC标签的纯文本数据.java import java.nio.charset.Charset; import java.util.Locale; import androi ...

  8. 【聊技术】在Android中实现自适应文本大小显示

    本周的聊技术话题和大家说说如何在Android中实现自适应文本大小显示. 想象一下,在布局中,通常显示文本的区域大小是固定的,但是文本长度并不总是固定的.比如列表中的文章标题.界面下方的按钮文本等等. ...

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

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

随机推荐

  1. IOS离线教程下载与Dash的使用

    都知道,苹果官网的IOS Developer Library是开发者最喜欢用的知识仓库,但由于有时打开它实在太慢了! 但是,我们可以手动下载离线版的!离线的文档,在这里,叫做DocSet,意指文档集合 ...

  2. 使用fiddler4做代理调试手机页面

    由于一般手机不能改host,手机页面如果涉及到各个域名ip的混合使用,在手机上调试看效果非常麻烦. 使用fiddler4做代理,手机跟电脑连到同一个局域网,手机上网通过电脑做个代理上网,那么一切请求就 ...

  3. MIT 2012 分布式课程基础源码解析-底层通讯实现

    本节内容和前节事件管理封装是息息相关的,本节内容主要包含的代码在connection{.h, .cc}中. 这里面最主要的有两个类:connection类和tcpsconn类,connetion类主要 ...

  4. 由底层和逻辑说开去——c++之类与对象的深入剖析

    类是什么,对象是什么,  这两个问题在各个c++书里面都以一种抽象的描述方式,给了我们近乎完美的答案,然后我好像就知道什么是类什么是对象了,但是当扪心自问,类在哪儿,对象在哪儿,成员方法在哪儿,成员变 ...

  5. mac 下 sphinx + mysql + php 实现全文搜索(xampp)(4)php api 解析

    1:function GetLastError()  // 假如报错的话,会输出报错信息 2:function GetLastWarning ()// 输出 警告信息 3:function SetSe ...

  6. [摘] SQLPLUS Syntax

    You use the SQLPLUS command at the operating system prompt to start command-line SQL*Plus: SQLPLUS [ ...

  7. 同时安装vs2010和VS2012后IEnumerable<ModelClientValidationRule>编译错误

    错误 类型“System.Web.Mvc.ModelClientValidationRule”同时存在于“c:\Program Files (x86)\Microsoft ASP.NET\ASP.NE ...

  8. response 后刷新页面,点击按钮后,禁用该按钮

    一,正常的点击按钮后,将其灰显,全部执行完毕再正常显示. this.btnSave.Attributes.Add("onclick", "if (typeof(Page_ ...

  9. Objective-C程序结构及语法特点

    程序文件分为头文件(.h)和实现文件(.m): 使用#import关键字将所需的头文件导入程序,并且可以避免程序重复引用相同的头文件: @autoreleasepool { … } 自动释放池: 符号 ...

  10. Java发送邮件(带附件)

    实现java发送邮件的过程大体有以下几步: 准备一个properties文件,该文件中存放SMTP服务器地址等参数. 利用properties创建一个Session对象 利用Session创建Mess ...