首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何读取NFC标签?

如何读取NFC标签?
EN

Stack Overflow用户
提问于 2012-09-07 15:24:18
回答 4查看 4.2K关注 0票数 1

嗨,我正在尝试从NFC标签中读取。但我得到了一个例外。

我已经把这个条件检测到标签了吗?

代码语言:javascript
复制
if(NfcAdapter.ACTION_TAG_DISCOVERED != null)

这个条件是否正确?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-07 15:30:39

回答你关于代码的问题-

这总是正确的-- NfcAdapter.ACTION_TAG_DISCOVERED是一个常量值--你需要使用:

代码语言:javascript
复制
getIntent().getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED) 

来比较一下。

但是,这可能与你的例外无关-

  1. 您是否在安卓清单中包含了NFC权限?
  2. 您是否确定您的手机支持NFC,目前只有两三个支持。
  3. 我们需要您日志中的堆栈跟踪来了解导致异常的原因
票数 2
EN

Stack Overflow用户

发布于 2015-02-17 23:48:31

首先,您必须初始化NFC适配器,并在onCreate回调中定义挂起的意图:

代码语言:javascript
复制
NfcAdapter mAdapter;
PendingIntent mPendingIntent;
mAdapter = NfcAdapter.getDefaultAdapter(this);

if (mAdapter == null) {
    //nfc not support your device.
    return;
}
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
    getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

在onResume()回调中,启用前台调度以检测NFC意图。

代码语言:javascript
复制
mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);

在onPause()回调中,您必须禁用forground调度:

代码语言:javascript
复制
if (mAdapter != null) {
    mAdapter.disableForegroundDispatch(this);
}

在onNewIntent()回调方法中,您将获得新的Nfc意图。在获得意图之后,您必须解析意图以检测卡:

代码语言:javascript
复制
@Override
protected void onNewIntent(Intent intent) {
    getTagInfo(intent)
}

private void getTagInfo(Intent intent) {
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    String[] techList = tag.getTechList();
    for (int i = 0; i<techList.length; i++) {
        if (techList[i].equals(MifareClassic.class.getName())) {

            MifareClassic mifareClassicTag = MifareClassic.get(tag);
            switch (mifareClassicTag.getType()) {
                case MifareClassic.TYPE_CLASSIC:
                    //Type Clssic
                    break;
                case MifareClassic.TYPE_PLUS:
                    //Type Plus
                    break;
                case MifareClassic.TYPE_PRO:
                    //Type Pro
                    break;
            }
        } else if (techList[i].equals(MifareUltralight.class.getName())) {
            //For Mifare Ultralight
            MifareUltralight mifareUlTag = MifareUltralight.get(tag);
            switch (mifareUlTag.getType()) {
                case MifareUltralight.TYPE_ULTRALIGHT:
                    break;
                case MifareUltralight.TYPE_ULTRALIGHT_C:

                    break;
            }
        } else if (techList[i].equals(IsoDep.class.getName())) {
            // info[1] = "IsoDep";
            IsoDep isoDepTag = IsoDep.get(tag);

        } else if (techList[i].equals(Ndef.class.getName())) {
            Ndef.get(tag);

        } else if (techList[i].equals(NdefFormatable.class.getName())) {

            NdefFormatable ndefFormatableTag = NdefFormatable.get(tag);

        }
    }
}

完整的代码是here

票数 3
EN

Stack Overflow用户

发布于 2012-09-18 06:54:40

这句话永远是正确的。

我已经创建了一个project,它有一个样板项目,用于在正确的轨道上运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12313596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档