Android : How to change NFC protocol priority? - android

I have my own Android app (App A) which reads and writes NFC tags and ISO-14443 Type A tags. It works well on many Android devices.
I want to give the role of ISO-14443 tag to my Nexus5, so I implemented my own HCE (Host Card Emulation) application (App B) on my Nexus5. When I touch the Nexus5 on an external NFC reader (which uses ISO 14443), it works perfectly.
However, when I touch the Nexus5 (App B) on a Nexus7 (running App A), p2p (Android beam) data exchanging sequences start.
Even after I turn off Android beam functions on both devices, nothing changes. The Nexus7 doesn't display the 'Touched to Beam' screen, but the p2p detect sound plays.
LogCat shows that Nexus7 tries to establish an LLCP connection.
I want that Nexus7 to focus on detecting the ISO-14443 HCE of Nexus5, not Android beam.
How do I change the NFC detection priority to give preference to ISO-14443 over Android beam?

The solution is only available on Android 4.4 Kitkat (which is available for the Nexus 7). You need to enable so-called "reader mode", which is designed to handle this particular situation, using enableReaderMode().
In this mode the NFC controller will only act as an NFC tag reader/writer, thus disabling any peer-to-peer (Android Beam) and card-emulation modes of the NFC adapter on this device. [...] For interacting with tags that are emulated on another Android device using Android's host-based card-emulation, the recommended flags are FLAG_READER_NFC_A and FLAG_READER_SKIP_NDEF_CHECK.

Related

Can I access a device using Android HCE from a device running Android 4.3 (or below)?

I have developed an app that emulates a contactless smartcard using Android HCE and an app that accesses (reads) this emulated card. Both run on Android 4.4 (KitKat) and above.
No I would like to develop the reader-side for devices that run Android 4.3 (or lower). Is it possible to access a device that uses Android HCE from a device with an API level < 19? I do not want to use the Android Beam feature.
No, that's not possible. By default, two Android devices (when held together) will communicate in peer-to-peer mode. This is the case even if one or both devices support host card emulation. Once an Android device successfully established a peer-to-peer mode link, it won't try to use reader/writer mode on the same target.
In order to permit the Android HCE-emulated card to be visible to (accessible from) a second Android device, that second device must disable its peer-to-peer mode capabilities and operate only in reader/writer mode.
This is exactly what you do with the Android reader mode API (that you seem to use in your reader app for Android 4.4). Using NfcAdapter.enableReaderMode() with the flags FLAG_READER_NFC_A and FLAG_READER_NFC_B forces Android to act in reader/writer mode and to disable peer-to-peer mode.
As this API (or something equivalent) is not available on Android 4.3 and below (i.e. before API level 19), you have no means to programmatically1 disable peer-to-peer mode. Consequently, your reader app on Android 4.3 can't communicate with an Android HCE emulated card.
1) Note that disabling Android Beam in Settings won't disable peer-to-peer mode either. This will just disable the Beam capabilities that would normally run on top of peer-to-peer-mode.

Use another Android device as NFC tag?

I am working on an app that will be deployed on a NFC enabled device. I am trying to enable authentication using NFC, so that a user can scan another NFC device such as phone to authenticate.
I went through the NFC documentation that Android has at http://developer.android.com/guide/topics/connectivity/nfc/nfc.html
I am not able to get my use case working.
Here is what I am trying to do:
Deploy app in Device A.
app on Device A will only try to scan for NFC when app is in foreground and is in Login Activity.
User can bring in Device B/NFC tag near Device A, Login Activity will authenticate the user.
I hope this is possible using NFC in Android. My search leads me to example that launches app when NFC is detected but that is not what i am after.
If you want to communicate beween two Android devices by using one as an emulated tag and the other as reader/writer (as opposed to transfering NDEF messages between two devices using Android Beam, which is based on NFC peer-to-peer mode), you could Android HCE (one one device) in combination with reader/writer mode (on the other device).
However, building a solution like this has some limitations. Regarding the emulating side, you have the following limitations and requirements:
Android HCE requires the emulating device to run Android 4.4 or later.
The emulating device needs to support host-based card emulation. Not all Android 4.4+ devices that have NFC also support HCE. For instance, all (most?) devices that contain NXP's PN544 NFC controller do not curently support HCE.
You can only emulate ISO/IEC 7816-4 appliction structures on top of ISO/IEC 14443-4. In case you want to emulate an NFC tag with NDEF data, this would be equivalent to an NFC Forum Type 4 tag. But you are, of course, not limited to emulating NDEF-style NFC tags.
However, an NFC tag (or rather a smartcard application) that is emulated like this imposes some requirements/limitations on the reader side as well:
Android's HCE capabilities run in parallel with its peer-to-peer mode capablities (regardless of whether the device has support for Android Beam enabled or not). As a consequence, other Android devices will detect Android HCE devices as peer-to-peer devices and, by default, communicate with them in peer-to-peer mode. Therefore, other Android devices will normally be unable to access an Android HCE emulated smartcard application.
Only starting with Android 4.4, you can disable peer-to-peer mode discovery by using the reader mode API. So you need Android 4.4+ on the reader side in order to access the emulated NFC tag.
This also prevents automatically starting an app on the second device upon discovery of the first device, so you can only use an Android HCE emulated smartcard application in combination with an activity that already runs in the foreground on the reading device.

Raspberry NXP EXPLORE-NFC cannot detect Android Phone

I have installed a NXP NFC-ExploreNFC in Raspberry, when I run the sample card_polling program, it can detect my JIS X 6319-4 compatible card, however, it cannot detect my Samsung Note II (NFC is enabled).
Is there any extra setup required in Raspberry?
regards
Unless your phone is in card emulation mode, the card-polling example would normally not detect the phone as a card. That is, before Android 4.4 (and on NXP PN544-based devices) card emulation is normally not enabled. Though the polling example looks as if it could potentially detect a phone's passive peer-to-peer mode (when display is on and device is unlocked) as either "Mifare" ISO 14443-3 or "FeliCa" due to the fact that those modulation and protocol activation schemes are used in peer-to-peer mode too.
For reliable communication with an Android device, I would suggest that you use either the peer-to-peer mode (P2P) example or the card emulation example.

how does nfc reader(acr122) detect my phone?

I buy ACR122U SDK that has a acr122 reader,cd and cards and I try to test it. the reader detect the cards by changing its LED light from red to green but when I take my phone (NFC is turned on) near the reader,there is nothing happen.
How do I make the reader detect my phone? I have to install java card applet into my phone for letting my phone act as a contactless card?
Using the ACR122U NFC reader you have three options:
ACR122U in peer-to-peer mode: In peer-to-peer mode, you can communicate with an Android device using Android's built in Beam functionality. On the reader side you would need to implement the SNEP service (and the underlying LLCP + NFCIP-1 protocol stack). You can find examples, for instance, with ISMB-SNEP, NFC Tools and nfcpy.
ACR122U in card emulation mode: In card emulation mode the ACR122U can be used to emulate a tag/contactless smartcard that can be detected by an Android device just like any other NFC tag/contactless smartcard. You can find examples, for instance, with libnfc.
ACR122U in reader/writer mode: In reader/writer mode, the ACR122U can communicate with contactless smartcards. This goes into the direction of what takumar already posted in his answer. While you were stuck with the requirement of a secure element (which is typically difficult due to lack of access or even lack of an SE), with recent Android versions (specifically CyanogenMod 9.1+ or Android 4.4+), you have the option to use host card emulation (HCE) mode. See the Android documentation for how that works on Android 4.4 and later.
Your phone must be enabled for card emulation, not all are. Furthermore, you need to figure out where card emulation is routed to. This can be the SIM or some embedded secure element. Once that is done, you can think of deploying the application onto a test SIM (it is very unlikely that you'll ever get the keys to the embedded secure element). Working with an AOSP build of Android (for instance on the Nexus 5) helps because you can set the route. Test SIMs with test keys can be bought online I believe. Once you have one, you can use GPShell to install the application. Good luck.

Does a "Push To Beam" workaround exist?

I am currently trying to implement a basic NFC app on the Nexus 7.
I have been able to transmit an NDEF record (Web Url) using the Beam SDK but i'm stuck with the "Tap to beam" UI, like many others on here.
I am aware that there is no way to disable this screen or automatically press it, but, are the re any other possible workarounds?
For example, a colleague has just suggested something like putting the Nexus 7 in tag writer mode and then getting the other app into tag read mode.
Or am I correct in saying that NFC in Android can only be used to read/write NFC tags and also share items using beam?
The NFC chip continuously switches between Reader/Writer mode and peer-to-peer mode (and card emulation, if you have Google Wallet installed). In Reader/Writer mode, it can communicate with an NFC tag. Two devices in Reader/Writer mode cannot communicate with each other; that is what peer-to-peer mode was invented for. Peer-to-peer mode is what is used for Android Beam.
It is also not possible to use the card emulation mode on one device. First of all, an Android device will not detect the card emulation on another Android device (it prefers to do peer-to-peer). Secondly, your app would need special permission to access the Secure Element (that does the card emulation) from the OS. And, thirdly, even if you would manage to tackle these hurdles, there is still no way to write data to the Secure Element, as you don't have the necessary access control keys to do it.
So to answer your original question: there is no way to circumvent the Android Beam UI by switching to other NFC modes. Sorry.
UPDATE:
As of Android 4.4 Kitkat, apps have the possibility to emulate a card using so-called Host Card Emulation (HCE). For an app on another Android NFC device to communicate with such an emulated tag, it needs to use a new NFC Reader Mode (which disables Android Beam entirely to prevent it from getting in the way).

Categories

Resources