Android NFC技术(三)——初次开发Android NFC你须知道NdefMessage和NdefRecord


这最近也是有好多天没写博客了,除了到处张罗着搬家之外,依旧还是许许多多的琐事阻碍着学习,加上使用NFC开发,也是需要具有NFC功能的测试机,也到买了一个,所以,也说了两天的概念

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

Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法

今天,咋们就来用一个小栗子做药引,一起进入Android NFC开发的世界,首先,你必须要知道的是这两个类

  • NdefMessage
  • NdefRecord

NdefMessage

主要是描述NDEF格式的信息

NdefRecord

这个是秒速NDEF信息的一个信息段


这两个都是Android NCF技术的核心类,无论是读写NFC标签还是通过Android Beam技术传递数据都需要这两个类

开发步骤

1.获取Tag对象

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

2.判断NFC标签的数格式

Ndef ndef = Ndef.get(tag);

3.写入数据

ndef.wrriteNdefMessage(ndefMessage);

准备工作都做好了,我们就直接来写程序了,我们新建一个程序——NFCDemo

我们的需求是这样的:我们的软件把手机上所有安装好的应用排列,然后我们点击一个就开始拿着这个软件,等我们的NFC标签靠近,就把软件写进去,然后,我们每次只要把NFC标签开进有NFC的手机上就会直接运行我们写入的程序了,这个原理有点儿类似门卡,你的先买一个NFC标签

然后我们就开始写了,大致的情况是这样的,我们主页有一个按钮,点击之后跳转到一个界面,是我们手机安装程序的包名列表,我们选中一个回到主Activity,然后等待NFC标签刷入,成功之后,我们就直接用NFC靠近手机就能启动这个程序了,跟门卡登记,然后开门的道理是一样的

主页是这样的

我们点击之后跳转到ListActivity

ListActivity

package com.lgl.nfcdemo;

import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * 读取手机软件列表
 *
 * @author LGL
 */
public class ListActivity extends android.app.ListActivity implements
        AdapterView.OnItemClickListener {
    //返回码
    private static final int CODE = 1;
    //封装所有软件
    private List<String> mPackage = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //这里继承了ListActivity显示列表,不需要加载layout

        //获取手机上所有的包
        PackageManager manager = getPackageManager();
        //把他们装起来
        List<PackageInfo> packageInfos = manager.getInstalledPackages(PackageManager.GET_ACTIVITIES);
        //遍历
        for (PackageInfo pi : packageInfos) {
            //添加软件名和包名
            mPackage.add(pi.applicationInfo.loadLabel(manager) + "\n" + pi.packageName);
        }

        //官方的适配器
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, mPackage);
        setListAdapter(arrayAdapter);
        //设置单击事件
        getListView().setOnItemClickListener(this);

    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

        Intent intent = new Intent();
        intent.putExtra("package", mPackage.get(i));
        setResult(CODE,intent);
        finish();
    }
}

这段代码应该清晰易懂吧,继承lListActivity,获取手机的应用排列,点击之后携带包名finish();

MainActivity

package com.lgl.nfcdemo;

import android.app.PendingIntent;
import android.content.Intent;
import android.nfc.FormatException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.gms.common.api.GoogleApiClient;

import java.io.IOException;

/**
 * NFC读写
 * Created by lgl on 16/3/1.
 */
public class MainActivity extends AppCompatActivity {

    private Button btn_list;
    //选中的包名
    private String mPackNmae;
    private NfcAdapter mNfcAdapter;
    private PendingIntent mPendingIntent;

    private GoogleApiClient client;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_list = (Button) findViewById(R.id.btn_list);
        //初始化NfcAdapter
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        //初始化PendingIntent
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);

        //点击跳转
        btn_list = (Button) findViewById(R.id.btn_list);
        btn_list.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,ListActivity.class);
                startActivityForResult(intent,1);
            }
        });

    }

    //当设置android:launchMode="singleTop"时调用
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        //没有选择的话就不执行操作了
        if (mPackNmae == null) {
            return;
        }

        //1.获取Tag对象
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        //写入程序
        writeNFC(tag);

    }

    //NFC写入
    private void writeNFC(Tag tag) {
        //null不执行操作,强调写程序的逻辑性
        if (tag == null) {
            return;
        }

        NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord.createApplicationRecord(mPackNmae)});
        //获得写入大小
        int size = ndefMessage.toByteArray().length;
        //2.判断是否是NDEF标签
            try {
                Ndef ndef = Ndef.get(tag);
                if(ndef != null) {
                    //说明是NDEF标签,开始连接
                    ndef.connect();
                    //判断是否可写
                    if(!ndef.isWritable()){
                        Toast.makeText(this, "当前设备不支持写入",Toast.LENGTH_LONG).show();
                        return;
                    }
                    //判断大小
                    if(ndef.getMaxSize() < size){
                        Toast.makeText(this, "容量太小了",Toast.LENGTH_LONG).show();
                        return;
                    }
                    //写入
                    try {
                        ndef.writeNdefMessage(ndefMessage);
                        Toast.makeText(this, "写入成功",Toast.LENGTH_LONG).show();
                    } catch (FormatException e) {
                        e.printStackTrace();
                    }

                }
            } catch (IOException e) {
                e.printStackTrace();

        }
    }

    //使当前窗口置顶,权限高于三重过滤
    @Override
    protected void onResume() {
        super.onResume();

        if (mNfcAdapter != null) {
            //设置当前activity为栈顶
            mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        //恢复栈
        if (mNfcAdapter != null) {
            mNfcAdapter.disableForegroundDispatch(this);
        }
    }

}

这里东西多了点,不过仔细看会发现,也就是一些判断,真正的关键代码就那几句,

layout_main.xml

<?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:fitsSystemWindows="true"
    android:orientation="vertical">

    <Button
        android:layout_marginTop="15dp"
        android:id="@+id/btn_list"
        android:layout_width="200dp"
        android:layout_height="45dp"
        android:text="绑定应用程序"
        android:layout_gravity="center_horizontal" />

    <TextView
        android:gravity="center_horizontal"
        android:textSize="14sp"
        android:text="你可以将NFC标签靠近手机背部"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ImageView
        android:layout_weight="1"
        android:background="@mipmap/nfc"
        android:layout_width="match_parent"
        android:layout_height="0dp" />
</LinearLayout>

我们来简单的运行一下

然后我们靠近NFC就算写入成功了,以后我们只要拿着NFC靠近手机就自动打开我们写入的那个程序了,原理和门卡有点类似,下节接着讲NFC和网络交互的那些事

Demo下载:http://download.csdn.net/detail/qq_26787115/9457135

Android NFC技术(三)——初次开发Android NFC你须知道NdefMessage和NdefRecord的更多相关文章

  1. 【转】android 电池(三):android电池系统

    关键词:android电池系统电池系统架构 uevent power_supply驱动 平台信息: 内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV3 ...

  2. Xamarin Android教程如何使用Xamarin开发Android应用

    Xamarin Android教程如何使用Xamarin开发Android应用 在了解了Xamarin和Andriod系统之后,下面我们需要了解一下如何使用这些工具和系统来开发我们的应用程序. And ...

  3. android 电池(三):android电池系统【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/8709838 一.电池系统结构 Android中的电池使用方式主要有三种:AC.USB. ...

  4. Android笔记--Bitmap(三) 针对不用Android版本的位图管理

    Bitmap(三) | Android不同版本的相应操作 在不同的Android版本中.位图的存储方式是不同的. 1.小于等于 Android 2.2 (API level 8) 垃圾收集器回收内存时 ...

  5. Android笔记(三十三) Android中线程之间的通信(五)Thread、Handle、Looper和MessageQueue

    ThreadLocal 往下看之前,需要了解一下Java的ThreadLocal类,可参考博文: 解密ThreadLocal Looper.Handler和MessageQueue 我们分析一下之前的 ...

  6. Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息

    先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest; import android.app.Activity; import and ...

  7. Android笔记(三十) Android中线程之间的通信(二)Handler消息传递机制

    什么是Handler 之前说过了,Android不允许主线程(MainThread)外的线程(WorkerThread)去修改UI组件,但是又不能把所有的更新UI的操作都放在主线程中去(会造成ANR) ...

  8. Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)

    一.搭建Android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 下载地址:Eclipse:http://www.eclipse.org/downloads/ ...

  9. C#使用Xamarin开发Android应用程序 -- 系列文章

    Xamarin开发Android应用程序 利用Xamaria构建Android应用-公交发车信息屏 Xamarin版的C# SVG路径解析器 C#使用Xamarin开发可移植移动应用(1.入门与Xam ...

随机推荐

  1. 全废话SQL Server统计信息(1)——统计信息简介

    当心空无一物,它便无边无涯.树在.山在.大地在.岁月在.我在.你还要怎样更好的世界?--张晓风<我在> 为什么要写这个内容? 随着工作经历的积累,越来越感觉到,大量的关系型数据库的性能问题 ...

  2. TextView的升级版———AutoCompleteTextView

    TextView的升级版---AutoCompleteTextView AutoCompleteTextView顾名知义,可以自动提示的TextView,还可以提示错误信息. 这里介绍基本的使用,能够 ...

  3. hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

    数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以最好对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能. 而hive中间结果 ...

  4. FORM内置系统变量

    常用 和输入焦点有关: SYSTEM.CURSOR_ITEM:返回系统当前正在操作的项名. SYSTEM.CURSOR_RECORD:返回系统当前正在操作的记录行号. SYSTEM.CURSOR_BL ...

  5. 多线程并发之java内存模型JMM

    多线程概念的引入是人类又一次有效压寨计算机的体现,而且这也是非常有必要的,因为一般运算过程中涉及到数据的读取,例如从磁盘.其他系统.数据库等,CPU的运算速度与数据读取速度有一个严重的不平衡,期间如果 ...

  6. Java基本语法-----java进制的转换

    进制: 进制是一种记数方式 ,可以用有限的数字符号代表所有的数值.由特定的数值组成. 1整型的表现形式 1.十进制: 都是以0-9这九个数字组成,不能以0开头. 2.二进制: 由0和1两个数字组成. ...

  7. 如何查看App provision profile文件中的钥匙链访问组名称

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们因为某些原因希望安全的在多个App中共享一些信息,我们可以 ...

  8. 剑指Offer——归并排序思想应用

    剑指Offer--归并排序思想应用 前言 在学习排序算法时,初识归并排序,从其代码量上感觉这个排序怎么这么难啊.其实归并排序的思想很简单:将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列 ...

  9. 【Netty源码分析】Reactor线程模型

    1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比 ...

  10. Android初级教程:shape的基本用法

    转载本文请注明出处:http://blog.csdn.net/qq_32059827/article/details/52203347   点击打开链接 在自定义进度条之前,先来学习一下shape的用 ...