android - 仅适用于特定 NFC 标签的应用程序

标签 android tags nfc intentfilter uniqueidentifier

我当前的 Android 应用程序可以识别任何 NFC 标签并执行所需的功能。但是,我希望它只适用于具有特定 UID 的特定标签。实现此目标的最佳方法是什么?

相关标签的 UID 是:046a0b42402b84

我的 NFC 功能代码如下:

public class NFC extends AppCompatActivity {

    NfcAdapter nfcAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_nfc);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        String username = getIntent().getStringExtra("Username");

        TextView tv = (TextView) findViewById(R.id.TVusername);
        tv.setText(username);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }


        });

       nfcAdapter = NfcAdapter.getDefaultAdapter(this);

        if(nfcAdapter!=null && nfcAdapter.isEnabled()) {

        }else{
            finish();
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {

        Toast.makeText(this, "NFC intent received!", Toast.LENGTH_LONG).show();

        super.onNewIntent(intent);
    }

        @Override
        protected void onResume() {

        Intent intent = new Intent(this, AttendanceRegistration.class);
        intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,  0);
        IntentFilter[] intentFilter = new IntentFilter[]{};

        nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFilter, null);

         super.onResume();
     }


    @Override
    protected void onPause() {

        nfcAdapter.disableForegroundDispatch(this);

        super.onPause();
    }

         @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

最佳答案

Android 不允许通过 UID/防冲突标识符/序列号为特定标签注册 NFC 标签检测通知。如果您希望您的应用程序仅由特定的 NFC 标签启动(通过在 ANdroidManifest.xml 中注册 Intent 过滤器),您需要存储 NDEF 消息(包含您可以过滤的自定义 NDEF 记录或和 Android 应用程序记录)在标签上

如果您不希望您的应用程序通过标签启动,并且只想在您的 Activity 在前台时检测标签(您的代码已经尝试通过注册前台调度系统来执行此操作),您可以接收所有已发现标签的通知,并根据标签的 UID 简单地过滤标签。

首先,您需要正确注册前台调度系统以接收任何标签的通知(请注意,您不能为另一个 Activity 注册带有 PendingIntent 的前台调度!):

@Override
protected void onResume() {
    super.onResume();

    Intent intent = new Intent(this, getClass());
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,  0);
    nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}

然后您可以在 onNewIntent 中接收 NFC 发现 Intent 并根据标签 UID 过滤它们:

@Override
protected void onNewIntent(Intent intent) {
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction()) ||
        NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()) ||
        NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

        byte[] uid = tag.getId();
        byte[] referenceUid = new byte[]{ (byte)0x04, (byte)0x6a, (byte)0x0b, (byte)0x42, (byte)0x40, (byte)0x2b, (byte)0x84 };

        if (Arrays.equals(referenceUid, uid)) {
            // do something
        }
    }
}

关于android - 仅适用于特定 NFC 标签的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36404316/

相关文章:

css - 如何在div旁边制作div

css - 如何左对齐来 self 的 Magento 商店页脚处的 cms block 的 IMG 元素

swift - 使用 CryptoTokenKit 读取 NFC (Mifare Classic 1K)

html - 在 XSLT 中打开和关闭 HTML 标记

javascript - Windows Phone 写入 NFC 标签

nfc - 无法验证 NTAG213

java - 握手后 SSLSocket getOutputStream() 阻塞

Android 传感器偏航、俯仰和滚转

android - 纹理不会出现使用 native 代码在 android 上使用 opengl es 加载它

android - 如何在Android中检查Retrofit API调用是否成功