In-app Billing Version 3
|
|
- Tyrone Cooper
- 6 years ago
- Views:
Transcription
1 13
2 In-app Billing Version 3 Bruno Oliveira Developer Relations, Android 13
3 In-app billing! 2
4 In-app billing! Implement ALL the billing! 2
5 In-app billing! DO NOT WANT 2
6 PREVIOUSLY IN IN-APP BILLING 3
7 Easy
8 Easy mbillingservice.requestpurchase(msku, Consts.ITEM_TYPE_INAPP, mpayloadcontents)
9 Easy mbillingservice.requestpurchase(msku, Consts.ITEM_TYPE_INAPP, mpayloadcontents) public void onpurchasestatechange(purchasestate purchasestate, String itemid, int quantity, long purchasetime, String developerpayload) { if (Consts.DEBUG) { Log.i(TAG, "onpurchasestatechange() itemid: " + itemid + " " + purchasestate); } if (developerpayload == null) { logproductactivity(itemid, purchasestate.tostring()); } else { logproductactivity(itemid, purchasestate + "\n\t" + developerpayload); } if (purchasestate == PurchaseState.PURCHASED) { mowneditems.add(itemid); } // If this is a subscription, then enable the "Edit // Subscriptions" button. for (CatalogEntry e : CATALOG) { if (e.sku.equals(itemid) && e.managed.equals(managed.subscription)) { meditsubscriptionsbutton.setvisibility(view.visible); } } } mcatalogadapter.setowneditems(mowneditems); mowneditemscursor.requery();
10 * change. The signeddata parameter is a plaintext JSON string that is * signed by the server with the developer's private key. The signature * for the signed data is passed in the signature parameter. context the context Easy mbillingservice.requestpurchase(msku, Consts.ITEM_TYPE_INAPP, mpayloadcontents) signeddata the (unencrypted) JSON string signature the signature for the signeddata */ private void purchasestatechanged(context context, String signeddata, String signature) { Intent intent = new Intent(Consts.ACTION_PURCHASE_STATE_CHANGED); } public intent.setclass(context, void onpurchasestatechange(purchasestate BillingService.class); purchasestate, String itemid, intent.putextra(consts.inapp_signed_data, signeddata); intent.putextra(consts.inapp_signature, int quantity, long purchasetime, signature); String developerpayload) { context.startservice(intent); if (Consts.DEBUG) { Log.i(TAG, "onpurchasestatechange() itemid: " + itemid + " " + purchasestate); } /** * This is called when Android Market sends a "notify" message indicating that transaction * information is available. The request includes a nonce (random number used once) that if (developerpayload == null) { logproductactivity(itemid, purchasestate.tostring()); } else { logproductactivity(itemid, purchasestate + "\n\t" + developerpayload); } * we generate and Android Market signs and sends back to us with the purchase state and * other transaction details. This BroadcastReceiver cannot bind to the * MarketBillingService directly so it starts the {@link BillingService}, which does the * actual work of sending the message. * context the context notifyid the notification ID */ if (purchasestate == PurchaseState.PURCHASED) { mowneditems.add(itemid); private void notify(context context, String notifyid) { Intent intent = new Intent(Consts.ACTION_GET_PURCHASE_INFORMATION); intent.setclass(context, BillingService.class); intent.putextra(consts.notification_id, notifyid); } // If this is a subscription, then enable the "Edit // Subscriptions" button. for (CatalogEntry e : CATALOG) { if (e.sku.equals(itemid) && context.startservice(intent); /** * This is called when Android Market sends a server response code. The BillingService can * then report the status of the response if desired. * context the context requestid the request ID that corresponds to a previous request responsecodeindex the ResponseCode ordinal value for the request */ private void checkresponsecode(context context, long requestid, int responsecodeindex) { Intent intent = new Intent(Consts.ACTION_RESPONSE_CODE); intent.setclass(context, BillingService.class); } intent.putextra(consts.inapp_request_id, requestid); intent.putextra(consts.inapp_response_code, responsecodeindex); context.startservice(intent); } e.managed.equals(managed.subscription)) { meditsubscriptionsbutton.setvisibility(view.visible); } } } mcatalogadapter.setowneditems(mowneditems); mowneditemscursor.requery();
11 * change. The signeddata parameter is a plaintext JSON string that is * signed by the server with the developer's private key. The signature * for the signed data is passed in the signature parameter. context the context Easy mbillingservice.requestpurchase(msku, // the current request on the queue. bindtomarketbillingservice(); Consts.ITEM_TYPE_INAPP, return; mpayloadcontents) } signeddata the (unencrypted) JSON string signature the signature for the signeddata */ private void purchasestatechanged(context context, String signeddata, String signature) } { Intent intent = new Intent(Consts.ACTION_PURCHASE_STATE_CHANGED); // If we get here then all the requests ran successfully. If maxstartid // is not -1, then one of the requests started the service, so we can } public intent.setclass(context, void onpurchasestatechange(purchasestate BillingService.class); purchasestate, String itemid, intent.putextra(consts.inapp_signed_data, signeddata); intent.putextra(consts.inapp_signature, int quantity, long purchasetime, signature); String developerpayload) // stop { it now. context.startservice(intent); if (Consts.DEBUG) { if (maxstartid >= 0) { if (Consts.DEBUG) { Log.i(TAG, "onpurchasestatechange() itemid: " + itemid + " " + purchasestate); } } /** stopself(maxstartid); * This is called when Android Market sends a "notify" message indicating that transaction } * information if (developerpayload is available. The request == null) includes { a nonce (random number used } once) that * we generate and Android Market signs and sends back to us with the state and * other transaction logproductactivity(itemid, details. This BroadcastReceiver purchasestate.tostring()); cannot bind to the /** * MarketBillingService } else { directly so it starts the {@link BillingService}, which * This does is the called when we are connected to the MarketBillingService. * actual work logproductactivity(itemid, of sending the message. purchasestate + "\n\t" + * developerpayload); This runs in the main UI thread. * } context the context notifyid the notification ID */ if (purchasestate == PurchaseState.PURCHASED) { mowneditems.add(itemid); private void notify(context context, String notifyid) { Intent intent = new Intent(Consts.ACTION_GET_PURCHASE_INFORMATION); intent.setclass(context, BillingService.class); intent.putextra(consts.notification_id, notifyid); } // If this is a subscription, then enable the "Edit} // Subscriptions" button. for (CatalogEntry e : CATALOG) { if (e.sku.equals(itemid) && context.startservice(intent); maxstartid = request.getstartid(); } } else { // The service crashed, so restart it. Note that this leaves Log.i(TAG, "stopping service, startid: " + maxstartid); public void onserviceconnected(componentname name, IBinder service) { if (Consts.DEBUG) { Log.d(TAG, "Billing service connected"); } mservice = IMarketBillingService.Stub.asInterface(service); runpendingrequests(); /** * This is called when we are disconnected from the MarketBillingService. /** */ * This is called when Android Market sends a server response code. The BillingService can * then report the status of the response if desired. { public void onservicedisconnected(componentname name) { * meditsubscriptionsbutton.setvisibility(view.visible); Log.w(TAG, "Billing service disconnected"); context } the context mservice = null; requestid the request ID that corresponds to a previous request } responsecodeindex } the ResponseCode ordinal value for the request */ } /** private mcatalogadapter.setowneditems(mowneditems); void checkresponsecode(context context, long requestid, int responsecodeindex) * Unbinds from { the MarketBillingService. Call this when the application Intent intent = new Intent(Consts.ACTION_RESPONSE_CODE); * terminates to avoid leaking a ServiceConnection. intent.setclass(context, mowneditemscursor.requery(); BillingService.class); */ } public void unbind() { intent.putextra(consts.inapp_request_id, requestid); try { intent.putextra(consts.inapp_response_code, responsecodeindex); unbindservice(this); context.startservice(intent); } catch (IllegalArgumentException e) { } // This might happen if the service was disconnected
12 /** * change. The signeddata parameter is a plaintext JSON string that is maxstartid = request.getstartid(); * Returns a cursor that can be used to read all the rows and columns of * signed by the server with the developer's private key. The signature } * the "purchased items" table. } else { * for the */ signed data is passed in the signature parameter. context the context mbillingservice.requestpurchase(msku, // The service crashed, so restart it. Note that this leaves public Cursor queryallpurchaseditems() { // the current request on the queue. Easy signeddata return mdb.query(purchased_items_table_name, the (unencrypted) JSON string PURCHASED_COLUMNS, null, bindtomarketbillingservice(); signature null, the signature null, null, for Consts.ITEM_TYPE_INAPP, null); the signeddata return; mpayloadcontents) */ } } private void purchasestatechanged(context context, String signeddata, String signature) } { Intent /** intent = new Intent(Consts.ACTION_PURCHASE_STATE_CHANGED); // If we get here then all the requests ran successfully. If maxstartid // is not -1, then one of the requests started the service, so we can } public intent.setclass(context, * This void is onpurchasestatechange(purchasestate a standard BillingService.class); helper class for constructing the purchasestate, database. String itemid, intent.putextra(consts.inapp_signed_data, */ signeddata); intent.putextra(consts.inapp_signature, int quantity, long purchasetime, signature); String developerpayload) // stop { it now. private class DatabaseHelper extends SQLiteOpenHelper { context.startservice(intent); if (Consts.DEBUG) { if (maxstartid >= 0) { public DatabaseHelper(Context context) { if (Consts.DEBUG) { Log.i(TAG, super(context, "onpurchasestatechange() DATABASE_NAME, null, DATABASE_VERSION); itemid: " + itemid + " " + purchasestate); } } } Log.i(TAG, "stopping service, startid: " + maxstartid); /** stopself(maxstartid); * This is when Android Market sends a "notify" message indicating that transaction } * information if (developerpayload public is available. void oncreate(sqlitedatabase The request == null) includes { db) a { nonce (random number used } once) that * we generate and logproductactivity(itemid, createpurchasetable(db); Android Market signs and sends back to us with the state and * other transaction purchasestate.tostring()); } details. This BroadcastReceiver cannot bind to the /** * MarketBillingService } else { directly so it starts the {@link BillingService}, which * This does is the called when we are connected to the MarketBillingService. * actual logproductactivity(itemid, of sending the message. purchasestate + "\n\t" + * developerpayload); This runs in the main UI thread. * } public void onupgrade(sqlitedatabase db, int oldversion, int newversion) */ { context // the Production-quality context upgrade code should modify the tables notifyid the notification ID public void onserviceconnected(componentname name, IBinder service) { // the database version changes instead of dropping the tables and */ if (purchasestate == PurchaseState.PURCHASED) { if (Consts.DEBUG) { // re-creating them. private void notify(context context, String notifyid) { Log.d(TAG, "Billing service connected"); Intent intent mowneditems.add(itemid); (newversion!= DATABASE_VERSION) { = new Intent(Consts.ACTION_GET_PURCHASE_INFORMATION); } Log.w(TAG, "Database upgrade from old: " + oldversion + " to: intent.setclass(context, BillingService.class); mservice " + = IMarketBillingService.Stub.asInterface(service); newversion); intent.putextra(consts.notification_id, // If this is a subscription, notifyid); runpendingrequests(); db.execsql("drop TABLE IF EXISTS then " + PURCHASE_HISTORY_TABLE_NAME); enable the "Edit} context.startservice(intent); } // Subscriptions" db.execsql("drop button. TABLE IF EXISTS " + PURCHASED_ITEMS_TABLE_NAME); createpurchasetable(db); /** for (CatalogEntry return; e : CATALOG) { * This is called when we are disconnected from the MarketBillingService. /** } if (e.sku.equals(itemid) && */ * This is called } when Android Market sends a server response code. The BillingService can * then report the status of the response if desired. { public void onservicedisconnected(componentname name) { * private void meditsubscriptionsbutton.setvisibility(view.visible); createpurchasetable(sqlitedatabase db) { Log.w(TAG, "Billing service disconnected"); context db.execsql("create } the context TABLE " + PURCHASE_HISTORY_TABLE_NAME + "(" + mservice = null; requestid the request ID that corresponds to a previous request } responsecodeindex } HISTORY_ORDER_ID_COL + " TEXT PRIMARY KEY, " + HISTORY_STATE_COL the ResponseCode + " ordinal INTEGER, value " + for the request */ } /** HISTORY_PRODUCT_ID_COL + " TEXT, " + private mcatalogadapter.setowneditems(mowneditems); void checkresponsecode(context context, long requestid, int responsecodeindex) * Unbinds from { the MarketBillingService. Call this when the application HISTORY_DEVELOPER_PAYLOAD_COL + " TEXT, " + Intent intent = new Intent(Consts.ACTION_RESPONSE_CODE); * terminates to avoid leaking a ServiceConnection. intent.setclass(context, mowneditemscursor.requery(); HISTORY_PURCHASE_TIME_COL + " INTEGER)"); BillingService.class); */ db.execsql("create TABLE " + PURCHASED_ITEMS_TABLE_NAME + "(" } public + void unbind() { intent.putextra(consts.inapp_request_id, PURCHASED_PRODUCT_ID_COL requestid); + " TEXT PRIMARY KEY, " + try { intent.putextra(consts.inapp_response_code, PURCHASED_QUANTITY_COL + responsecodeindex); " INTEGER)"); unbindservice(this); context.startservice(intent); } } catch (IllegalArgumentException e) { } } // This might happen if the service was disconnected
13 /** * change. The signeddata parameter is a plaintext JSON string that is maxstartid = request.getstartid(); * Returns a cursor that can be used to read all the rows and columns of * signed by the server with the developer's private key. The signature } * the "purchased items" table. } else { * for the */ signed data is passed in the signature parameter. context the context mbillingservice.requestpurchase(msku, // The service crashed, so restart it. Note that this leaves public Cursor queryallpurchaseditems() { // the current request on the queue. Easy signeddata return mdb.query(purchased_items_table_name, the (unencrypted) JSON string PURCHASED_COLUMNS, null, bindtomarketbillingservice(); signature null, the signature null, null, for Consts.ITEM_TYPE_INAPP, null); the signeddata return; mpayloadcontents) */ } } private void purchasestatechanged(context context, String signeddata, String signature) } { Intent /** intent = new Intent(Consts.ACTION_PURCHASE_STATE_CHANGED); // If we get here then all the requests ran successfully. If maxstartid // is not -1, then one of the requests started the service, so we can } public intent.setclass(context, * This void is onpurchasestatechange(purchasestate a standard BillingService.class); helper class for constructing the purchasestate, database. String itemid, intent.putextra(consts.inapp_signed_data, */ signeddata); intent.putextra(consts.inapp_signature, int quantity, long purchasetime, signature); String developerpayload) // stop { it now. private class DatabaseHelper extends SQLiteOpenHelper { context.startservice(intent); if (Consts.DEBUG) { if (maxstartid >= 0) { public DatabaseHelper(Context context) { if (Consts.DEBUG) { Log.i(TAG, super(context, "onpurchasestatechange() DATABASE_NAME, null, DATABASE_VERSION); itemid: " + itemid + " " + purchasestate); } } } why does it get so } if (developerpayload public void oncreate(sqlitedatabase == null) { db) { } logproductactivity(itemid, createpurchasetable(db); purchasestate.tostring()); } /** } else logproductactivity(itemid, purchasestate + "\n\t" + * developerpayload); This runs in the main UI thread. } public void onupgrade(sqlitedatabase db, int oldversion, int newversion) */ { // Production-quality upgrade code should modify the tables // the database version if (purchasestate == PurchaseState.PURCHASED) complicated? changes instead of dropping the tables and { if (Consts.DEBUG) { // re-creating them. Log.d(TAG, "Billing service connected"); Intent intent mowneditems.add(itemid); if (newversion!= DATABASE_VERSION) { = new Intent(Consts.ACTION_GET_PURCHASE_INFORMATION); } Log.w(TAG, "Database upgrade from old: " + oldversion + " to: " + intent.setclass(context, newversion); BillingService.class); intent.putextra(consts.notification_id, // If this is a subscription, notifyid); runpendingrequests(); db.execsql("drop TABLE IF EXISTS then " + PURCHASE_HISTORY_TABLE_NAME); enable the "Edit} context.startservice(intent); // Subscriptions" db.execsql("drop button. TABLE IF EXISTS " + PURCHASED_ITEMS_TABLE_NAME); createpurchasetable(db); for (CatalogEntry return; e : CATALOG) { } if (e.sku.equals(itemid) && */ } { public void onservicedisconnected(componentname name) { private void meditsubscriptionsbutton.setvisibility(view.visible); createpurchasetable(sqlitedatabase db) { Log.w(TAG, "Billing service disconnected"); db.execsql("create } TABLE " + PURCHASE_HISTORY_TABLE_NAME + "(" + mservice = null; } } HISTORY_ORDER_ID_COL + " TEXT PRIMARY KEY, " + HISTORY_STATE_COL + " INTEGER, " + } /** HISTORY_PRODUCT_ID_COL + " TEXT, " + mcatalogadapter.setowneditems(mowneditems); HISTORY_DEVELOPER_PAYLOAD_COL + " TEXT, " + Intent intent = new Intent(Consts.ACTION_RESPONSE_CODE); * terminates to avoid leaking a ServiceConnection. intent.setclass(context, mowneditemscursor.requery(); HISTORY_PURCHASE_TIME_COL + " INTEGER)"); BillingService.class); */ db.execsql("create TABLE " + PURCHASED_ITEMS_TABLE_NAME + "(" } public + void unbind() { /** * This is called when Android Market sends a "notify" message indicating that transaction * information is available. The request includes a nonce (random number used once) that * we generate and Android Market signs and sends back to us with the purchase state and * other transaction details. This BroadcastReceiver cannot bind to the * MarketBillingService directly so it starts the {@link BillingService}, which * This does is the called when we are connected to the MarketBillingService. * actual work of sending the message. * context the context notifyid the notification ID public void onserviceconnected(componentname name, IBinder service) { */ private void notify(context context, String notifyid) { } intent.putextra(consts.inapp_request_id, PURCHASED_PRODUCT_ID_COL requestid); + " TEXT PRIMARY KEY, " + intent.putextra(consts.inapp_response_code, PURCHASED_QUANTITY_COL + responsecodeindex); " INTEGER)"); context.startservice(intent); } } } Log.i(TAG, "stopping service, startid: " + maxstartid); mservice = IMarketBillingService.Stub.asInterface(service); /** * This is called when we are disconnected from the MarketBillingService. /** * This is called when Android Market sends a server response code. The BillingService can * then report the status of the response if desired. * context the context requestid the request ID that corresponds to a previous request responsecodeindex the ResponseCode ordinal value for the request */ private void checkresponsecode(context context, long requestid, int responsecodeindex) * Unbinds from { the MarketBillingService. Call this when the application try { unbindservice(this); } catch (IllegalArgumentException e) { // This might happen if the service was disconnected
14
15 item
16 item your app
17 item
18 item receiver
19 item receiver your app
20 Billing V2 asynchronous Library Activity Service Broadcast Receiver Google Play 7
21 Billing V2 asynchronous Library Billing V3 Activity Service Broadcast Receiver Google Play 7
22 Billing V2 asynchronous Billing V3 Library Activity Service Broadcast Receiver Google Play 7
23 Billing V3 8
24 Billing V3 8
25 Billing V3 is synchronous Activity Google Play 9
26 Billing V3 is synchronous buy 50 gold coins Activity Google Play 9
27 Billing V3 is synchronous buy 50 gold coins Activity Google Play OK 9
28 In v2, restoring purchases was expensive My App 123 SD Card Folder John s Phone, Pay to the order of: Billing V Two for: restoring purchases CPU Cycles: Traffic: : : : : :: many lots x 10 ( ) MB ( ) GB ( ) TB John D. Veloper 10
29 In v3, Google Play maintains a client-side cache restore purchases Google Play servers Activity cache purchases so... 11
30 ...in v3, restoring purchases is pretty cheap CPU & NETWORK 99% OFF ON ANY GET-PURCHASES CALL W/ IN-APP BILLING VERSION 3 (THROUGH CLIENT-SIDE CACHING) AVAILABLE ON PARTICIPATING DEVICES. 12
31 ENOUGH SALES. SHOW ME THE CODE. 13
32 </sales> 14
33 Selling Stuff 15
34 Is V3 is supported? 16
35 public void onserviceconnected( ComponentName name, IBinder service) { } mservice = IInAppBillingService.Stub.asInterface(service); int response = mservice.isbillingsupported(3, getpackagename(), inapp ); if (response == BILLING_RESPONSE_RESULT_OK) { // has billing! } else { // no billing V3... } 16
36 public void onserviceconnected( ComponentName name, IBinder service) { } mservice = IInAppBillingService.Stub.asInterface(service); int response = mservice.isbillingsupported(3, getpackagename(), inapp ); if (response == BILLING_RESPONSE_RESULT_OK) { // has billing! } else { // no billing V3... } %+ of active devices 16
37 What does the user own? 17
38 Bundle bundle = mservice.getpurchases( 3, mcontext.getpackagename(), inapp ); cheap if (bundle.getint(response_code) == BILLING_RESPONSE_RESULT_OK) { ArrayList myskus, mypurchases, mysignatures; myskus = bundle.getstringarraylist(response_inapp_item_list); mypurchases bundle.getstringarraylist( RESPONSE_INAPP_PURCHASE_DATA_LIST); mysignatures = bundle.getstringarraylist( RESPONSE_INAPP_PURCHASE_SIGNATURE_LIST); } // handle items here synchronous! 17
39 18
40 18
41 $ 18
42 19
43 19
44 asdb rwfqf 19
45 REPLAY 20
46 REPLAY asdb rwfqf 20
47 REPLAY Probability that this user IS... asdb rwfqf thrilled an influential blogger 87% of all percentages in this slide may be made up. 20
48 unmanaged items managed items 21
49 Launch the purchase flow 22
50 Launch the purchase flow Bundle bundle = mservice.getbuyintent(3, "com.example.myapp", MY_SKU, inapp, developerpayload); PendingIntent pendingintent = bundle.getparcelable(response_buy_intent); if (bundle.getint(response_code) == BILLING_RESPONSE_RESULT_OK) { startintentsenderforresult(pendingintent, RC_BUY, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0)); } result comes back on onactivityresult() 22
51 23
52 onactivityresult() public void onactivityresult(int requestcode, int resultcode, Intent data) { if (requestcode == RC_BUY) { int responsecode = data.getintextra(response_code); String purchasedata = data.getstringextra( RESPONSE_INAPP_PURCHASE_DATA); String signature = data.getstringextra( RESPONSE_INAPP_SIGNATURE); //... 24
53 Purchase data { } orderid :..., packagename :..., productid :..., purchasetime :..., purchasestate :..., developerpayload,..., purchasetoken :... 25
54 hard to lose the purchase on startup: getpurchases() That s it... right? when user wants to purchase: getbuyintent(), launch the Intent. onactivityresult: handle purchase 26
55 27
56 x x - 27
57 28
58 x x - * not to scale. 28
59 A purchase is forever... [not] 29
60 A purchase is forever... [not] Premium upgrade 29
61 A purchase is forever... [not] Premium upgrade Ad-free 29
62 A purchase is forever... [not] Premium upgrade Ad-free Special items 29
63 A purchase is forever... [not] Premium upgrade Ad-free Special items Levels 29
64 So how do you implement: 30
65 So how do you implement: Health potions 30
66 So how do you implement: Health potions 50 coins 30
67 So how do you implement: Health potions 50 coins Season pass 30
68 Consumption 31
69 Consumable items? 32
70 Consumable items? Bruno s stuff 32
71 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 32
72 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. COOL ITEM 32
73 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? COOL ITEM 32
74 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? { COOL ITEM } COOL ITEM 32
75 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? { COOL ITEM } COOL ITEM 3. Bruno consumes COOL ITEM 32
76 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? { COOL ITEM } 3. Bruno consumes COOL ITEM 32
77 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? { COOL ITEM } 3. Bruno consumes COOL ITEM 4. What items does Bruno own? 32
78 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? { COOL ITEM } 3. Bruno consumes COOL ITEM 4. What items does Bruno own? { } 32
79 Consumable items? Bundle b = mservice.consumepurchase( 3, // API version com.example.xyz, // package name token // purchase token ) 33
80 When should I consume? 34
81 When should I consume? Method 1 on item s actual usage Method 2 immediately upon purchase 34
82 Method 1: On actual usage 35
83 Method 1: On actual usage 35
84 Method 1: On actual usage Bruno s stuff 35
85 Method 1: On actual usage Bruno s stuff 35
86 Method 1: On actual usage Bruno s stuff POTION 35
87 Method 1: On actual usage Bruno s stuff POTION 35
88 Method 1: On actual usage Bruno s stuff POTION 35
89 Method 1: On actual usage Bruno s stuff 35
90 Limitations? I want a potion! POTION 36
91 Limitations? I want a potion! POTION 36
92 Limitations? I want a potion! I find your request illogical, user. POTION 36
93 Method 2: Consume upon purchase Bruno s stuff 37
94 Method 2: Consume upon purchase Bruno s stuff POTION 37
95 Method 2: Consume upon purchase Bruno s stuff 37
96 Method 2: Consume upon purchase Bruno s stuff POTION 37
97 Method 2: Consume upon purchase Bruno s stuff 37
98 Also: Method 2 immediately upon purchase 38
99 Also: Method 2 immediately upon purchase...and also on startup. IMPORTANT! 38
100 Method 2: Consume upon purchase and startup 39
101 Method 2: Consume upon purchase and startup Bruno s stuff POTION 39
102 Method 2: Consume upon purchase and startup Bruno s stuff 39
103 Summarizing on startup: getpurchases() if has potion, consume() onactivityresult: if purchase successful, consume() when user wants to purchase: getbuyintent(), launch the consume(): If consume successful, add potion to inventory. Intent. 40
104 Get product details 41
105 Query SKU details Bundle getskudetails( int apiversion, String packagename, String type, Bundle skusbundle ); 42
106 { productid : xyz123 type : inapp subs, price : $1.99 title : 100 coins description :... } 43
107 { productid : xyz123 type : inapp subs, price : $1.99 title : 100 coins description :... } Note: Price is for display not parsing! 43
108 Subscriptions 44
109 Are subscriptions supported? 45
110 public void onserviceconnected( ComponentName name, IBinder service) { } mservice = IInAppBillingService.Stub.asInterface(service); int response = mservice.isbillingsupported(3, getpackagename(), subs ); if (response == BILLING_RESPONSE_RESULT_OK) { // has V3 subscriptions! } else { // no V3 subscriptions... } 45
111 Launch the purchase flow (subscription) 46
112 Launch the purchase flow (subscription) Bundle bundle = mservice.getbuyintent(3, "com.example.myapp", MY_SKU, subs, developerpayload); PendingIntent pendingintent = bundle.getparcelable(response_buy_intent); if (bundle.getint(response_code) == BILLING_RESPONSE_RESULT_OK) { startintentsenderforresult(pendingintent, RC_BUY, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0)); } result comes back on onactivityresult() 46
113 Bundle b = mservice.consumepurchase( 3, // API version com.example.xyz, // package name token // purchase token ) A subscription can t be consumed. 47
114 Active Subcriptions? 48
115 Active Subcriptions? Bundle bundle = mservice.getpurchases( 3, mcontext.getpackagename(), ITEM_TYPE_SUBS); if (bundle.getint(response_code) == BILLING_RESPONSE_RESULT_OK) { } // same as before... 48
116 trial subscriptions active subscriptions expired subscriptions 49
117 trial subscriptions active subscriptions appear in getpurchases() expired subscriptions 49
118 trial subscriptions active subscriptions appear in getpurchases() expired subscriptions don t appear in getpurchases() 49
119 trial subscriptions active subscriptions appear in getpurchases() cancelled subscriptions * until end of paid billing period expired subscriptions don t appear in getpurchases() 49
120 Local cache? 50
121 Local cache? Google Play app Refresh: 24h (normally) 50
122 Careful with the UI thread! 51
123 This slide isn t responding. Careful with the UI thread! Do you want to close it? Wait OK 51
124 Safe for UI thread isbillingsupported getbuyintent 52
125 Safe for UI thread Don t call on UI thread isbillingsupported getbuyintent getpurchases consumepurchase getskudetails 52
126 Server side subscription API 53
127 Is it valid? subscription When does it expire? Will it auto-renew? subscription Cancel it. 54
128 { orderid :..., packagename :..., productid :..., purchasetime :..., purchasestate :..., developerpayload,..., purchasetoken :... } 55
129 GET androidpublisher/v1/applications/ {packagename}/subscriptions/{subscriptionid}/ purchases/{token} 56
130 { "kind": "androidpublisher#subscriptionpurchase", "initiationtimestampmsec":..., "validuntiltimestampmsec":..., "autorenewing":... } More at: 57
131 Security 58
132 59
133 59
134 Is this purchase legitimate? 59
135 Is this purchase legitimate? arrrrrr! of courrrse! 59
136 60
137 60
138 60
139 Risk Model 61
140 audience likelihood of piracy item value observed # of fake purchases Risk Model total legitimate technical purchases total purchases difficulty 61
141 Making life hard for pirates Your defenses: 1. developer payload 2. signature verification 3. server-side validation 62
142 Developer Payload Bruno s stuff POTION 63
143 Developer Payload Bruno s stuff belongs to Bruno POTION 63
144 Bruno 64
145 Bruno Onurb 64
146 Developer Payload ONURB s stuff 65
147 Developer Payload ONURB s stuff belongs to Bruno POTION 65
148 Signature Verification Your app has a public key Google Play signs purchases Always check signature! 66
149 Signature Verification PublicKey publickey =...; String signeddata =...; String signature =...; Signature sig = Signature.getInstance( SHA1withRSA ); sig.initverify(publickey); sig.update(signeddata.getbytes()); if (!sig.verify(base64.decode(signature))) { // failed! } return true; 67
150 Is client-side security enough? 68
151 Server-Side Validation check signature don t trust the client check order number valid? duplicate? secure the handshake 69
152 Summary MITM Purchase replay Framework compromise 70
153 Summary MITM Purchase replay Framework compromise Wishing really hard x x x 70
154 Summary MITM Purchase replay Framework compromise Wishing really hard x x x Client-side signature x x verification 70
155 Summary MITM Purchase replay Framework compromise Wishing really hard x x x Client-side signature x x verification + unique developer payload x 70
156 Summary MITM Purchase replay Framework compromise Wishing really hard x x x Client-side signature x x verification + unique developer payload x + Server-side verification 70
157 71
158 KEEP CALM AND USE BEST PRACTICES 71
159 KEEP developer payload CALM AND signature verification USE BEST PRACTICES server-side validation 71
160 Sandbox 72
161 Before Now (Sandbox) 73
162 Before Now (Sandbox) mock product mock purchase flow mock result 73
163 Before Now (Sandbox) mock product mock purchase flow mock result real product real credit card real purchase flow real charge 73
164 Before Now (Sandbox) mock product mock purchase flow mock result real product real credit card real purchase flow real product real credit card real result no charge real purchase flow real charge 73
165 purchase test accounts 74
166 75
167 75
168 Sample: TrivalDrive SDK manager code.google.com/p/ marketbilling 76
169 77
170 IAB v2 77
171 IAB v2 IAB v3 77
172 IAB v2 IAB v3 subscriptions 77
173 IAB v2 IAB v3 subscriptions consumption 77
174 IAB v2 IAB v3 subscriptions consumption product details 77
175 IAB v2 IAB v3 subscriptions server API consumption product details 77
176 IAB v2 IAB v3 subscriptions server API security consumption product details 77
177 IAB v2 IAB v3 subscriptions server API security consumption product details sandbox 77
178 78
179 developer experience 78
180 developer experience user experience 78
181
182 <Thank You!> plus.google.com/+brunooliveira Bruno Oliveira
183 Developers
SQLite Database. References. Overview. Structured Databases
SQLite Database References Android Developers Article https://developer.android.com/training/basics/data-storage/databases.html Android SQLite Package Reference https://developer.android.com/reference/android/database/sqlite/package-summary.html
More informationAn Android Studio SQLite Database Tutorial
An Android Studio SQLite Database Tutorial Previous Table of Contents Next An Android Studio TableLayout and TableRow Tutorial Understanding Android Content Providers in Android Studio Purchase the fully
More informationTermite WiFi Direct API
Termite WiFi Direct API Developers Guide 2014/15 Nuno Santos 1. Objectives This document provides a brief description of the Termite WiFi Direct API. 2. Termite API Guide In order for an application to
More informationEMBEDDED SYSTEMS PROGRAMMING Android Services
EMBEDDED SYSTEMS PROGRAMMING 2016-17 Android Services APP COMPONENTS Activity: a single screen with a user interface Broadcast receiver: responds to system-wide broadcast events. No user interface Service:
More informationMobile Computing Practice # 2d Android Applications Local DB
Mobile Computing Practice # 2d Android Applications Local DB In this installment we will add persistent storage to the restaurants application. For that, we will create a database with a table for holding
More informationWriting Efficient Drive Apps for Android. Claudio Cherubino / Alain Vongsouvanh Google Drive Developer Relations
Writing Efficient Drive Apps for Android Claudio Cherubino / Alain Vongsouvanh Google Drive Developer Relations Raise your hand if you use Google Drive source: "put your hands up!" (CC-BY) Raise the other
More informationUse the API or contact customer service to provide us with the following: General ios Android App Name (friendly one-word name)
Oplytic Attribution V 1.2.0 December 2017 Oplytic provides attribution for app-to-app and mobile-web-to-app mobile marketing. Oplytic leverages the tracking provided by Universal Links (ios) and App Links
More informationDatabase Development In Android Applications
ITU- FAO- DOA- TRCSL Training on Innovation & Application Development for E- Agriculture Database Development In Android Applications 11 th - 15 th December 2017 Peradeniya, Sri Lanka Shahryar Khan & Imran
More informationServices. service: A background task used by an app.
CS 193A Services This document is copyright (C) Marty Stepp and Stanford Computer Science. Licensed under Creative Commons Attribution 2.5 License. All rights reserved. Services service: A background task
More informationGetting Started Guide. Version
Getting Started Guide Version 1.15.0.0 2 Introduction Oculus Platform Copyrights and Trademarks 2017 Oculus VR, LLC. All Rights Reserved. OCULUS VR, OCULUS, and RIFT are trademarks of Oculus VR, LLC. (C)
More informationFrequently Asked Questions
Frequently Asked Questions Contents Getting Started 3 Backup & Sync 7 Using NeatCloud on the Web 9 Using NeatMobile 9 Using NeatVerify 10 Adding files to my NeatCloud 10 Searching my NeatCloud files and
More informationTo receive money, just share your enrolled address or U.S. mobile phone number with a friend and ask them to send you money with Zelle.
Consumer FAQs 1. What is Zelle? Zelle is a fast, safe and easy way to send money directly between almost any bank accounts in the U.S., typically within minutes 1. With just an email address or U.S. mobile
More informationAndroid. Broadcasts Services Notifications
Android Broadcasts Services Notifications Broadcast receivers Application components that can receive intents from other applications Broadcast receivers must be declared in the manifest They have an associated
More information07. Data Storage
07. Data Storage 22.03.2018 1 Agenda Data storage options How to store data in key-value pairs How to store structured data in a relational database 2 Data Storage Options Shared Preferences Store private
More informationUnity SDK for Xiaomi (IAP) Unity IAP provides an easy way to integrate Xiaomi IAP with Unity.
Unity SDK for Xiaomi (IAP) 1. Overview 2. Login & Purchase Flow 2.1 Stand-alone login & purchase 2.2 Online login & purchase 3. Technical Integration 3.1 Onboarding to Unity 3.2 Server side integration
More informationThe app requires: Android 4.1 (Jelly Bean) or later Internet connection Bluetooth GPS
FPV Tracker works with the Zbig & Pitlab FPV system. The application connects via Bluetooth to OSD or GroundStation. It extends features of the system. It is available on smartphones and tablets with Android.
More informationOFFLINE MODE OF ANDROID
OFFLINE MODE OF ANDROID APPS @Ajit5ingh ABOUT ME new Presenter( Ajit Singh, github.com/ajitsing, www.singhajit.com, @Ajit5ingh ) AGENDA Why offline mode? What it takes to build an offline mode Architecture
More informationThe Basis of Data. Steven R. Bagley
The Basis of Data Steven R. Bagley So far How to create a UI View defined in XML Java-based Activity as the Controller Services Long running processes Intents used to send messages between things asynchronously
More informationAndroid Services & Local IPC: Overview of Programming Bound Services
: Overview of Programming Bound Services d.schmidt@vanderbilt.edu www.dre.vanderbilt.edu/~schmidt Professor of Computer Science Institute for Software Integrated Systems Vanderbilt University Nashville,
More informationFAQ for Autodesk A360 and its tiers A360 Team, A360 Drive and the Tech Preview
Autodesk A360 FAQ for Autodesk A360 and its tiers A360 Team, A360 Drive and the Tech Preview Table of contents 1. General product information 2 1.1 What is Autodesk A360? 2 1.2 What is Autodesk A360 Team?
More informationON SCHEDULE TERMS AND CONDITIONS (September 23rd 2018)
By using On Schedule web application you are making an agreement with us, code fish, according to the current terms and conditions at the time of use. Upon the terms and conditions changing you will be
More informationAndroid About.me/DavidCorrado Mobile Meetup Organizer
Android Tips/Tricks @DavidCorrado About.me/DavidCorrado Mobile Meetup Organizer IDE Don t Use Eclipse Use either Android Studio/IntelliJ They are basically the same thing. They are both built off of IntelliJ
More informationNetworking & Internet
In App Purchase Programming Guide Networking & Internet 2011-06-17 Apple Inc. 2011 Apple Inc. All rights reserved. exclusion may not apply to you. This warranty gives you specific legal rights, and you
More informationVantiv ecommerce for Magento 2
Vantiv ecommerce for Magento 2 User Guide Version 1.0.0 June 2017 Table of Content 1. Onboarding...3 2. Installation...3 3. Configuration...5 4. Nuances for each MOP...22 5. Checkout...23 6. Stored Payment
More informationAnimation: Enter Vouchers by Item or Amount?
Creating Manual Vouchers Topic 1 Monday, May 23, 2011 Page 1: Animation: Enter Vouchers by Item or Amount? Teacher Narration: When your company has a non-inventory expense, such as a utility bill, a cleaning
More information2. What is Google App Engine. Overview Google App Engine (GAE) is a Platform as a Service (PaaS) cloud computing platform for developing and hosting web applications in Google-managed data centers. Google
More informationVantiv ecommerce for Magento 1 User Guide. Version 1.0.7
Vantiv ecommerce for Magento 1 User Guide Version 1.0.7 Vantiv ecommerce for Magento 1... 1 User Guide... 1 1. Project... 3 2. Onboarding... 3 3. Installation... 3 4. Configuration... 5 5. Nuances for
More informationSAGE DISTRIBUTOR APPLICATION
SAGE DISTRIBUTOR APPLICATION Please email or fax in your application with your credit card information, or mail your application to us with a check. It usually takes approximately two business days for
More informationGlobal Phone (GlocalMe S1) Connect APP Quick Start Guide
Global Phone (GlocalMe S1) Connect APP Quick Start Guide Ver 1.5 Connect Please ensure your device is always with the latest firmware version for the best user experience. Applicable to Global Phone Service
More informationSamsung In App Purchase v2.0 Programming Guide
Samsung In App Purchase v2.0 Programming Guide Revision History Version Description Author Date 1.0 Created 13.04.15 2.0.1 Security-related content added 13.06.04 2.0.2 Mode parameter added to getitemlist
More informationServices. Marco Ronchetti Università degli Studi di Trento
1 Services Marco Ronchetti Università degli Studi di Trento Service An application component that can perform longrunning operations in the background and does not provide a user interface. So, what s
More informationANDROID CABBIE S MATE APP TROUBLESHOOTING AND PREVIOUSLY ASKED QUESTIONS: INDEX
ANDROID CABBIE S MATE APP TROUBLESHOOTING AND PREVIOUSLY ASKED QUESTIONS: This page was updated on 26 th March 2018 INDEX 1. I have a new device or I have reset my device and I am being prevented from
More informationAndroid Programming Lecture 7 9/23/2011
Android Programming Lecture 7 9/23/2011 Multiple Activities So far, projects limited to one Activity Next step: Intra-application communication Having multiple activities within own application Inter-application
More informationRUNTIME PERMISSIONS IN ANDROID 6.0 Lecture 10a
RUNTIME PERMISSIONS IN ANDROID 6.0 Lecture 10a COMPSCI 702 Security for Smart-Devices Muhammad Rizwan Asghar March 20, 2018 2 ANDROID 6.0 A version of the Android mobile operating system officially released
More informationServices are software components designed specifically to perform long background operations.
SERVICES Service Services are software components designed specifically to perform long background operations. such as downloading a file over an internet connection or streaming music to the user, but
More informationAmazon Instant Access Integration Guide. Subscriptions (SaaS)
Amazon Instant Access Integration Guide Subscriptions (SaaS) TABLE OF CONTENTS 1. INTRODUCTION... 3 2. SUBSCRIPTION PRODUCT OFFERINGS... 4 3. API OVERVIEW AND SPECIFICATIONS... 5 ACCOUNT LINKING ENDPOINT...
More informationEng. Jaffer M. El-Agha Android Programing Discussion Islamic University of Gaza. Data persistence
Eng. Jaffer M. El-Agha Android Programing Discussion Islamic University of Gaza Data persistence Shared preferences A method to store primitive data in android as key-value pairs, these saved data will
More informationApplication / Document Management. MaaS360 e-learning Portal Course 3
Application / Document Management MaaS360 e-learning Portal Course 3 Agenda > Application Management Overview MaaS360 Workflows Device Workflows > Document Management Overview MaaS360 Workflows Document
More informationSqlite Update Failed With Error Code 19 Android
Sqlite Update Failed With Error Code 19 Android i'm wrote simple DataBaseHelper to use SQlite in android. after create class as : static final int DATABASE_VERSION = 1, private SQLiteDatabase mdatabase,
More informationAdobe Document Cloud esign Services. for Salesforce Version 17 Installation and Customization Guide
Adobe Document Cloud esign Services for Salesforce Version 17 Installation and Customization Guide 2015 Adobe Systems Incorporated. All rights reserved. Last Updated: August 28, 2015 Table of Contents
More informationBlackBerry Developer Summit. A02: Rapid Development Leveraging BEMS Services and the AppKinetics Framework
BlackBerry Developer Summit A02: Rapid Development Leveraging BEMS Services and the AppKinetics Framework Page 2 of 21 Table of Contents 1. Workbook Scope... 4 2. Compatibility... 4 3. Source code download
More informationSymantec Backup Exec Blueprints
Symantec Backup Exec Blueprints Blueprint for Optimized Duplication Backup Exec Technical Services Backup & Recovery Technical Education Services Symantec Backup Exec Blueprints - Optimized Duplication
More informationrat Comodo EDR Software Version 1.7 Administrator Guide Guide Version Comodo Security Solutions 1255 Broad Street Clifton, NJ 07013
rat Comodo EDR Software Version 1.7 Administrator Guide Guide Version 1.1.120318 Comodo Security Solutions 1255 Broad Street Clifton, NJ 07013 Table of Contents 1 Introduction to Comodo EDR...3 1.1 Purchase
More informationAdVenture Capitalist Post-Mortem
AdVenture Capitalist Post-Mortem (and please install AdVenture Capitalist) Back-end building blocks for your live game. Storage, compute, commerce, analytics and much, much more. Mission control for your
More informationN4A Device Manager 4.6.0
N4ACMSX-UG460 N4A Device Manager 4.6.0 User Guide Version 1.0 October 30, 2015 NOVATEL WIRELESS COPYRIGHT STATEMENT 2015 Novatel Wireless, Inc. All rights reserved. The information contained in this document
More informationCleanMyPC User Guide
CleanMyPC User Guide Copyright 2017 MacPaw Inc. All rights reserved. macpaw.com CONTENTS Overview 3 About CleanMyPC... 3 System requirements... 3 Download and installation 4 Activation and license reset
More informationAndroid Help. Section 8. Eric Xiao
Android Help Section 8 Eric Xiao The Midterm That happened Any residual questions? New Assignment! Make a low-fi prototype Must be interactive Use balsamiq or paper Test it with users 3 tasks Test task
More informationAndroid Services & Local IPC: The Command Processor Pattern (Part 1)
: The Command Processor Pattern (Part 1) d.schmidt@vanderbilt.edu www.dre.vanderbilt.edu/~schmidt Professor of Computer Science Institute for Software Integrated Systems Vanderbilt University Nashville,
More informationMessage Passing & APIs
CS 160 User Interface Design Message Passing & APIs Section 05 // September 25th, 2015 Tricia Fu // OH Monday 9:30-10:30am // triciasfu@berkeley.edu Agenda 1 Administrivia 2 Brainstorm Discussion 3 Message
More informationMercadoLibre Integration for Magento Guide
by CedCommerce Products Documentation 1 / 33 1. Overview... 3 2. Configuration... 3 3. Profile Management... 10 3.1. Adding a Profile... 10 3.2. Editing a Profile... 15 3.3. Change the Status of Profile...
More informationSpecial Conditions and Service Description for amaysim Data Only
Special Conditions and Service Description for amaysim Data Only amaysim Australia Ltd, PO Box R567, Royal Exchange NSW 1225, Australia, ABN 65 143 613 478, ACN 143 613 478 Table of Contents 1. ABOUT THESE
More informationUnity SDK for Xiaomi (IAP) Unity IAP provides an easy way to integrate Xiaomi IAP with Unity.
Unity SDK for Xiaomi (IAP) 1. Overview 2. Login & Purchase Flow 2.1 Stand-alone login & purchase 2.2 Online login & purchase 3. Technical Integration 3.1 Onboarding to Unity 3.2 Server side integration
More informationHandbook: Carbonite Safe
1 Important Things to Know... 4 Carbonite Features... 5 Setting Up and Installing... 6 Starting a Trial... 7 Installing Carbonite for the First Time... 7 Buying a Subscription... 8 Subscription Pricing...
More informationVirtualSwindle: An Automated Attack Against In-App Billing on Android
Northeastern University Systems Security Lab VirtualSwindle: An Automated Attack Against In-App Billing on Android ASIACCS 2014 Collin Mulliner, William Robertson, Engin Kirda {crm,wkr,ek}[at]ccs.neu.edu
More informationOverview What is Azure Multi-Factor Authentication? How it Works Get started Choose where to deploy MFA in the cloud MFA on-premises MFA for O365
Table of Contents Overview What is Azure Multi-Factor Authentication? How it Works Get started Choose where to deploy MFA in the cloud MFA on-premises MFA for O365 users Security best practices How to
More informationHandbook: Carbonite Safe
1 Welcome to Carbonite! Important Things to Know...4 Carbonite Features...5 Setting Up and Installing...6 Starting a Trial... 7 Installing Carbonite for the First Time... 7 Buying a Subscription...9 Subscription
More informationSitelokTM. Stripe Plugin V1.5
SitelokTM Stripe Plugin V1.5 Sitelok Stripe Plugin Manual Copyright 2015-2018 Vibralogix. All rights reserved. This document is provided by Vibralogix for informational purposes only to licensed users
More informationServices. Background operating component without a visual interface Running in the background indefinitely
Services Background operating component without a visual interface Running in the background indefinitely Differently from Activity, Service in Android runs in background, they don t have an interface
More informationCello How-To Guide. Package Management
Cello How-To Guide Package Management Contents 1 Package Management... 4 1.1 How to implement packages in cello... 4 1.2 Cello Package Structure... 4 1.3 How to Configure a Module... 5 1.4 How to Configure
More informationWardenCam User Manual Documentation
WardenCam User Manual Documentation Release 1.0 WardenCam360 Sep 25, 2017 Contents 1 What is WardenCam? 3 2 Getting Started 5 2.1 Quick Installation Guide......................................... 5 2.2
More informationUser Guide Mobile Point-of-Sale (mpos), Version 2.0
User Guide Mobile Point-of-Sale (mpos), Version 2.0 Contents Overview... 1 Features... 1 Getting Started... 2 Login... 3 First Time Login/Password Reset... 3 Setting Security Questions... 4 Password Expiring...
More informationData Feeds Traffic Setup Instructions
Data Feeds Traffic Setup Instructions In this document we ll first cover data feeds and traffic, then we ll cover actual setup. Data feeds are simple to find and simple to setup. They are also often less
More informationPublisher Onboarding Kit
Publisher Onboarding Kit Smart content. Smart business. Publishing, Supporting & Selling HotDocs Market Templates A HotDocs Market publisher s guide for loading templates, answering customer questions
More informationServices Broadcast Receivers Permissions
Services Broadcast Receivers Permissions Runs in the background Extends Service Java class Not necessarily connected to the user s visual interface Music player working in foreground User wants read email
More informationAutodesk App Store Browser-based App Submission Process Overview
Autodesk App Store Browser-based App Submission Process Overview Please read through this information before and while submitting your first app to the Autodesk App store. It explains the basic workflow
More informationWells Fargo Merchant Services. Wells Fargo Mobile Merchant User Guide for Apple ipad Version 3.2
Wells Fargo Merchant Services Wells Fargo Mobile Merchant User Guide for Apple ipad Version 3.2 Table of Contents Overview...3 Key Features...3 Download Wells Fargo...4 Mobile Merchant...4 Demo Mode...4
More informationSoftware Practice 3 Today s lecture Today s Task
1 Software Practice 3 Today s lecture Today s Task Prof. Hwansoo Han T.A. Jeonghwan Park 43 2 MULTITHREAD IN ANDROID 3 Activity and Service before midterm after midterm 4 Java Thread Thread is an execution
More informationCIBC FirstCaribbean Mobile App. FREQUENTLY ASKED QUESTIONS (FAQs) Page 1 of 9
CIBC FirstCaribbean Mobile App FREQUENTLY ASKED QUESTIONS (FAQs) 1. What is the CIBC FirstCaribbean Mobile App? A: The CIBC FirstCaribbean Mobile App allows you to complete everyday banking functions on
More informationProduced by. Mobile Application Development. David Drohan Department of Computing & Mathematics Waterford Institute of Technology
Mobile Application Development Produced by David Drohan (ddrohan@wit.ie) Department of Computing & Mathematics Waterford Institute of Technology http://www.wit.ie Android & Firebase" Part 4 Firebase Integration
More informationIntegration Service. Admin Console User Guide. On-Premises
Kony Fabric Integration Service Admin Console User Guide On-Premises Release V8 SP1 Document Relevance and Accuracy This document is considered relevant to the Release stated on this title page and the
More informationChapter 9: Key Management
Chapter 9: Key Management Session and Interchange Keys Key Exchange Cryptographic Key Infrastructure Storing and Revoking Keys Digital Signatures Slide #9-1 Overview Key exchange Session vs. interchange
More informationPublic-Key Infrastructure NETS E2008
Public-Key Infrastructure NETS E2008 Many slides from Vitaly Shmatikov, UT Austin slide 1 Authenticity of Public Keys? private key Alice Bob public key Problem: How does Alice know that the public key
More informationIt s a Smart Phone World
It s a Smart Phone World Like most of us, you probably own and extensively use a smart phone. It is the access point that manages your calls, texts, email, business and social world. You take it everywhere
More informationCollector and Dealer Software - CAD 3.1
Collector and Dealer Software - CAD 3.1 Your Registration Number Thank you for purchasing CAD! To ensure that you can receive proper support, we have already registered your copy with the serial number
More informationDepartment of Electrical Engineering and Computer Science MASSACHUSETTS INSTITUTE OF TECHNOLOGY Fall Quiz II
Department of Electrical Engineering and Computer Science MASSACHUSETTS INSTITUTE OF TECHNOLOGY 6.858 Fall 2011 Quiz II You have 80 minutes to answer the questions in this quiz. In order to receive credit
More informationZENworks Reporting ZENworks Reporting Universe Objects and Predefined Reports Reference. July 2017
ZENworks Reporting 6.2.1 ZENworks Reporting Universe Objects and Predefined Reports Reference July 2017 Legal Notices For information about legal notices, trademarks, disclaimers, warranties, export and
More informationTERMS AND CONDITIONS FOR THE SAFARICOM PLATINUM SERVICE
TERMS AND CONDITIONS FOR THE SAFARICOM PLATINUM SERVICE The following Terms and Conditions apply to the Safaricom Platinum Plans Service ( the Service ) and by activating this Service, you will be deemed
More informationWindows 10 Professional for (Almost) Free. Add the Expert Features of Windows 10 Professional to Your Home System for Virtually Nothing
Windows 10 Professional for (Almost) Free W 734/1 Add the Expert Features of Windows 10 Professional to Your Home System for Virtually Nothing Using the information given in this article you will be able
More informationContents OVERVIEW... 3
Contents OVERVIEW... 3 Feature Summary... 3 CONFIGURATION... 4 System Requirements... 4 ConnectWise Manage Configuration... 4 Configuration of Manage Login... 4 Configuration of Integrator Login... 5 Option
More informationregister/unregister for Intent to be activated if device is within a specific distance of of given lat/long
stolen from: http://developer.android.com/guide/topics/sensors/index.html Locations and Maps Build using android.location package and google maps libraries Main component to talk to is LocationManager
More informationServer Management & Purchasing Guide
USER GUIDE MADCAP CENTRAL Server Management & Purchasing Guide Copyright 2018 MadCap Software. All rights reserved. Information in this document is subject to change without notice. The software described
More informationworksmart!-mobile User Guide Version 3.5 worksmart!-mobile User Guide 1 Copyright 2005 Mobile Workforce, Inc.
worksmart!-mobile User Guide 1 Copyright 2005 Mobile Workforce, Inc. Copyright Notice Mobile Workforce, Inc. has copyright ownership of the Mobile Workforce-workSmart! applications and other software related
More informationFrequently Asked Questions. Question # Page #
Circles of Trust Frequently Asked Questions Question # Page # 1 What is Circles of Trust?... 2 2 Where can I get Circles of Trust?... 2 3 What is a.tef file?... 2 4 Someone sent me a.tef file. How do I
More informationD&B360. User Guide. for Microsoft Dynamics CRM. Version 2.3
D&B360 User Guide for Microsoft Dynamics CRM Version 2.3 D&B360 is a trademark or registered trademark of Dun and Bradstreet, Incorporated. Other trademarks used herein are the trademarks or registered
More informationApp Development for Smart Devices. Lec #7: Windows Azure
App Development for Smart Devices CS 495/595 - Fall 2011 Lec #7: Windows Azure Tamer Nadeem Dept. of Computer Science Objective Working in Background AsyncTask Cloud Computing Windows Azure Two Presentation
More informationTable of Contents: ipayment for Android
for Android Tablets Table of Contents: Two-Factor Authentication... 3 Card reader... 4 Bluetooth Card reader... 5 Receipt Printer... 6 Logging in to ipayment MobilePay... 7 Demo Mode... 7 Reset Password...
More informationSpring 2010: CS419 Computer Security
Spring 2010: CS419 Computer Security Vinod Ganapathy Lecture 7 Topic: Key exchange protocols Material: Class handout (lecture7_handout.pdf) Chapter 2 in Anderson's book. Today s agenda Key exchange basics
More informationCS378 -Mobile Computing. Services and Broadcast Receivers
CS378 -Mobile Computing Services and Broadcast Receivers Services One of the four primary application components: activities content providers services broadcast receivers 2 Services Application component
More informationAndroid Programming Lecture 8: Activities, Odds & Ends, Two New Views 9/28/2011
Android Programming Lecture 8: Activities, Odds & Ends, Two New Views 9/28/2011 Return Values from Activities: Callee Side How does the Sub-Activity send back a response? Create an Intent to return Stuff
More informationInstallation guide Swisscom Mobile Security for Android Devices
Security for 1 Installation of Mobile Security...2 1.1 operating system devices with preinstalled Mobile Security program...2 1.2 operating system devices with preinstalled Swisscom Security Launcher...2
More informationAPPLICATION ADMINISTRATOR GUIDE
APPLICATION ADMINISTRATOR GUIDE BrightSign Network Enterprise Edition Version 4.2 BrightSign, LLC. 16780 Lark Ave., Suite B Los Gatos, CA 95032 408-852-9263 www.brightsign.biz TABLE OF CONTENTS Introduction
More informationMobile Application Development Android
Mobile Application Development Android Lecture 3 MTAT.03.262 Satish Srirama satish.srirama@ut.ee Android Lecture 2 - recap Views and Layouts Events Basic application components Activities Intents 9/15/2014
More informationEbay Integration User Guide 0.0.1
by CedCommerce Products User Guides 1 / 34 1. Ebay Integration for Magento 2 store Overview... 3 2. Ebay Integration for Magento 2 store extension Installation... 4 3. ebay Configuration Settings... 4
More informationWhat's New on Release 26.1
What's New on Release 26.1 Welcome to Eagle Release 26.1 (server Level 38). This document summarizes the new features and enhancements. Use the red links below to take you to a particular section of this
More informationMadCap Central. Server Management & Purchasing Guide
MadCap Central Server Management & Purchasing Guide Copyright 2017 MadCap Software. All rights reserved. Information in this document is subject to change without notice. The software described in this
More informationMB Microsoft Dynamics CRM 2016 Online Deployment.
MB2-710 Microsoft Dynamics CRM 2016 Online Deployment Getting Started Overview CRM Online is a cloud-based offering of Microsoft Dynamics CRM The licensing is a subscription-based model with a monthly
More informationPLR-MRR-Products.com 1
PLR-MRR-Products.com 1 You may give away this ebook. It may not be modified in any manner. Brought to You by PLR-MRR-Products.com Disclaimer Reasonable care has been taken to ensure that the information
More informationSappi Ariba Network. Summit Guided Session: Account Configuration
Sappi Ariba Network Summit Guided Session: Account Configuration 1 Manage invitation letter + 2 Landing Page Sappi 2 1 1 Open the Invitation Letter that you received at your email address from ordersender-prod@ansmtp.ariba.com
More informationCS 167 Final Exam Solutions
CS 167 Final Exam Solutions Spring 2018 Do all questions. 1. [20%] This question concerns a system employing a single (single-core) processor running a Unix-like operating system, in which interrupts are
More informationHow to Look Like a Healthy Borrower
How to Look Like a Healthy Borrower Frequently Asked Questions February 2013 Table of Contents Overview 2 General Information 2 When is this webinar? 2 What is this webinar about? 2 What can I expect to
More information