【问题标题】:Nfc and Intent-filterNfc 和意图过滤器
【发布时间】:2014-12-21 17:29:27
【问题描述】:

我写了一个这样的nfc文本标签

myscheme://company?page=2&poiId=140

然后我在清单文件中创建了一个像这样的 Intent-filter,以便打开我的应用程序(然后使用标签中的信息调用 WS)

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

如果我从数据标签中删除 schemehost 参数,那么一切正常,但是通过添加过滤它就不再起作用了。

为什么?

有解决办法吗?

【问题讨论】:

    标签: android nfc intentfilter ndef


    【解决方案1】:

    正如corvairjo 正确写的那样,“您将记录类型 MIME 类型(此处为 text/plain)与记录类型 URI 混合到一个意图过滤器中。您应该只使用一个。

    重点是 NDEF 记录由类型信息和数据负载组成(实际上不止这两个字段,但这两个应该足以理解其背后的概念):

    +------+---------+
    | TYPE | PAYLOAD |
    +------+---------+
    

    如果你创建一个包含你的 URI 的文本记录,你会得到这样的东西:

    +------------+-------------------------------------+
    | text/plain | myscheme://company?page=2&poiId=140 |
    +------------+-------------------------------------+
    

    接收设备将根据其类型字段解释记录。因此,它会将有效负载 ("myscheme://company?page=2&poiId=140") 视为一段人类可读的文本 - 而视为 URI!

    在 Android 上,这意味着记录被检测为一条 MIME 媒体类型为“text/plain”的人类可读信息。因此,您只能使用这样的意图过滤器来捕获它:

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

    由于数据负载是人类可读的文本,因此 Intent 过滤器无法过滤该文本的任何特定部分(Android 上的 Intent 过滤器只能匹配类型信息和 URI)。

    因此,如果您希望有一个与 URI 匹配的意图过滤器,则必须将 URI 包装到一个记录类型中,该记录类型专门将数据负载标识为 URI。这通常使用 NFC 论坛 URI 记录类型来完成:

    +---------------+-------------------------------------+
    | urn:nfc:wkt:U | myscheme://company?page=2&poiId=140 |
    +---------------+-------------------------------------+
    

    标签编写器应用程序通常提供将 URI/URL 写入标签的选项。 Android NFC API 提供了NdefRecord.createUri() 方法来创建URI 记录。

    然后您可以使用这样的意图过滤器来触发包含记录的标签:

    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="myscheme" android:host="company" />
    </intent-filter>
    

    【讨论】:

    • 其实用最后一个intent-filter,是不行的。当检测到标签时,这不是我正在运行的应用程序,而是一个谷歌应用程序。我可以看到以下消息 ==> ActivityManager : {act=android.nfc.action.TECH_DISCOVERED cmp=com.google.android.tag/com.android.apps.tag.TagViewer (has extras)}
    • @aat 那么你没有使用 URI 记录将你的 URI 存储在标签上。
    • 我认为你是对的,但我如何指定 uri 记录?我使用以下应用程序存储标签 (play.google.com/store/apps/details?id=com.tagstand.writer) 但没有关于 uri 记录的信息。你知道另一个应用程序还是我应该创建我的应用程序?
    • @aat 您是否费心阅读我的回答?您是否尝试过该应用的“创建网站标签”功能来编写 URL?
    • 是的,我已经阅读了你的答案,我已经知道了,但是我不明白我的问题,是的,我已经尝试过“创建网站标签”
    【解决方案2】:

    您正在将记录类型 MIME 类型(此处为 text/plain)与记录类型 URI 混合到一个意图过滤器中。你应该只使用一个。

    您可以删除 MIME 类型定义,直接使用 URI 定义:

    <data android:scheme="myscheme" android:host="company"/>
    

    【讨论】:

    • 它不起作用。如果我只添加您的信息,我没有注册处理 NDEF 的活动,这是运行的默认 android 应用程序。 ActivityManager : {act=android.nfc.action.TECH_DISCOVERED cmp=com.google.android.tag/com.android.apps.tag.TagViewer (has extras)}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多