NFC官方文档学习笔记:NFC前台调度

Posted 事在人为,幸福从不抱怨开始!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NFC官方文档学习笔记:NFC前台调度相关的知识,希望对你有一定的参考价值。

android开发官网看下下NFC相关知识,发现在网上相关的介绍也非常多,我也滥竽充数地写一个学习记录,就是官方API DEMO中的COPY版本。
/**
 * NFC前台调度: 读取NDEF数据:一个NFC标签处理与标签的调度系统,分析发现的NFC标签,适当
 * 地对数据进行分类,并启动一个应用程序。在分类的数据中,要处理扫描NFC标签 的应用程序可以声明一个 intent filter来处理数据请求。
 * */
public class ForegroundDispatch extends Activity 
    // NfcAdapter相当于一个NFC适配器,就如同电脑装了网络适配器才可以上网一样,手机上装有NfcAdapter才能使用和NFC相应功能。
    private NfcAdapter mAdapter;
    // pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。
    private PendingIntent mPendingIntent;
    // IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。
    private IntentFilter[] mFilters;
    private String[][] mTechLists;
    private TextView mText;
    private int mCount = 0;

    @Override
    public void onCreate(Bundle savedState) 
        super.onCreate(savedState);
        setContentView(R.layout.foreground_dispatch);
        mText = (TextView) findViewById(R.id.text);
        mText.setText("Scan a tag");
        // NFC前台调度第一步:获取NFC适配器
        // 大部分Android设备只支持一个NFC Adapter,所以一般直接调用getDefaultAapater来获取手机中的Adapter。
        mAdapter = NfcAdapter.getDefaultAdapter(this);

        // 创建一个 PendingIntent, Android系统就能在一个tag被检测到时定位到这个对象
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        // 创建一个IntentFilter来过滤action
        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try 
            // 添加过滤的数据类型
            ndef.addDataType("*/*");
         catch (MalformedMimeTypeException e) 
            throw new RuntimeException("fail", e);
        
        mFilters = new IntentFilter[]  ndef, ;

        // 建立NFC s
        mTechLists = new String[][]  new String[]  NfcF.class.getName()  ;
    

    @Override
    public void onResume() 
        super.onResume();
        // NFC前台调度第二步:在onResume()方法中启动前台调度功能
        // 设定intentfilter和tech-list。如果两个都为null就代表优先接收任何形式的TAG
        // action。也就是说系统会主动发TAG intent。
        if (mAdapter != null)
            mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters,
                    mTechLists);
    

    @Override
    public void onNewIntent(Intent intent) 
        // 在onNewIntent()用来处理intent数据
        mText.setText("Discovered tag " + ++mCount + " with intent: " + intent);
    

    @Override
    public void onPause() 
        super.onPause();
        // NFC前台调度第二步: 在Pause()方法中禁用NFC前台调用功能
        if (mAdapter != null)
            mAdapter.disableForegroundDispatch(this);
    

/**
 * NFC前台调度: 读取NDEF数据:一个NFC标签处理与标签的调度系统,分析发现的NFC标签,适当
 * 地对数据进行分类,并启动一个应用程序。在分类的数据中,要处理扫描NFC标签 的应用程序可以声明一个 intent filter来处理数据请求。
 * */
public class ForegroundDispatch extends Activity 
    // NfcAdapter相当于一个NFC适配器,就如同电脑装了网络适配器才可以上网一样,手机上装有NfcAdapter才能使用和NFC相应功能。
    private NfcAdapter mAdapter;
    // pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。
    private PendingIntent mPendingIntent;
    // IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。
    private IntentFilter[] mFilters;
    private String[][] mTechLists;
    private TextView mText;
    private int mCount = 0;

    @Override
    public void onCreate(Bundle savedState) 
        super.onCreate(savedState);
        setContentView(R.layout.foreground_dispatch);
        mText = (TextView) findViewById(R.id.text);
        mText.setText("Scan a tag");
        // NFC前台调度第一步:获取NFC适配器
        // 大部分Android设备只支持一个NFC Adapter,所以一般直接调用getDefaultAapater来获取手机中的Adapter。
        mAdapter = NfcAdapter.getDefaultAdapter(this);

        // 创建一个 PendingIntent, Android系统就能在一个tag被检测到时定位到这个对象
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        // 创建一个IntentFilter来过滤action
        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try 
            // 添加过滤的数据类型
            ndef.addDataType("*/*");
         catch (MalformedMimeTypeException e) 
            throw new RuntimeException("fail", e);
        
        mFilters = new IntentFilter[]  ndef, ;

        // 建立NFC s
        mTechLists = new String[][]  new String[]  NfcF.class.getName()  ;
    

    @Override
    public void onResume() 
        super.onResume();
        // NFC前台调度第二步:在onResume()方法中启动前台调度功能
        // 设定intentfilter和tech-list。如果两个都为null就代表优先接收任何形式的TAG
        // action。也就是说系统会主动发TAG intent。
        if (mAdapter != null)
            mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters,
                    mTechLists);
    

    @Override
    public void onNewIntent(Intent intent) 
        // 在onNewIntent()用来处理intent数据
        mText.setText("Discovered tag " + ++mCount + " with intent: " + intent);
    

    @Override
    public void onPause() 
        super.onPause();
        // NFC前台调度第二步: 在Pause()方法中禁用NFC前台调用功能
        if (mAdapter != null)
            mAdapter.disableForegroundDispatch(this);
    

/**
 * NFC前台调度: 读取NDEF数据:一个NFC标签处理与标签的调度系统,分析发现的NFC标签,适当
 * 地对数据进行分类,并启动一个应用程序。在分类的数据中,要处理扫描NFC标签 的应用程序可以声明一个 intent filter来处理数据请求。
 * */
public class ForegroundDispatch extends Activity 
    // NfcAdapter相当于一个NFC适配器,就如同电脑装了网络适配器才可以上网一样,手机上装有NfcAdapter才能使用和NFC相应功能。
    private NfcAdapter mAdapter;
    // pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。
    private PendingIntent mPendingIntent;
    // IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。
    private IntentFilter[] mFilters;
    private String[][] mTechLists;
    private TextView mText;
    private int mCount = 0;

    @Override
    public void onCreate(Bundle savedState) 
        super.onCreate(savedState);
        setContentView(R.layout.foreground_dispatch);
        mText = (TextView) findViewById(R.id.text);
        mText.setText("Scan a tag");
        // NFC前台调度第一步:获取NFC适配器
        // 大部分Android设备只支持一个NFC Adapter,所以一般直接调用getDefaultAapater来获取手机中的Adapter。
        mAdapter = NfcAdapter.getDefaultAdapter(this);

        // 创建一个 PendingIntent, Android系统就能在一个tag被检测到时定位到这个对象
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        // 创建一个IntentFilter来过滤action
        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try 
            // 添加过滤的数据类型
            ndef.addDataType("*/*");
         catch (MalformedMimeTypeException e) 
            throw new RuntimeException("fail", e);
        
        mFilters = new IntentFilter[]  ndef, ;

        // 建立NFC s
        mTechLists = new String[][]  new String[]  NfcF.class.getName()  ;
    

    @Override
    public void onResume() 
        super.onResume();
        // NFC前台调度第二步:在onResume()方法中启动前台调度功能
        // 设定intentfilter和tech-list。如果两个都为null就代表优先接收任何形式的TAG
        // action。也就是说系统会主动发TAG intent。
        if (mAdapter != null)
            mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters,
                    mTechLists);
    

    @Override
    public void onNewIntent(Intent intent) 
        // 在onNewIntent()用来处理intent数据
        mText.setText("Discovered tag " + ++mCount + " with intent: " + intent);
    

    @Override
    public void onPause() 
        super.onPause();
        // NFC前台调度第二步: 在Pause()方法中禁用NFC前台调用功能
        if (mAdapter != null)
            mAdapter.disableForegroundDispatch(this);
    

/**
 * NFC前台调度: 读取NDEF数据:一个NFC标签处理与标签的调度系统,分析发现的NFC标签,适当
 * 地对数据进行分类,并启动一个应用程序。在分类的数据中,要处理扫描NFC标签 的应用程序可以声明一个 intent filter来处理数据请求。
 * */
public class ForegroundDispatch extends Activity 
    // NfcAdapter相当于一个NFC适配器,就如同电脑装了网络适配器才可以上网一样,手机上装有NfcAdapter才能使用和NFC相应功能。
    private NfcAdapter mAdapter;
    // pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。
    private PendingIntent mPendingIntent;
    // IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。
    private IntentFilter[] mFilters;
    private String[][] mTechLists;
    private TextView mText;
    private int mCount = 0;

    @Override
    public void onCreate(Bundle savedState) 
        super.onCreate(savedState);
        setContentView(R.layout.foreground_dispatch);
        mText = (TextView) findViewById(R.id.text);
        mText.setText("Scan a tag");
        // NFC前台调度第一步:获取NFC适配器
        // 大部分Android设备只支持一个NFC Adapter,所以一般直接调用getDefaultAapater来获取手机中的Adapter。
        mAdapter = NfcAdapter.getDefaultAdapter(this);

        // 创建一个 PendingIntent, Android系统就能在一个tag被检测到时定位到这个对象
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        // 创建一个IntentFilter来过滤action
        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try 
            // 添加过滤的数据类型
            ndef.addDataType("*/*");
         catch (MalformedMimeTypeException e) 
            throw new RuntimeException("fail", e);
        
        mFilters = new IntentFilter[]  ndef, ;

        // 建立NFC s
        mTechLists = new String[][]  new String[]  NfcF.class.getName()  ;
    

    @Override
    public void onResume() 
        super.onResume();
        // NFC前台调度第二步:在onResume()方法中启动前台调度功能
        // 设定intentfilter和tech-list。如果两个都为null就代表优先接收任何形式的TAG
        // action。也就是说系统会主动发TAG intent。
        if (mAdapter != null)
            mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters,
                    mTechLists);
    

    @Override
    public void onNewIntent(Intent intent) 
        // 在onNewIntent()用来处理intent数据
        mText.setText("Discovered tag " + ++mCount + " with intent: " + intent);
    

    @Override
    public void onPause() 
        super.onPause();
        // NFC前台调度第二步: 在Pause()方法中禁用NFC前台调用功能
        if (mAdapter != null)
            mAdapter.disableForegroundDispatch(this);
    

不要忘记在清单文件中添加NFC权限:

  <uses-permission android:name="android.permission.NFC" />

以上是关于NFC官方文档学习笔记:NFC前台调度的主要内容,如果未能解决你的问题,请参考以下文章

Android NFC详解(高级)

Android NFC 标签读写Demo与历史漏洞概述

Android NFC 标签读写Demo与历史漏洞概述

NFC在Android中的应用

在我的应用程序中读取 iOS 13 NFC 前台标签,同时读取 iOS 后台

Android NFC:使用 transceive() 时出现异常“transceive failed”