- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试读取 NFC 标签,如果标签只有文本,则读取很顺利。但是,如果标签包含 URL 或为空,则它不起作用。我认为问题出在 nfc_filter.xml 文件上。
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:mimeType="*/*" />
</intent-filter>
Python代码:
def nfc_init(self):
activity.bind(on_new_intent=self.on_new_intent)
self.j_context = context = PythonActivity.mActivity
self.nfc_adapter = NfcAdapter.getDefaultAdapter(context)
self.nfc_pending_intent = PendingIntent.getActivity(context, 0, Intent(context, context.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0)
return True
def on_new_intent(self, intent):
print 'on_new_intent()', intent.getAction()
# get TAG details
tag = cast('android.nfc.Tag', intent.getParcelableExtra(NfcAdapter.EXTRA_TAG))
details = self.get_ndef_details(tag)
def on_pause(self):
print 'paused'
return True
def on_resume(self):
print 'resumed'
我想要的是,当我的应用程序处于 Activity 状态并且您读取了 NFC 标签时,它总是会收到 Intent 。现在我可以在日志中看到它不会从 on_pause 恢复,以防标签包含文本以外的内容或为空。
有人可以帮我解决这个问题吗?
最佳答案
由于 list 中的 Intent 过滤器,您的应用当前接收 NFC 事件:
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:mimeType="*/*" />
</intent-filter>
这个 Intent 过滤器有几个问题:
此意向过滤器将匹配具有意向操作 TAG_DISCOVERED
的意向, NDEF_DISCOVERED
, 或 TECH_DISCOVERED
, and 同时包含类别 DEFAULT 或 BROWSABLE, and 同时包含任何(?) MIME 类型。
问题是只有 NDEF_DISCOVERED
intent 可能包含 MIME 类型。因此,TAG_DISCOVERED
和 TECH_DISCOVERED
永远不会匹配。
MIME 类型 */*
(即匹配任何 MIME 类型)不会(不应该?)在 list Intent 过滤器中工作,因为只有子类型部分(即斜杠后的部分)可能包含通配符 (*)。参见 android:mimeType .
类别 BROWSABLE 是无用的,因为任何 NFC Intent 都不会包含该类别。
NDEF_DISCOVERED
包含 URL 的标签的 Intent 不包含 MIME 类型。由于您限制了 NDEF_DISCOVERED
Intent 过滤器到包含 MIME 类型的 Intent ,它不会匹配包含 URL 的 Intent 。
TECH_DISCOVERED
Intent 过滤器需要声明一个技术列表 XML 文件。
因此,您需要更改 Intent 过滤器以匹配您的标签。如果你想匹配任何 NDEF 格式的标签,你可以简单地使用 intent 过滤器:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
但是,这有一些限制:任何注册了更具体 NDEF_DISCOVERED
的应用程序intent(例如包含 MIME 类型过滤器或 URL 过滤器的)将优先于您的应用程序,您将不会收到该 intent。此外,有报道称 NDEF_DISCOVERED
没有 <data ...>
的 Intent 过滤器不适用于某些设备。
因此,为了匹配 MIME 类型和 URL,您可能需要使用更具体的 Intent 过滤器,例如为了匹配所有 text/
, image/
, 和 application/
MIME 类型、所有 HTTP(S) URL 和所有 NFC 论坛外部类型:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/*" />
<data android:mimeType="image/*" />
<data android:mimeType="application/*" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="vnd.android.nfc" android:host="ext" android:pathPrefix="/" />
</intent-filter>
不过,如果其他一些应用注册了更具体的 Intent 过滤器,您的应用将不会收到任何符合这些“更具体”标准的 Intent(参见 How NFC Tags are Dispatched to Applications)。
如果您的应用还应收到有关非 NDEF 格式标签的通知,您可以使用 TECH_DISCOVERED
Intent 过滤器(请注意,无需为此特定 Intent 过滤器指定任何类别)。在这种情况下,您还需要声明一个 XML 资源文件,其中包含应匹配的技术列表(声明必须在 <intent-filter ... />
元素之外!):
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
您还需要一个 XML 资源 nfc_tech_filter.xml
(放置在 res/xml/
下)。为了匹配任何标签,您可以使用:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcB</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcF</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcV</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcBarcode</tech>
</tech-list>
</resources>
最后,不要使用 TAG_DISCOVERED
list 中的 Intent 过滤器,除非你真的知道它的所有含义(特别是在用户体验和用户期望方面)。此 Intent 过滤器只是 API 级别 9(在 Android 2.3.3 之前)的兼容模式,其中 NFC 支持非常非常有限,并且是一种后备模式,可用于创建处理任何不支持的 NFC 标签的应用程序其他应用。
由于您写道您希望您的应用始终接收这些 Intent “当它处于 Activity 状态并且您读取 NFC 标签时”,您可能需要考虑从 list 中完全删除 Intent 过滤器并使用前台调度系统代替。在这种情况下,您的应用将不会在读取 NFC 标签时启动,但它会收到所有 NFC 发现事件,并且它会优先于所有 其他应用程序,同时它在前台。
您可以通过简单地将其添加到您的应用程序中来做到这一点(尽管不太确定 Python 语法):
def on_pause(self):
print 'paused'
self.nfc_adapter.disableForegroundDispatch(PythonActivity.mActivity)
return True
def on_resume(self):
print 'resumed'
self.nfc_adapter.enableForegroundDispatch(PythonActivity.mActivity, self.nfc_pending_intent, None, None)
关于android - 如何在 Kivy + Python 中读取 NFC 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37953101/
我正在准备在 kivy 中做一个进度条,我可以用它构建应用程序,但是当我运行一个函数(循环)时它不能被更新,我该怎么做? 这是我的代码: 导入库: from kivy.app import App f
为猕猴桃中的按钮创建圆角的首选方法是什么? 还有其他同样可行的方法来执行此任务吗?谢谢。 最佳答案 这是一个棘手的问题。就我而言,Widgets始终是矩形。但是我们可以更改背景,并分别使用backgr
我是kivy的新手。我有一个按钮可以刷新数据库中的列表项,这是绑定(bind)到该按钮的函数: def refresh_account(self): self.ids.grid.clear_w
我正在尝试使用 NumericProperty,但在尝试将其用作值时出现类型错误 我的代码是这样的 from kivy.properties import NumericProperty from k
在按钮中组合图像/图标和文本的首选方法是什么?例如,您将如何使用 text = 'my button' 创建按钮,以及该文本左侧的图形图标? 最佳答案 关于问题#2。 Kivy 的工作方式是嵌入 Wi
在 kivy 中,您如何使用自动居中的多行文本创建按钮或标签?如果你做类似的事情,Button(text = 'my button\nthis is my button') ,似乎只有一条线会居中,而
我知道如何制作彩色背景,但我似乎找不到任何有用的内容将图像设置为背景,并且非常感谢您对我的代码的任何帮助。 这是我的 .py 文件: from kivy.app import App from kiv
我的 Kivy 语言文件有许多 font_size 属性,所有属性都具有相同的值,是否可以在 KV lang 中分配变量? 当前 KV 文件示例: #User ID Label:
我有一个使用许多标签的 kivy 应用程序。是否可以从列表中获取它们的值?例如(但这不起作用) Label: text:root.label_value[0]
任何人都可以帮助我使用任何 sdk 在 kivy 应用程序中实现广告。 Revmobs 已停止支持 Kivy。 任何其他实现广告的方法也可以使用。 谢谢 最佳答案 我在 上取得了成功AdBuddiz
基维 gesture documentation有点缺乏,仅指手势示例。 我想知道为什么 Kivy 不提供任何辅助方法,例如 on_swipe_left、on_swipe_up 等。最好将 minsc
我目前使用的是 python 2.7.9。我试过重新安装 cython 并更新所有依赖项,但它没有用。我不知道 Buildozer 或 Cython 有什么问题。该应用程序直接从终端正常运行。 #er
Kivy 文档指定 "each widget in Kivy already have by default their Canvas" .然而,在实践中,小部件似乎持有对整个窗口的共享 Canvas
我是 Python 库 kivy 的新手。我找到了额外的库 kivy-md,它有非常漂亮的 ui 元素。目前我想从字典变量创建许多 MDTextField 小部件,例如 # text_fields.p
python 3.4基维 1.10.0 我正在尝试使用 Kivy Animation 类来为我的 Image 类制作动画。这是因为我想分别修改每个图像的 anim_delay 和位置值。 我想修改图像
我正在尝试使用 kivy 启动器在我的 android 上启动我的应用程序,这样我就可以在较小的屏幕上看到小部件位置/大小发生了什么。 当我启动时,它崩溃了。 所以...我猜我在我的应用程序中做了一些
有谁知道如何在 Kivy 中增加 MeshLinePlot 的线宽? 谢谢 更新 我从@Ikolim 那里得到了关于修改 kivy.graph 中的 LinePLot 函数的答案 class Line
如何使用 Kivy 更改窗口的大小。我一直在四处寻找,除了进入窗口的大小之外,我几乎可以更改所有内容。 从示例图片文件: 主文件 #!/usr/bin/kivy ''' Pictures demo =
我试图在 Windows 上安装 kivy 设计器。我按照步骤操作,但是当我尝试运行时 python -m designer 我收到以下错误: [INFO ] [Kivy ] v1.
我正在尝试让我的 python 和 kivy 文件打开一个弹出窗口。它说我的 Boxlayout 对象没有属性“open_popup” 这是我的Python代码: from kivy.app impo
我是一名优秀的程序员,十分优秀!