在Android中使用NFC的第一步

1425864749_nfc-256 这篇文章介绍了如何在Android中使用NFC 。 NFC技术代表近场通信,您可以在NFC论坛上找到该规范。 在第一篇文章中,我们将分析NFC的一些基本方面,并描述如何在Android中实现可处理NFC标签的应用。

如果您想尝试NFC,可以在几个网站上以几欧元的价格购买NFC。

NFC可以在不同的情况下使用:我们可以在家里在家时使用它来打开妻子或执行任务操作等。

我们将把注意力集中在作为特殊类型NFC标签的NDEF数据上。 使用NFC之前,我们必须遵循一些基本步骤。

NFC过滤器

当我们使用NFC标签时,我们想要的第一件事是当我们靠近NFC标签时会通知我们的应用程序。 为此,我们使用了意图过滤器 。 Android SDK提供了三种不同的过滤器,我们可以在不同的优先级下使用它们:

  • ACTION_NDEF_DISCOVERED
  • ACTION_TECH_DISCOVERED
  • ACTION_TAG_DISCOVERED

我们将注意力集中在具有最高优先级的ACTION_NDEF_DISCOVERED上 。 如上所述,我们的目标是在智能手机靠近NFC标签时得到通知,并且,如果我们仅安装了此应用程序并能够处理此NFC标签,则希望该应用程序立即启动。 为此,我们在Manifest.xml中注册过滤器:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.survivingwithandroid.nfc" >

    ....
     <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data  android:mimeType="text/plain"/>
     </intent-filter>
<manifest>

在第6行,我们注册了我们的应用程序,以便可以通过ACTION_NDEF_DISCOVERED通知ACTION_NDEF_DISCOVERED 。 我们可以使用不同类型的过滤器,在本示例中(第8行),我们使用了mime type 。 换句话说,当发现NFC标签NDEF且其MIME类型为text / plain时,我们的应用将启动。 我们可以使用几种MIME类型进行过滤,而不仅仅是文本/疼痛。 此外,我们可以使用其他类型的过滤器,例如android:scheme,以使用协议或字符串模式进行过滤。

NFC前景调度

如果我们的应用程序不在前台,则可以使用意图进行过滤。 如果我们的应用程序在前台运行,并且将我们的智能手机移近NFC标签,则不会收到通知。 在这种情况下,我们必须使用另一种称为NFC前景调度的技术。 第一步是在我们的代码中定义意图过滤器(就像在manifest.xml中一样):

@Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        Intent nfcIntent = new Intent(this, getClass());
        nfcIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

        nfcPendingIntent =
                PendingIntent.getActivity(this, 0, nfcIntent, 0);

        IntentFilter tagIntentFilter =
                new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try {
            tagIntentFilter.addDataType("text/plain");
            intentFiltersArray = new IntentFilter[]{tagIntentFilter};
        }
        catch (Throwable t) {
            t.printStackTrace();
        }
    }

现在我们必须注册我们的过滤器,并以这种方式在onResume方法中进行操作:

protected void onResume() {
        super.onResume();
       nfcAdpt.enableForegroundDispatch(
                this,
                nfcPendingIntent,
                intentFiltersArray,
                null);
        handleIntent(getIntent());
    }

同样,我们还应该记住,一旦应用程序进入后台,并且在onPause方法中执行此操作的最佳位置,就应立即禁用前台调度。

@Override
    protected void onPause() {
        super.onPause();
        nfcAdpt.disableForegroundDispatch(this);
    }

其中nfcAdpt是NFC适配器。

使用NFCAdapter处理NFC

创建过滤器后,我们必须与智能手机中的NFC组件进行交互。 为此,我们使用Android SDK提供的NfcAdapter 。 使用此类,我们可以检查例如我们的智能手机是否支持NFC或NFC是打开还是关闭:

@Override
    protected void onCreate(Bundle savedInstanceState) {
       ...
       nfcAdpt = NfcAdapter.getDefaultAdapter(this);
       // Check if the smartphone has NFC
       if (nfcAdpt == null) {
            Toast.makeText(this, "NFC not supported", Toast.LENGTH_LONG).show();
            finish();
       }
       // Check if NFC is enabled
       if (!nfcAdpt.isEnabled()) {
            Toast.makeText(this, "Enable NFC before using the app", Toast.LENGTH_LONG).show();
       }
    }

NFC数据:有效负载

一旦知道了如何处理NFC标签,便要读取标签内容。 NFC规范中定义了几种类型的内容:

  • NFC论坛知名类型
  • 媒体类型
  • 绝对URI
  • NFC论坛外部类型

每种类型都有其自己的有效负载。 一般来说,NFC NDEF数据由Message组成。 一条消息可以包含一个或多个记录 。 每条记录由标题和有效载荷 (真实信息)组成。 现在,如果我们想读取NFC NDEF标签内的数据,可以使用:

@Override
    public void onNewIntent(Intent intent) {
        Log.d("Nfc", "New intent");
        getTag(intent);
    }

    private void getTag(Intent i) {
        if (i == null)
            return ;

        String type = i.getType();
        String action = i.getAction();
        List dataList = new ArrayList();

        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
            Log.d("Nfc", "Action NDEF Found");
            Parcelable[] parcs = i.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

            for (Parcelable p : parcs) {
                recNumberTxt.setText(String.valueOf(numRec));
                NdefRecord[] records = msg.getRecords();
                for (NdefRecord record: records) {
                    short tnf = record.getTnf();
                    // Here we handle the payload

                }
            }
       }
    }

翻译自: https://www.javacodegeeks.com/2015/03/first-steps-with-nfc-in-android.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值