Android Beam 详细实现步骤

时间:2022-10-14 15:54:22

前言

最近没怎么写东西了,主要是在了解Beam这个东东。这方面的教程真的非常有限,找了不少资料目前还没看到一篇能够让一个新手看一遍就知道实现一个Beam功能都需要那些步骤的。而且,都是用的官方的例子,稍加注释。偶尔找到一些高手写的文章,奈何水平有限看的云里雾里的。没办法,只好去复习官方文档。

都说现在Android方面的书没有什么很好的。我的体会是,书讲的都很全面,力求把每个方面都介绍一遍。这样带来的缺点是知识太浅,不够灵活。不过,想想书名也便释然了——“××Android 入门基础×× ”再加一些修饰词。唉~,入门~

正文:

好了进入正题。看官方文档有些吃力,主要都是英文的,概念方面还有不足。但是坚持看下来还是有很大的收获的。

先摘取一部分官方文档:

Beaming NDEF Messages to Other Devices


Android Beam allows simple peer-to-peer data exchange between two Android-powered devices. The application that wants to beam data to another device must be in the foreground and the device receiving the data must not be locked. When the beaming device comes in close enough contact with a receiving device, the beaming device displays the "Touch to Beam" UI. The user can then choose whether or not to beam the message to the receiving device.

Note: Foreground NDEF pushing was available at API level 10, which provides similar functionality to Android Beam. These APIs have since been deprecated, but are available to support older devices. SeeenableForegroundNdefPush() for more information.

You can enable Android Beam for your application by calling one of the two methods:

An activity can only push one NDEF message at a time, so setNdefPushMessageCallback() takes precedence over setNdefPushMessage() if both are set. To use Android Beam, the following general guidelines must be met:

  • The activity that is beaming the data must be in the foreground. Both devices must have their screens unlocked.
  • You must encapsulate the data that you are beaming in an NdefMessage object.
  • The NFC device that is receiving the beamed data must support the com.android.npp NDEF push protocol or NFC Forum's SNEP (Simple NDEF Exchange Protocol). The com.android.npp protocol is required for devices on API level 9 (Android 2.3) to API level 13 (Android 3.2). com.android.npp and SNEP are both required on API level 14 (Android 4.0) and later.

Note: If your activity enables Android Beam and is in the foreground, the standard intent dispatch system is disabled. However, if your activity also enables foreground dispatching, then it can still scan tags that match the intent filters set in the foreground dispatching.

To enable Android Beam:

  1. Create an NdefMessage that contains the NdefRecords that you want to push onto the other device.
  2. Call setNdefPushMessage() with a NdefMessage or call setNdefPushMessageCallback passing in aNfcAdapter.CreateNdefMessageCallback object in the onCreate() method of your activity. These methods require at least one activity that you want to enable with Android Beam, along with an optional list of other activities to activate.

    In general, you normally use setNdefPushMessage() if your Activity only needs to push the same NDEF message at all times, when two devices are in range to communicate. You usesetNdefPushMessageCallback when your application cares about the current context of the application and wants to push an NDEF message depending on what the user is doing in your application.

主要是理解上面这部分东西,多看即便会有不一样的感觉。

下面是我按照官方的例子调试出来的一篇Beam代码,功能和官方的一样。我还在完善,先贴出来,以后更新。

package com.example.beamtest;
/**
* Time: 2012.8.11
* Author: kehr
* Aim: Test Android beam
*/
import java.nio.charset.Charset; import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.Toast; public class Beam extends Activity implements CreateNdefMessageCallback { NfcAdapter mNfcAdapter;
// TextView mEditText;
EditText mEditText; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
// fullscreen
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// no title
requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.beam_layout);
mEditText = (EditText) findViewById(R.id.beam_input_EditText);
// 检测设备是否支持NFC
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null) {
Toast.makeText(this, "你的设备不支持", Toast.LENGTH_LONG).show(); // 检测NFC是否开启
} else if (mNfcAdapter.isEnabled()) { Toast.makeText(this, "NFC开启!", Toast.LENGTH_LONG).show();
} else { Toast.makeText(this, "NFC未开启!请手动设置~", Toast.LENGTH_LONG).show();
} // 注册回调函数
mNfcAdapter.setNdefPushMessageCallback(this, this);
} // 发送消息-------------------------------------------------------------------------
// 这是CreateNdefMessageCallback中需要实现的方法
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
// TODO Auto-generated method stub
// 获取文本框中的内容
String text = mEditText.getText().toString();
NdefMessage msg = new NdefMessage(new NdefRecord[] { createMimeRecord(
"application/com.example.android.beam", text.getBytes()) });
return msg;
} public NdefRecord createMimeRecord(String mimeType, byte[] payload) {
byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
NdefRecord mimeRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
mimeBytes, new byte[0], payload);
return mimeRecord;
} // 消息发送完成的处理------------------------------------------------
//------------不是主要功能,官方例子里面有,我给去掉了----------------待实现……
// 处理接收的消息----------------------------------------------------------------------
// 第一步,接收Intent
@Override
protected void onNewIntent(Intent intent) {
// super.onNewIntent(intent); setIntent(intent);
} // 第二步,判断Intent
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());
}
} // 第三步。处理Intent
void processIntent(Intent intent) {
Parcelable[] rawMsgs = intent
.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
// only one message sent during the beam
NdefMessage msg = (NdefMessage) rawMsgs[0];
// record 0 contains the MIME type, record 1 is the AAR, if present
mEditText.setText(new String(msg.getRecords()[0].getPayload()));
} }

上面这是Beam实现的主代码,运行起来还需要一些其它的配置。

其实初步理解后发现,beam也没有想像中来的麻烦。

如果需要完整的工程文件,请留言联系我。

Android Beam 详细实现步骤的更多相关文章

  1. Android slidingmenu详细解释 滑动的优化

    Android slidingmenu 详细解释 性能优化 转载请注明:   http://blog.csdn.net/aaawqqq 简单介绍 SlidingMenu 是github 上Androi ...

  2. vs2010如何安装mvc3,怎样安装,详细的步骤,从哪下载?请看这篇文章。

    vs2010如何安装mvc3,怎样安装,详细的步骤,从哪下载?请看这篇文章. 安装步骤:vs2010 -> vs2010sp1 -> AspNetMVC3Setup -> AspNe ...

  3. yii2 rbac权限控制详细操作步骤

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...

  4. yii2权限控制rbac之详细操作步骤

    本篇的主题是 rbac权限控制的详细操作步骤,注意是操作步骤哦,关于配置与rbac的搭建,我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程说的再清楚不过了. 但是,在很多人的反馈下,说是 ...

  5. APNs详细使用步骤

    1. 什么是推送通知 消息通知分本地通知和远程推送通知,是没有运行在前台的应用程序可以让它们的用户获得相关消息通知的方式.消息通知可能是一条消息,即将发生的日历事件,或远程服务器的新数据.当被操作系统 ...

  6. Unity中加入Android项目的Build步骤

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简介: 有的项目需要在Android中加入Unity功能,例如ANDROID应用中嵌入Un ...

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

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

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

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

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

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

随机推荐

  1. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  2. 由用友NC刷新功能得到启示

    在做NC刷新界面数据的功能,就是 点刷新按钮然后刷新当前 list 中的数据,犯了一个错误. 我之前的做法是记录每次查询数据的sql条件语句,然后在点刷新的时候去调用这个条件语句,哈哈,错误就在这个逻 ...

  3. Beta阶段项目展示

    1.团队简介 韩青长 前端工程师 我是韩青长,技术小白,抱着对软工的好奇和对未来工作的憧憬选了这门课.暂时选择了测试的工作,也对开发和UI有一定兴趣.从前上帝创造了我们,现在轮到我们来创造自己的软件了 ...

  4. 一个struts2登录bug的解决

    点登录的时候,在url后面总会加上一个;jsessionid=xxx 使找不到页面 的404 Bug ,百思不得其解,最后终于找到解决方案,实验最终成功解决了这个bug,下面是解决方案 1,增加依赖  ...

  5. WebApplicationInitializer (spring 3.x.x以上版本)

    实现WebApplicationinitializer接口的类都可以在web应用程序启动时被加载. 那么来想一个问题:为什么实现了WebApplicationInitializer这个接口后,onSt ...

  6. Linux环境的PHP执行

    /usr/local/php5/bin/php -c /var/spool/php.ini -q /var/spool/auto.php

  7. postgresql从timestamp(6)复制到timestamp(0),时间会变

    主要涉及临界点(跨天) 例子(时间:2016-08-05 23:59:59.863) timestamp(6):2016-08-05 23:59:59.863 timestamp(0):2016-08 ...

  8. 使用GDB调试gp(转载)

    使用 gdb 调试 postgres greenplum zalax3030人评论715人阅读2012-07-11 10:07:15   错误信息的获取途径有几种 :  1. 最简单的就是看Postg ...

  9. JSTL-简介

    JSTL全称为 JSP Standard Tag Library 即JSP标准标签库. JSTL作为最基本的标签库,提供了一系列的JSP标签,实现了基本的功能:集合的遍历.数据的输出.字符串的处理.数 ...

  10. Docker学习以及镜像制作流程

    一.何为Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...