ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Android NFC在启动应用程序时传递单个参数

2019-05-28 10:10:56  阅读:339  来源: 互联网

标签:android tags nfc ndef android-applicationrecord


我想使用NFC标签启动应用程序.我使用Android应用程序记录(AAR)(如Start Android application from NFC-tag with extra data中所述)或使用NDEF_DISCOVERED / TECH_DISCOVERED意图过滤器来使用该部分.但是,在通过NFC事件启动时,如何将NFC标签(例如某些文本)中的数据传递给我的活动?

我已经阅读了NFC Basics,但据我所知,似乎想要实现一种读取标签的机制,当我真的不想在标签打开应用程序后重新读取标签,而是我只想要同时传入数据.

此外,这些机制似乎允许应用程序在标记启动后读取标记.换句话说,我担心如果有人在应用程序打开后再点击标签,那么标签将再次被读取(这是我不想要的).

其次,我如何创建这样的NDEF消息?

解决方法:

Android会自动读取NFC标签的NDEF消息并进行处理

>根据第一个NDEF记录开始注册活动,和
>在NDEF消息中的任何位置启动基于Android应用程序记录(AAR)的应用程序.

为了让您的活动开始并让Android传递预读NDEF消息,您可以使用NDEF_DISCOVERED意图过滤器:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="vnd.android.nfc"
        android:host="ext"
        android:pathPrefix="/example.com:mycustomtype"/>
</intent-filter>

然后从您的活动中,您可以处理该NDEF消息:

public void onResume() {
    super.onResume();
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
        NdefMessage[] msgs = null;
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMsgs != null) {
            msgs = new NdefMessage[rawMsgs.length];
            for (int i = 0; i < rawMsgs.length; ++i) {
                msgs[i] = (NdefMessage)rawMsgs[i];
            }
        }

        if ((msgs != null) && (msgs.length > 0)) {
            NdefRecord[] records = msgs[0].getRecords();
            NdefRecord firstRecord = records[0];
            byte[] payloadData = firstRecord.getPayload();

            // do something with the payload (data passed through your NDEF record)
            // or process remaining NDEF message

        }
    }
}

请注意,只要您的活动成为前台活动,就会运行onResume().因此,对于相同的标签,它可能会运行多次.因此,您可以使用其他生命周期方法,也可以采取一些不会多次解析消息的预防措施.

如果您想要放弃所有进一步的NFC事件,一旦您的活动打开,您可以按照我在回复Android app enable NFC only for one Activity时所描述的方法.因此,您将注册前台调度(这使您的活动优先接收NFC事件,以及然后,您可以简单地删除这些事件.

public void onResume() {
    super.onResume();
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}

public void onPause() {
    super.onPause();
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    nfcAdapter.disableForegroundDispatch(this);
}

public void onNewIntent(Intent intent) {
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
        // drop NFC events
    }
}

最后,要为NFC标签创建NDEF消息,您可以执行以下操作:

byte[] payload = ...  // generate your data payload
NdefMessage msg = new NdefMessage(
    NdefRecord.createExternal("example.com", "mycustomtype", payload)
)

如果您想确保只有您的应用是通过此标记启动的(或者如果没有为您的应用打开Play Store,则还可以添加AAR:

NdefMessage msg = new NdefMessage(
    NdefRecord.createExternal("example.com", "mycustomtype", payload),
    NdefRecord.createApplicationRecord("com.example.your.app.package")
)

标签:android,tags,nfc,ndef,android-applicationrecord
来源: https://codeday.me/bug/20190528/1170132.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有