I am working on HCE based App that will require payment through NFC at POS terminal.
I have followed the HCE article on android developers site and I am able to add the banner for card during installation through below code :
<host-apdu-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:requireDeviceUnlock="true"
android:apduServiceBanner="#drawable/servicebanner">
<aid-group android:category="payment"
android:description="#string/paymentGroup" >
<aid-filter ... />
</aid-group>
</host-apdu-service>
But I want to add the banner when the user clicks on ADD CARD button in my app.
Can we add the banner image dynamically on button click ?
Thanks
Related
We have implemented android shortcuts. Testing of App actions on physical devices was fine, except for an issue with English Articles.
When English Articles appear as a part of a statement, the statement is not recognized as an action, and Assistant does not redirected to the app. For example, 'add note to Express Scheduler' is recognized, while 'add a note to Express Scheduler' is not.
My question is whether anybody have experienced similar issues?
Please, see capabilities segment extracted from shortcuts.xml. I am using actions.intent.CREATE_THING and actions.intent.GET_THING BIIs. I've listed one example above: 'add note to Express Scheduler' is recognized, while 'add a note to Express Scheduler' is not.
<capability android:name="actions.intent.CREATE_THING">
<intent>
<url-template android:value="https://vijac.ca/schedule{?name,description}" />
<parameter
android:name="thing.name"
android:key="name"
android:required="false" />
<parameter
android:name="thing.description"
android:key="description"
android:required="false" />
</intent>
</capability>
<capability android:name="actions.intent.GET_THING">
<intent>
<url-template android:value="https://vijac.ca/search{?name}" />
<parameter
android:name="thing.name"
android:key="name" />
</intent>
</capability>enter code here
Thank you!
I think what may be happening is that you have a very generic name of the thing ("a note"), when it is expecting to handle specific names which normally don't need an article ("Pixel 4", "Stairway to Heaven").
You may want to try one of these to address the problem:
The thing.name parameter for that BII allows for an inline inventory which is a way of setting allowable values and alises for those values. You can create an inventory item for note that has aliases such as "a note" and "note".
Consider using the actions.intent.CREATE_DIGITAL_DOCUMENT BII which indicates that it supports phrases such as "Create a note".
I want to show VR tour like this http://alfavr.ir/alfavr.ir/to/park.html in my Android app.
how can I do that?
I tried to display with web view because the file format is Html but did not work.
You can try with VRPanormaView which is included in the Google VR SDK. This is an example from https://developers.google.com/vr/develop/android/vrview:
<com.google.vr.sdk.widgets.pano.VrPanoramaView
android:id="#+id/pano_view"
android:layout_margin="5dip"
android:layout_width="match_parent"
android:scrollbars="#null"
android:layout_height="250dip" />
Inside the Activity, the primary method is VrPanoramaView.loadImageFromBitmap(). Call it with a standard Android Bitmap object and an optional VrPanoramaView.Options object. The latter is used to configure the format of the image. The Activity also implements a VrPanoramaEventListener which receives events when the load operation succeeds or fails.
Adding this line make It work.
webView.getSettings().setJavaScriptEnabled(true);
Currently I am working on Android TV app.
I have used Android Lean back support library.
I have added one ListView, but I can not able to select any of the item from listView with real device's remote. However, I can able to select item of listView on my Android Virtual Device with the help of mouse.
Here is my sample code of listView:
customViewOrders = new CustomViewOrders(getActivity().getBaseContext(), arrayViewOrders);
lstViewOrder.setAdapter(customViewOrders);
Here, arrayViewOrders is my ArrayList which contains data received from JSON webservice.
Here is my JSON Response:
{
"order":[
{
"0":"13829CF",
"gen_id":"13829CF",
"1":"17534CF",
"2":"Complete",
"ord_status":"Complete",
"3":"Online Preview",
"sta_name":"Online Preview",
"4":"2015-10-27 00:00:00",
"image":"cinereel",
"placed_from":"web"
}
]
}
I have also added following features in AndroidManifest.xml file:
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.hardware.faketouch"
android:required="true" />
So, my question is: how to select anything (i.e. list item, button) in real device with the help of remote?
Finally I got the solution after lots of R&D.
Here is the my solution for directional navigation using Android TV remote.
Firstly, you have to keep focus of any one of items (i.e. Button, TextView, etc.) as below.
And also, you have to apply its nextFocusDown, nextFocusLeft, nextFocusRight & nextFocusUp properties, so that it will fire its relevant event when you click TV remote navigation buttons.
<Button
android:id="#+id/btnSignout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/tvUserName"
android:layout_marginTop="2dp"
android:layout_toLeftOf="#+id/ivUser"
android:width="100dp"
android:nextFocusRight="#+id/ivUser" <!-- On click of right arrow button, focus will be move to ivUser id -->
android:nextFocusUp="#+id/tvUserName" <!-- On click of up arrow button, focus will be move to tvUserName id -->
android:text="#string/signout"
android:textAppearance="?android:textAppearanceMedium">
<requestFocus></requestFocus>
</Button>
For more information, you can refer to:
Android User Interface Design: The Basics of Control Focus Order,
Creating TV Navigation.
According to the android Documentation
android:userVisible defaults to true and controls whether or not this sync adapter shows up in the Sync Settings screen.
but it shows in the Settings whatever value it gets!
EDIT Nov 03 2014
I removed android:icon android:label android:smallIcon from authenticator.xml and now it's not showing in the Accounts but there is an empty entry on Add Account tested on Samsung Galaxy S4. And for the record this totally crashed my 2.3.3 emulator when opening Accounts from Settings.
I have implemented my own syncadapter it's working for me as below :
Case 1: When android:userVisible="false" There is only app icon,Account name and app title
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.example.kukssyncadapter"
android:accountType="com.example.kukssyncadapter"
android:supportsUploading="false"
android:allowParallelSyncs="false"
android:userVisible="false"
/>
Case 2: When android:userVisible="true" There is app icon,Account name and app title with sync control functionality as you can see from image
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.example.kukssyncadapter"
android:accountType="com.example.kukssyncadapter"
android:supportsUploading="false"
android:allowParallelSyncs="false"
android:userVisible="true"
/>
I've been using StackOverflow for years now, always finding answers to my questions before even asking them, but today I'm stuck.
As I happen to have a working POS terminal (the EMV Chip&Pin kind), I wanted to look into host card emulation.
The terminal works with the latest version of Tapp, so I know that the terminal is good and that my N7 with Kitkat can actually do payment (or at least the terminal do a series of good sounding bleeps and bloops, and the tablet launch Tapp's enrollment screen).
So I've read the manual(s) and written a bunch of lines with the objective of seeing something arrive on my HostApduService.
It partially works as I can find my dummy "card" in the Tap&Pay settings of the tablet.
But the "payment" part doesn't work: just two high-pitched bleeps from the POS terminal and nothing on the tablet. My HostApduService is not called.
I've tried all kind of different AIDs: real ones and silly ones, short and long, but nothing works.
When using Tapp, the LogCat says :
11-17 14:51:47.690: D/BrcmNfcJni(3183): RoutingManager::stackCallback: event=0x18
11-17 14:51:47.690: D/HostEmulationManager(3183): notifyHostEmulationActivated
11-17 14:51:47.690: D/BrcmNfcJni(3183): RoutingManager::stackCallback: event=0x17
11-17 14:51:47.690: D/BrcmNfcJni(3183): RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=20
11-17 14:51:47.690: D/HostEmulationManager(3183): notifyHostEmulationData
11-17 14:51:47.700: D/HostEmulationManager(3183): Service already bound as payment service.
11-17 14:51:47.700: D/HostEmulationManager(3183): Binding to existing service
11-17 14:51:49.932: D/BrcmNfcJni(3183): RoutingManager::stackCallback: event=0x19
11-17 14:51:49.932: D/HostEmulationManager(3183): notifyHostEmulationDeactivated
11-17 14:51:49.932: E/BrcmNfcNfa(3183): UICC[0x0] is not activated
And with my code, the LogCat is :
11-17 14:41:52.079: D/BrcmNfcJni(3183): RoutingManager::stackCallback: event=0x18
11-17 14:41:52.079: D/HostEmulationManager(3183): notifyHostEmulationActivated
11-17 14:41:52.089: D/BrcmNfcJni(3183): RoutingManager::stackCallback: event=0x17
11-17 14:41:52.089: D/BrcmNfcJni(3183): RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=20
11-17 14:41:52.089: D/HostEmulationManager(3183): notifyHostEmulationData
11-17 14:41:53.340: D/BrcmNfcJni(3183): RoutingManager::stackCallback: event=0x19
11-17 14:41:53.340: D/HostEmulationManager(3183): notifyHostEmulationDeactivated
11-17 14:41:53.340: E/BrcmNfcNfa(3183): UICC[0x0] is not activated
Obviously with my code, the OS doesn't bind the HCE intent to my service. But why?
You'll find below my manifest :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.remolagi.hcetestbanque2"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.NFC" />
<uses-feature
android:name="android.hardware.nfc.hce"
android:required="true" />
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<activity
android:name="net.remolagi.hcetestbanque2.MainActivity"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MyHCEService"
android:exported="true"
android:permission="android.permission.BIND_NFC_SERVICE" >
<intent-filter>
<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="#xml/apduservice" />
</service>
</application>
</manifest>
my apduservice.xml :
<?xml version="1.0" encoding="UTF-8"?>
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="#string/servicedesc"
android:requireDeviceUnlock="true"
android:apduServiceBanner="#drawable/payment_banner">
<aid-group android:description="#string/aiddescription"
android:category="payment">
<aid-filter android:name="A0000000031010"/>
</aid-group>
</host-apdu-service>
And for good measure, the service (as you can see at the moment, it does nothing except Logging) :
package net.remolagi.hcetestbanque2;
import android.nfc.cardemulation.HostApduService;
import android.os.Bundle;
import android.util.Log;
public class MyHCEService extends HostApduService {
private static final String TAG = "MyHCEService";
#Override
public void onDeactivated(int arg0) {
Log.i(TAG, "OnDeactivated - arg0 : " + String.valueOf(arg0));
// TODO Auto-generated method stub
}
#Override
public byte[] processCommandApdu(byte[] arg0, Bundle arg1) {
Log.i(TAG, "Hooza ! processCommandApdu");
return arg0;
}
}
If you have ideas on why it doesn't work, I'll be forever grateful. For now, I'm stumped.
Regards
Philippe
The first applet that will be selected by a EMV terminal is the PPSE applet, so you can try to add it also to your AID filters:
<aid-filter android:name="325041592E5359532E4444463031"/>
I don't know why you are trying to emulate payment with HCE but this will never be approved by Visa and MasterCard since for EMV transaction you need a cryptographic keys that need to be stored in secure environment. In the best case the HCE can be used for card not present transactions.
host-apdu-service structure example:
For HCE application is really necessary to include PPSE AID entry:
apduservice.xml file:
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="#string/servicedesc"
android:requireDeviceUnlock="false" >
<aid-group
android:category="payment"
android:description="#string/aiddescription" >
<!-- Visa Proximity Payment System Environment - PPSE (2PAY.SYS.DDF01) -->
<aid-filter android:name="325041592E5359532E4444463031" />
<!-- VISA Debit/Credit (Classic) -->
<aid-filter android:name="A0000000031010" />
<!-- VISA Credit -->
<aid-filter android:name="A000000003101001" />
<!-- VISA Debit -->
<aid-filter android:name="A000000003101002" />
<!-- VISA Electron (Debit) -->
<aid-filter android:name="A0000000032010" />
<!-- V PAY -->
<aid-filter android:name="A0000000032020" />
<!-- VISA Interlink -->
<aid-filter android:name="A0000000033010" />
<!-- MasterCard PayPass -->
<aid-filter android:name="A00000000401" />
<!-- MasterCard Credit -->
<aid-filter android:name="A0000000041010" />
<!-- American Express -->
<aid-filter android:name="A000000025" />
<!-- BRADESCO -->
<aid-filter android:name="F0000000030001" />
</aid-group>
</host-apdu-service>
In 2013, best answer said "I don't know why you are trying to emulate payment with HCE but this will never be approved by Visa and MasterCard". Oh then MasterCard would not have an official SDK to develop HCE payment applications right? How can you be so sure? For those reading this now, yes of course you can develop an Android HCE app, MasterCard has tons of documents about the best practices. However, it is not publicly open to everyone. I don't know if there is a way to get the SDK and the documents without working with an issuer. You may use EMVCo Books which are open to public, but it may be hard to implement the whole system using only those guides.
About secure environments, for instance, an RSA public key is multiplication of two big prime numbers. If you can find those prime numbers in time, you can be the master of the whole world. But you cannot find those numbers without trying for years (depending on key sizes) with today's computing power, which is proved by mathematicians with better vision than someone in this thread, I'm not going to say who. Whole internet works with public key encryption, you don't always need secure hardwares to keep your data private. There will always be a way, because you cannot reach infinite. When you do, it becomes finite, which doesn't make any sense, lol.
Lastly, "Someone can know everything, in a place where no one knows anything" (F.Y.)
I have noticed during my experiments that the POS device will try to select AID of its supported card scheme. You can check for supported schemes on the device by looking at symbols such as "Visa", "Mastercard" etc. There is a list of AIDs for these schemes at http://en.wikipedia.org/wiki/EMV down the page. So for example, if POS supports Mastercard credit/debit cards, you can try registering AID of mastercard:A0000000041010 as aid-filter in apduservice.xml without registering the AID for PPSE. Give it a go and let me know if it works please.
Edit: Please note that I have been using Vivo tech POS readers.
A list with the PPSE, Mastercard and Visa:
<aid-group android:description="paymentGroup" android:category="payment">
<aid-filter android:name="325041592E5359532E4444463031" android:description="ppse"/>
<aid-filter android:name="A0000000041010" android:description="MasterCard"/>
<aid-filter android:name="A0000000031010" android:description="Visa"/>
</aid-group>