我知道这是一个没有明确答案的“讨论”主题,但我真的很想得到一些反馈,了解在为 Android 开发 NFC 应用程序时会发生什么,特别是使用 IsoDep 与使用 APDU 帧的 DESFire 卡进行通信。
到目前为止,我的体验出奇地复杂(3 种设备,3 种差异),我真的很想听听其他开发人员的意见。 例如:适用于 S3(Android 4.1.2)的相同 APDU 命令不适用于 S4(Android 4.3)(第 3 次握手时出现“错误长度”失败,在此之前一切正常)。这些手机具有不同的 NFC 芯片组,但我没想到 APDU 帧的抽象级别存在差异。
最佳答案
这确实是一个讨论话题,但我仍然认为它与 Android NFC 开发人员相关,因此,我将在这里提供我的经验报告:
是的,但仅适用于满足 ISO/IEC 7816-4 要求但有一些额外限制的 APDU 命令(例如,并非所有设备都支持扩展长度的 APDU,某些设备似乎在使用 case-1 APDU 时存在问题)。
最新版本的 Broadcom NFC 堆栈中也存在一些已知错误(见下文)。
到目前为止,我遇到的最多问题是使用 Broadcom NFC 芯片组的三星设备。尽管与 APDU 无关,尤其是在使用 MIFARE Classic 时,它们的行为与其他采用 Broadcom 芯片组的设备完全不同。例如,S4 在系统级别阻止 MIFARE Classic 标签,因此不允许读取标签 (N)UID。 (无论如何,Broadcom 芯片组无法从 MF Classic 读取数据...)
因此,关于测试,我建议每个 NFC Controller 至少使用一个 Nexus 设备(即一个使用 NXP 芯片组,一个使用 Broadcom 芯片组),对一两个其他手机制造商也是如此。 (对于三星,带有 NXP 芯片组的设备的行为与 Nexus 设备非常相似,所以我猜你 Nexus S/Galaxy Nexus 和例如 S3 在 NFC 读写器模式体验方面可以被视为等同的。)
关于 Android 平台,我会坚持那些您拥有最多用户的平台。 (还有那些卸载率很高的平台。)
正如我之前提到的,Broadcom NFC 堆栈存在一些已知问题。特别是当涉及到 MIFARE DESFire 时,存在一个已知问题,即 NFC 堆栈将任意基于 APDU 的命令发送到卡后将其传递给应用程序。因此,这些命令可能会干扰卡和该应用程序之间正在进行的通信(例如,强制使用基于 APDU 的通信模式而不是 native 命令模式、更改应用程序/文件选择等)。看这个bug report还有这个stackoverflow question了解更多详情。
并查看 bug tracker ,肯定还有更多 Unresolved 问题。
关于基于 APDU 的通信(使用 DESFire 或其他卡),API 10 (Android 2.3.3) 和更高版本工作正常。当谈到 NFC API 的可用性(除了简单的 APDU 交换)和漂亮的应用程序设计时,我会坚持使用 Android 4.0.3 及更高版本。但请记住,最新的平台,尤其是 Android 4.3 和 Android 4.4 引入了许多奇怪的行为/错误/(“功能”?)。
为了了解使用 NFC 设备的用户目前拥有哪些 Android 版本,我将分享当前设备安装分布 NFC TagInfo (尽管这可能略有偏差,因为 NFC TagInfo 不适用于普通用户):
关于android - Android NFC ISODep 支持有多成熟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20347132/
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in
我最近与一位同事讨论了以下Ruby语法:value=ifa==0"foo"elsifa>42"bar"else"fizz"end我个人并没有看到太多这种逻辑,但我的同事指出,这实际上是一种相当普遍的Rubyism。我试着用谷歌搜索这个主题,但没有找到任何文章、页面或SO问题来讨论它,这让我相信这可能是一种非常实际的技术。然而,另一位同事发现语法令人困惑,而是将上面的逻辑写成这样:ifa==0value="foo"elsifa>42value="bar"elsevalue="fizz"end缺点是value=的重复声明和隐式elsenil的丢失,如果我们想使用它的话。这也感觉它与Ruby
我已经按照https://github.com/wayneeseguin/rvm#installation上的说明通过RVM安装了Ruby.有关信息,我有所有文件(readline-5.2.tar.gz、readline-6.2.tar.gz、ruby-1.9.3-p327.tar.bz2、rubygems-1.8.24.tgz、wayneeseguin-rvm-stable.tgz和yaml-0.1.4.tar.gz)在~/.rvm/archives目录中,我不想在任何目录中重新下载它们方式。当我这样做时:sudo/usr/bin/apt-getinstallbuild-essent
我的Ruby-on-Rails项目中有以下文件结构,用于规范:/spec/msd/serviceservice_spec.rb/support/my_modulerequests_stubs.rb我的request_stubs.rb有:moduleMyModule::RequestsStubsmodule_functiondeflist_clientsurl="dummysite.com/clients"stub_request(:get,url).to_return(status:200,body:"clientsbody")endend在我的service_spec.rb我有:re
Ruby是否支持(找不到更好的词)非转义(逐字)字符串?就像在C#中一样:@"c:\ProgramFiles\"...或者在Tcl中:{c:\ProgramFiles\} 最佳答案 是的,您需要在字符串前加上%前缀,然后是描述其类型的单个字符。你想要的是%q{c:\programfiles\}。镐书很好地涵盖了这一点here,部分是通用分隔输入。 关于ruby-Ruby是否支持逐字字符串?,我们在StackOverflow上找到一个类似的问题: https:/
我正在编写一个Rubygem,在我的代码中使用{key:'value'}哈希语法。我的测试都在1.9.x中通过,但我(可以理解)在1.8.7中得到syntaxerror,unexpected':',expecting')'。是否有支持1.8.x的最佳实践?我是否需要使用我们的老friend=>重写代码,还是有更好的策略? 最佳答案 我认为你运气不好,如果你想支持1.8,那么你必须使用=>。像往常一样,我会提到在1.9的某些情况下您必须使用=>:如果键不是一个符号。请记住,任何对象(符号、字符串、类、float……)都可以是Ruby哈
在Rails中,什么是集成更新模型某些元素的UDP监听过程的最佳方式(特别是它将向其中一个表添加行)。简单的答案似乎是在同一个进程中使用UDP套接字对象启动一个线程,但我什至不清楚我应该在哪里做适合Rails方式的事情。有没有一种巧妙的方法来开始收听UDP?具体来说,我希望能够编写一个UDPController并在每个数据报消息上调用一个特定的方法。理想情况下,我希望避免在UDP上使用HTTP(因为它会浪费一些在这种情况下非常宝贵的空间),但我完全控制消息格式,因此我可以为Rails提供它需要的任何信息。 最佳答案 Rails是一个
我是Ruby和Watir-Webdriver的新手。我有一套用VBScript编写的站点自动化程序,我想将其转换为Ruby/Watir,因为我现在必须支持Firefox。我发现我真的很喜欢Ruby,而且我正在研究Watir,但我已经花了一周时间试图让Webdriver显示我的登录屏幕。该站点以带有“我同意”区域的“警告屏幕”开头。用户点击我同意并显示登录屏幕。我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用VBScript这样做:objExplorer.Document.GetElementsByTagName("area")(0).click
我收到错误:unsupportedcipheralgorithm(AES-256-GCM)(RuntimeError)但我似乎具备所有要求:ruby版本:$ruby--versionruby2.1.2p95OpenSSL会列出gcm:$opensslenc-help2>&1|grepgcm-aes-128-ecb-aes-128-gcm-aes-128-ofb-aes-192-ecb-aes-192-gcm-aes-192-ofb-aes-256-ecb-aes-256-gcm-aes-256-ofbRuby解释器:$irb2.1.2:001>require'openssl';puts