文档库 最新最全的文档下载
当前位置:文档库 › Android中NFC功能流程图解析及代码演示

Android中NFC功能流程图解析及代码演示

Android中NFC功能流程图解析及代码演示
Android中NFC功能流程图解析及代码演示

Android中NFC功能流程图解析及代码演示

在Android4.0推出的时候,一个非常引人注目的功能就是NFC(Near Field Communication). Near Field Communication (NFC) is a set of short-range wireless technologies, typically requiring a distance of 4cm or less to initiate a connection. NFC allows you to share small payloads of data between an NFC tag and an Android-powered device, or between two Android-powered devices.

翻译:

近场通讯(NFC)是一系列短距离无线技术,一般需要4cm或者更短去初始化连接。近场通讯(NFC)允许你在NFC tag和Android设备或者两个Android设备间共享小负载数据。

典型的应用为刷卡应用,如刷信用卡,公交车卡,吃饭的饭卡之类。腾讯2011年1月份文章“Android首款NFC近场通信应用推出”,说明了基于Android的NFC应用目前已经有了,得益于日本在手机刷卡的应用氛围。据2011年7月网易文章“PayPal推出Android系统NFC移动支付服务”报道,PayPal已经做了尝试了,相信这股风很快要刮到中国。

下面我们从技术的层面来分析一下这个技术。

官方的图片示例为:

这是NFC的开发流程,参考文章“【NFC在android中的应用API】”。

相关的类代码有:NfcAdapter,NdefMessage, NdefRecord,ACTION_TAG_DISCOVERED.

在功能层面上,涉及到了NFC的读写功能。下面我们分别来做总结。

在代码层上面:

使用的时候,需要在AndroidManifest.xml里面加一些权限以及属性。

android:name="android.permission.NFC"/>

android:required="true"/>

这里注意,在Android Version 9的时候仅仅支持了ACTION_TAG_DISCOVERED,对于其他的需要10以上。

在上面的基础上,还需要增加intent-filter的支持。

android:name="android.nfc.action.NDEF_DISCOVERED"/>

android:name="android.intent.category.DEFAULT"/>

获取NfcAdapter的代码为

public static String getStatusNfcDevice () {

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter();

if (nfcAdapter.isEnabled()) {

String status = "enabled";

return status;

}

else {

String status = "disabled";

return status;

}

}

处理函数为

public void onResume() {

super.onResume();

if

(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().

getAction())) {

Parcelable[] rawMsgs =

intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_M ESSAGES);

if (rawMsgs != null) {

msgs = new NdefMessage[rawMsgs.length];

for (int i = 0; i < rawMsgs.length; i++) {

msgs[i] = (NdefMessage) rawMsgs[i];

}

}

}

//process the msgs array

}

完整的一个操作代码摘自Google Android NFC Guide代码(略加注释):

package com.example.android.beam;

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.widget.TextView;

import

import java.nio.charset.Charset;

//继承并实现接口CreateNdefMessageCallback方法

createNdefMessage

public class Beam extends Activity implements CreateNdefMessageCallback {

NfcAdapter mNfcAdapter;

TextView textView;

@Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(https://www.wendangku.net/doc/639777961.html,yout.main);

TextView textView = (TextView)

findViewById(R.id.textView);

// Check for available NFC Adapter

//检测是否有NFC适配器

mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) {

Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show();

finish();

return;

}

// Register callback

//注册回调函数

mNfcAdapter.setNdefPushMessageCallback(this, this);

}

@Override

public NdefMessage createNdefMessage(NfcEvent event) { String text = ("Beam me up, Android!\n\n" +

"Beam Time: " + System.currentTimeMillis());

//回调函数,构造NdefMessage格式

NdefMessage msg = new NdefMessage(

new NdefRecord[] { createMimeRecord(

"application/com.example.android.beam",

text.getBytes())

//,NdefRecord.createApplicationRecord("com.example.and roid.beam")

});

return msg;

}

@Override

public void onResume() {

super.onResume();

// Check to see that the Activity started due to an Android Beam

//得到是否检测到ACTION_NDEF_DISCOVERED触发

if

(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent(). getAction())) {

processIntent(getIntent());

}

}

//重载Activity类方法处理当新Intent到来事件

@Override

public void onNewIntent(Intent intent) {

// onResume gets called after this to handle the intent setIntent(intent);

}

//关键处理函数,处理扫描到的NdefMessage

void processIntent(Intent intent) {

textView = (TextView) findViewById(R.id.textView);

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

textView.setText(new

String(msg.getRecords()[0].getPayload()));

}

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;

}

}

上面代码还需要在AndroidManifest.xml文件里面添加

android:name="android.nfc.action.NDEF_DISCOVERED"/>

android:name="android.intent.category.DEFAULT"/>

android:mimeType="application/com.example.android.beam "/>

在对NFC设备进行写操作的时候,相关代码:

private void enableTagWriteMode() {

mWriteMode = true;

IntentFilter tagDetected = new

IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);

mWriteTagFilters = new IntentFilter[] { tagDetected };

mNfcAdapter.enableForegroundDispatch(this,

mNfcPendingIntent, mWriteTagFilters, null);

}

@Override

protected void onNewIntent(Intent intent) {

// Tag writing mode

if (mWriteMode &&

NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getActi on())) {

Tag detectedTag =

intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

if

(NfcUtils.writeTag(NfcUtils.getPlaceidAsNdef(placeidTo Write), detectedTag)) {

Toast.makeText(this, "Success: Wrote placeid to nfc tag", Toast.LENGTH_LONG)

.show();

NfcUtils.soundNotify(this);

} else {

Toast.makeText(this, "Write failed",

Toast.LENGTH_LONG).show();

}

}

}

public static boolean writeTag(NdefMessage message, Tag tag) {

int size = message.toByteArray().length;

try {

Ndef ndef = Ndef.get(tag);

if (ndef != null) {

ndef.connect();

if (!ndef.isWritable()) {

return false;

}

if (ndef.getMaxSize() < size) {

return false;

}

ndef.writeNdefMessage(message);

return true;

} else {

NdefFormatable format = NdefFormatable.get(tag);

if (format != null) {

try {

format.connect();

format.format(message);

return true;

} catch (IOException e) {

return false;

}

} else {

return false;

}

}

} catch (Exception e) {

return false;

}

}

相关的AndroidManifest.xml文件配置如下:

android:name="android.nfc.action.NDEF_DISCOVERED"/>

android:mimeType="application/vnd.facebook.places"/>

android:name="android.intent.category.DEFAULT"/>

参考文章:

参考文章:

https://www.wendangku.net/doc/639777961.html,/guide/topics/nfc/nfc.html

https://www.wendangku.net/doc/639777961.html,/questions/5078649/android-nfc-sample-demo-reads-only-fake-inform ation-from-the-tag

https://www.wendangku.net/doc/639777961.html,/guide/topics/nfc/index.html

https://www.wendangku.net/doc/639777961.html,/11/0714/09/78TPVJOL00253CVK.html

https://www.wendangku.net/doc/639777961.html,/jfttcjl/archive/2011/11/09/2242045.html

https://www.wendangku.net/doc/639777961.html,/blog/how-to-nfc-on-the-android-platform/

另外有几个专门推动NFC技术的联盟:

https://www.wendangku.net/doc/639777961.html,/wp/nfchal/

https://www.wendangku.net/doc/639777961.html,/theme/nfc/

https://www.wendangku.net/doc/639777961.html,/home/

官方关于NFC的翻译文档见:

https://www.wendangku.net/doc/639777961.html,/nicebooks/article/details/6223956

参考库:

https://www.wendangku.net/doc/639777961.html,/p/guava-libraries/

Android简单的登陆界面的设计开发

通信实训报告 -Android移动平台开发 学院:信息工程学院 班级: 学号: 姓名:

实训内容: 一.1.Andriod的简介 Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前,最新版本为Android 2.4 Gingerbread 和Android 3.0 Honeycomb。 Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 Android早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张,在智能MP4方面也有较大发展。采用Android系统主要厂商包括台湾的HTC,(第一台谷歌的手机G1由HTC生产代工)美国摩托罗拉,SE等,中国大陆厂商如:魅族(M9),华为、中兴、联想、蓝魔等。 2.Android构架图 二.1软件下载 Android SDK,网址是https://www.wendangku.net/doc/639777961.html,. JDK的下载地址https://www.wendangku.net/doc/639777961.html,/javase/downloads/widget/jdk6.jsp。Eclipse的下载网址是https://www.wendangku.net/doc/639777961.html,/downloads/ 2.Android开发环境搭建

基于Android系统的电子书阅读器的设计与实现

4.3.2 建表语句 1)创建: 1、创建书的表: create table IF NOT EXISTS book(bid integer primary key autoincrement,bpath varchar(255) not null); 2、创建书签的表: create table IF NOT EXISTS bookmark(bmid integer primary key autoincrement, bpath varchar(50) not null,bmname varchar(50) not null,bmoffset integer not null,bmsavetime varchar(20) not null); 3、创建用户管理的表: create table IF NOT EXISTS user(userid integer primary key autoincrement, username varchar(20) not null,password varchar(20) not null, telephone varchar(20) not null); 4、创建最近阅读的表 create table IF NOT EXISTS nearlyread(bookid integer primary key autoincrement, bookname varchar(50) not null,bookreadtime varchar(20) not null); 5、创建下载管理的表 create table IF NOT EXISTS down(downid integer primary key autoincrement, downuser varchar(20) not null,downbook varchar(20) not null, downtime varchar(20) not null); 2)SQlite3数据库使用方法: 选择:select from bookmark where bmid=1; 插入:insert (bookmark,null,values); 删除:delete from bookmark where bmid=3 ; 查找:query(table, columns, selection, selectionArgs, groupBy, having, orderBy) 4.3.3 数据表分析 本数据库用的是一个轻量级嵌入型数据库sqlite3 ,即创建了一个数据库reader.db,在数据库中创建了几张数据表。 在建设网站系统或者软件之前,我们必须对系统所用到的数据进行大致的分类和具体的结构设计,既要做到清晰明了,又要能适应系统各项功能的调用,而不至于产生结构上的逻辑混乱,保证关键数据在意外情况下不会被破坏,可以说

android studio 控件常用属性

android studio 控件常用属性 下面是RelativeLayout各个属性 1.android:layout_above="@id/xxx" --将控件置于给定ID控件之上 2.android:layout_below="@id/xxx" --将控件置于给定ID控件之下 3. android:layout_toLeftOf="@id/xxx" --将控件的右边缘和给定ID控件的左边缘对齐 4.android:layout_toRightOf="@id/xxx" --将控件的左边缘和给定ID控件的右边缘对齐 5. android:layout_alignLeft="@id/xxx" --将控件的左边缘和给定ID控件的左边缘对齐 6.android:layout_alignTop="@id/xxx" --将控件的上边缘和给定ID控件的上边缘对齐 7.android:layout_alignRight="@id/xxx" --将控件的右边缘和给定ID控件的右边缘对齐 8.android:layout_alignBottom="@id/xxx" --将控件的底边缘和给定ID控件的底边缘对齐 9.android:layout_alignParentLeft="true" --将控件的左边缘和父控件的左边缘对齐 10. android:layout_alignParentTop="true" --将控件的上边缘和父控件的上边缘对齐 11. android:layout_alignParentRight="true" --将控件的右边缘和父控件的右边缘对齐 12.android:layout_alignParentBottom="true" --将控件的底边缘和父控件的底边缘对齐 13.android:layout_centerInParent="true" --将控件置于父控件的中心位置 14.android:layout_centerHorizontal="true" --将控件置于水平方向的中心位置 15.android:layout_centerVertical="true" --将控件置于垂直方向的中心位置 android:layout_width 设置组件的宽度 android:layout_height 设置组件的高度 android:id 给组件定义一个id值,供后期使用 android:background 设置组件的背景颜色或背景图片 android:text 设置组件的显示文字 android:textColor 设置组件的显示文字的颜色 android:layout_below 组件在参考组件的下面 android:alignTop 同指定组件的顶平行

第4章 Android用户界面设计

视图组件的使用模式 常用组件 高级组件 提示框与警告对话框

就是Android应用程序的开发过程。一般过程是先通过XML布局文件或Java代码创建界面布局,设定组件显示样式,随后获取UI组件对象,并处理组件事件响应。 视图组件的定义 资源的访问 生成视图组件资源标识 视图组件的引用 视图组件的事件响应 组件的常用属性

1.1视图组件的定义 使用XML布局文件定义视图组件 使用Java代码定义视图组件(不推荐)

1.1视图组件的定义 使用XML布局文件定义视图组件 Android平台为大多数视图组件以及其子类提供了XML标记,可通过XML布局文件中的标记来定义视图组件。XML中的每个元素代表了一个组件,即元素名称对应相应的Java类。

1.1视图组件的定义

相关文档
相关文档 最新文档