The great thing about books? You can never get enough of them. But if you find your book collection becoming unmanageable, there are plenty of home library apps to help you get it under control. Take stock of the tomes on your increasingly crowded shelves with these eight top-rated cataloging home library apps for iPhone and Android. Then you can carry your personal library right in your pocket for easy reference.
- Watchtower Library Android App Download
- Watchtower Library Android App Pc
- Watchtower Library Android App Offline
- Watchtower Library App Download
- Download Watchtower Library For Windows
These features were released in February 2015 with JW Library 1.4, which is compatible with Android 2.3 or later. If you don't see these features, please follow the instructions in the article 'Start Using JW Library —Android,' under Get the Latest Features. Because Moses had been Israel's leader for so long, Joshua may have wondered how God's people would respond to his leadership. 34:8, 10-12) One Bible reference work, referring to Joshua 1:1, 2, notes: 'In both ancient and modern times a transition of leadership is one of the most precarious times in the security of a state.'Joshua must have had legitimate fears, but within a few.
1. Goodreads
Like many avid readers, I use Goodreads to keep track of my TBR and read negative reviews of books I love to make myself angry for fun. But there's a lesser-known barcode scanner feature that lets you add books directly to lists without having to search for them. This is a great way to keep tabs on what you've already read vs. what you hope to read in the future. And, it's free!
Available for iOS and Android.
2. Libib
Finally, an app for amateur librarians (we're out there, I promise). Libib offers both paid and unpaid plans. The free option lets you scan and organize up to 5,000 books—plus movies, video games, and albums—while the pro plan has space for up to 100,000. Both versions of the app give users access to tons of additional features.
Available for iOS or Android.
3. Delicious Library 3
Statistics nerds will fall for this app's chart feature. It breaks down everything from the retail value of your book collection to the amount of pages currently on your shelves. Delicious Library also makes recommendations based on how you rate books you've read, so you always have inspo for your TBR.
Available for iOS and Android.
4. Reco
While not a cataloguing app in the traditional sense, Reco lets you keep track of recommendations from friends, and dole them out too. Think of it as your cheat sheet for when you can't remember what books you wanted to read while you're browsing at Barnes and Noble.
Available for iOS.
5. Library Thing
Library Thing is similar to Goodreads, but with a stronger focus on the cataloging aspect. Part social media platform, part library-style catalog, the app sources book info from more than 4,967 libraries worldwide (plus Amazon). There's even a feature that tracks titles you've lent out to friends. If you're generous enough to let any of your books out of sight, that is.
Available for iOS and Android.
6. Book Catalogue
This app takes more of a bare-bones approach. It allows users to input titles manually or search by IBSN or barcode and sort using a variety of metrics including author name. It's free and has a 4.4 rating on the Google Play store.
Available for Android.
7. Gerty
Gerty is for readers who really miss taking literature classes in college. While primarily an ereader, it allows you to organize both physical books and ebooks on shelves. Note-taking and journaling features let you annotate your reading experience in myriad fun, interactive ways.
Available for iOS.
8. Book Crawler
This is another stellar cataloguing app that helps you compile an easily searchable list of books you own, It connects with Goodreads so you can check out reviews of titles you haven't read yet or see how your opinions on books differ from that of your friends.
Available for iOS.
What are your favorite home library apps?
This topic describes how to integrate the Google Play Billing Library intoyour app to start selling products. Before reading this topic, be sureyou've set up your Google Play configuration beforehand by following the stepsin Getting ready.
This topic includes code examples that are based on the officialsample apps on GitHub. Seeadditional resourcesfor a complete list of sample apps and other resources that you can usewhile integrating.
Life of a purchase
Here's a typical purchase flow for a one-time purchase or a subscription.
- Show the user what they can buy.
- Launch the purchase flow for the user to accept the purchase.
- Verify the purchase on your server.
- Give content to the user, and acknowledge delivery of the content.Optionally, mark the item as consumed so that the user can buy the itemagain.
Subscriptions automatically renew until they are canceled. A subscription cango through the following states:
- Active: User is in good standing and has access to the subscription.
- Cancelled: User has cancelled but still has access until expiration.
- In grace period: User experienced a payment issue, but still hasaccess while Google is retrying the payment method.
- On hold: User experienced a payment issue, and no longer has accesswhile Google is retrying the payment method.
- Paused: User paused their access, and does not have access untilthey resume.
- Expired: User has cancelled and lost access to the subscription.The user is considered churned at expiration.
Purchase tokens and Order IDs
Google Play tracks products and transactions using purchase tokensand Order IDs.
- A purchase token is a string that represents a buyer's entitlement to aproduct on Google Play. It indicates that a Google user is entitledto a specific product that is represented by a SKU. You can use thepurchase token with the Google Play Developer API.
- An Order ID is a string that represents a financial transaction onGoogle Play. This string is included in a receipt that is emailed tothe buyer. You can use the Order ID to manage refunds in theused in sales and payout reports.
Order IDs are created every time a financial transaction occurs. Purchasetokens are generated only when a user completes a purchase flow.
- For one-time products, every purchase creates a new purchase token. Mostpurchases also generate a new Order ID. The exception to this is when theuser is not charged any money, as described inPromo codes.
- For subscriptions, an initial purchase creates a purchase token and anOrder ID. For each continuous billing period, the purchase token staysthe same, and a new Order ID is issued. Upgrades, downgrades, replacements,and re-sign-ups all create new purchase tokens and Order IDs.
For subscriptions, note the following:
- Subscription upgrades, downgrades, and other subscription purchaseflows generate purchase tokens that must replace a previouspurchase token. You must invalidate the purchase tokens that appear in the
linkedPurchaseToken
field of the Google Play Developer API. For moreinformation, seeImplementing linkedPurchaseToken correctly to prevent duplicate subscriptions. - Order numbers for subscription renewals contain anadditional integer that represents a specific renewal instance. Forexample, an initial subscription Order ID might be
GPA.1234-5678-9012-34567
with subsequent Order IDs beingGPA.1234-5678-9012-34567..0
(first renewal),GPA.1234-5678-9012-34567..1
(second renewal), and so on.
Error Handling
The Google Play Billing Library returns errors in the form ofBillingResult
.A BillingResult
contains aBillingResponseCode
,which categorizes possible billing-related errors that your app can encounter.For example, if you receive a SERVICE_DISCONNECTED
error code, your app should reinitialize the connection with Google Play.Additionally, a BillingResult
contains adebug message,which is useful during development to diagnose errors.
Connect to Google Play
The first step to integrate with Google Play's billing system is to add thelibrary to your app and initialize a connection.
Add the Google Play Billing Library dependency
Note: If you've followed the Getting readyguide, then you've already added the necessary dependencies and can move onto the next section.Add the Google Play Billing Library dependency to your app'sbuild.gradle
file as shown:
If you're using Kotlin, the Play Billing Library KTX module containsKotlin extensions and coroutines support that enable you to writeidiomatic Kotlin when using the Google Play Billing Library. To includethese extensions in your project, add the following dependency to yourapp's build.gradle
file as shown:
Initialize a BillingClient
Once you've added a dependency on the Google Play Billing Library, you need toinitialize a BillingClient
instance. BillingClient
is the main interface for communication between theGoogle Play Billing Library and the rest of your app. BillingClient
provides convenience methods, both synchronous and asynchronous, formany common billing operations.
To create a BillingClient
, usenewBuilder()
.To receive updates on purchases, you must also callsetListener()
,passing a reference to aPurchasesUpdatedListener
.This listener receives updates for all purchases in your app.
Establish a connection to Google Play
After you have created a BillingClient
, you need to establish a connectionto Google Play.
To connect to Google Play, callstartConnection()
.The connection process is asynchronous, and you must implement aBillingClientStateListener
to receive a callback once the setup of the client is complete and it'sready to make further requests.
You must also implement retry logic to handle lost connections toGoogle Play. To implement retry logic, override theonBillingServiceDisconnected()
callback method, and make sure that the BillingClient
calls thestartConnection()
method to reconnect to Google Play before making further requests.
The following example demonstrates how to start a connection and test thatit's ready to use:
Note: It's strongly recommended that you implement your own connectionretry logic and override theonBillingServiceDisconnected()
method. Make sure you maintain the BillingClient
connection whenexecuting any methods.Show products available to buy
After you have established a connection to Google Play, you areready to query for your available products and display them to your users.To query Google Play for in-app product details, callquerySkuDetailsAsync()
.Querying for SKU details is an important step before displaying your productsto your users, as it returns localized product information. Forsubscriptions, ensure your product displayfollows all Play policies.
When calling querySkuDetailsAsync()
, pass an instance ofSkuDetailsParams
that specifies a list of product ID strings created in Google Play Consolealong with a SkuType
. The SkuType
can be either SkuType.INAPP
forone-time products or SkuType.SUBS
for subscriptions.
To handle the result of the asynchronous operation, you must also specify alistener which implements theSkuDetailsResponseListener
interface. You can then overrideonSkuDetailsResponse()
,which notifies the listener when the query finishes, as shown in the followingexample:
The Google Play Billing Library stores the query results in a List
ofSkuDetails
objects.You can then call a variety of methods on each SkuDetails
object in thelist to view relevant information about an in-app product, such asits price or description. To view the available product detail information,see the list of methods in theSkuDetails
class.
Before offering an item for sale, check that the user does not alreadyown the item. If the user has a consumable that is still in their itemlibrary, they must consume the item before they can buy it again.
Before offering a subscription, verify that the user is not already subscribed.
Note: Some Android devices might have an older version of the Google PlayStore app that doesn't support certain products types, such assubscriptions. Before your app enters the billing flow, you can callisFeatureSupported()
to determine whether the device supports the products you want to sell.For a list of product types that can be supported, seeBillingClient.FeatureType
.Launch the purchase flow
To start a purchase request from your app, call thelaunchBillingFlow()
method from your app's main thread. This method takes a reference to aBillingFlowParams
object that contains the relevantSkuDetails
objectobtained from callingquerySkuDetailsAsync()
.To create a BillingFlowParams object, use theBillingFlowParams.Builder
class.
The launchBillingFlow()
method returns one of several response codeslisted inBillingClient.BillingResponseCode
.Be sure to check this result to ensure there were no errors launching thepurchase flow. A BillingResponseCode
of OK
indicates a successful launch.
On a successful call to launchBillingFlow()
, the system displays theGoogle Play purchase screen. Figure 1 shows a purchase screen for asubscription:
Google Play calls onPurchasesUpdated()
to deliver the result ofthe purchase operation to a listener that implements thePurchasesUpdatedListener
interface. The listener is specified using thesetListener()
method when you initialized your client.
You must implement onPurchasesUpdated()
to handle possible response codes.The following example shows how to override onPurchasesUpdated()
:
A successful purchase generates a Google Play purchase success screensimilar to figure 2.
A successful purchase also generates a purchase token, which is a uniqueidentifier that represents the user and the product ID for thein-app product they purchased. Your apps can store the purchase tokenlocally, though we recommend passing the token to your secure backend serverwhere you can then verify the purchase and protect against fraud. Thisprocess is further described in the following section.
The user is also emailed a receipt of the transaction containing an OrderID or a unique ID of the transaction. Users receive an email with a uniqueOrder ID for each one-time product purchase, and also for the initialsubscription purchase and subsequent recurring automatic renewals. Youcan use the Order ID to manage refunds in the Google Play Console.
Processing purchases
Once a user completes a purchase, your app then needs to process thatpurchase. In most cases, your app is notified of purchases through yourPurchasesUpdatedListener
.but there are cases where your app is made aware of callingBillingClient.queryPurchases()
as described in Fetching purchases.
Your app should process a purchase in the following way:
- Verify the purchase.
- Give content to the user, and acknowledge delivery of the content.Optionally, mark the item as consumed so that the user can buythe item again.
To verify a purchase, first check that thepurchase stateis PURCHASED
.If the purchase is PENDING
, then you should process the purchase as describedin Handling pending transactions. For purchases received fromonPurchaseUpdated()
or queryPurchases,you should further verify the purchase to ensure legitimacy before yourapp grants entitlement. To learn how to properly verify a purchase, seeVerify purchases before granting entitlements.
Once you've verified the purchase, your app is ready to grantentitlement to the user. After granting entitlement, your appmust then acknowledge the purchase. This acknowledgement communicates toGoogle Play that you have granted entitlement for the purchase.
Note: If you do not acknowledge a purchase within three days, the userautomatically receives a refund, and Google Play revokes the purchase.Watchtower Library Android App Download
Note:The process to grant entitlement and acknowledge the purchase depends onwhether the purchase is a non-consumable, a consumable, or a subscription.
For consumables, theconsumeAsync()
method fulfills the acknowledgement requirement and indicates that your apphas granted entitlement to the user. This method also enables your app to makethe one-time product available for purchase again.
To indicate that a one-time product has been consumed, call consumeAsync()
and include the purchase token that Google Play should make available forrepurchase. You must also pass an object that implements theConsumeResponseListener
interface. This object handles the result of the consumption operation.You can override theonConsumeResponse()
method, which the Google Play Billing Library calls when the operationis complete.
The following example illustrates consuming a product using the associatedpurchase token:
Note: Because consumption requests can occasionally fail, you must checkyour secure backend server to ensure that each purchase token hasn't beenused so your app doesn't grant entitlement multiple times for the samepurchase. Alternatively, your app can wait until you receive a successfulconsumption response from Google Play before granting entitlement. Ifyou choose to withhold purchases from the user until Google Play sendsa successful consumption response, you must be very careful not to losetrack of the purchase after the consumption request.To acknowledge non-consumable purchases, use eitherBillingClient.acknowledgePurchase()
from the Billing Library orProduct.Purchases.Acknowledgefrom the Google Play Developer API. Before acknowledging a purchase, yourapp should check whether it was already acknowledged by using theisAcknowledged()
method in the Google Play Billing Library or theacknowledgementState
field in the Google Developer API.
The following example shows how to acknowledge a purchase usingthe Google Play Billing Library:
Subscriptions are handled similarly to non-consumables. You canacknowledge a subscription Acknowledgement using eitherBillingClient.acknowledgePurchase()
from the Google Play Billing Library orPurchases.Subscriptions.Acknowledge
from the Google Play Developer API. All initial subscription purchases needto be acknowledged. Subscription renewals do not need to be acknowledged.For more information on when subscriptions need to be acknowledged, see theSell subscriptions topic.
Fetching purchases
Listening to purchase updates using aPurchasesUpdatedListener
is not sufficient to ensure your app processes all purchases. It's possiblethat your app might not be aware of all the purchases a user has made. Hereare some scenarios where your app could lose track or be unaware of purchases:
- Network Issues during the purchase: A user makes a successfulpurchase and receives confirmation from Google, but their device losesnetwork connectivity before their device receives notification ofthe purchase through the
PurchasesUpdatedListener
. - Multiple devices: A user buys an item on one device and thenexpects to see the item when they switch devices.
- Handling purchases made outside your app: Some purchases, suchas promotion redemptions, can be made outside of your app.
To handle these situations, be sure that your app callsBillingClient.queryPurchases()
in your onResume()
and onCreate()
methods to ensure that all purchasesare successfully processed as described in processing purchases.
Handling purchases made outside your app
Some purchases, such as promotion redemptions, can happen outside of your app.When a user makes a purchase outside of your app, they expect your app to showan in-app message, or use some kind of notification mechanism to let the userknow that the app correctly received and processed the processed. Someacceptable mechanisms are:
- Show an in-app popup.
- Deliver the message to an in-app message box, and clearly stating that thereis a new message in the in-app message box.
- Use an OS notification message.
Keep in mind that it is possible for your app to be in any state when your apprecognizes the purchase. It is even possible for your app to not even beinstalled when the purchase was made. Users expect to receive their purchasewhen they resume the app, regardless of the state in which the app is.
You must detect purchases regardless of the state in which the app is when thepurchase was made. However, there are some exceptions where it may be acceptableto not immediately notify the user that the item was received. For example:
- During the action part of a game, where showing a message may distract theuser. In this case, you must notify the user after the action part is over.
- During cutscenes, where showing a message may distract the user. In this case,you must notify the user after the cutscene is over.
- During the initial tutorial and user setup parts of the game. We recommend younotify new users of the reward immediately after they open the game or duringinitial user set up. However, it is acceptable to wait until the main gamesequence is available to notify the user.
Always keep the user in mind when deciding when and how to notify your users ofpurchases made outside of your app. Any time a user doesn't immediately receivea notification, they may get confused, and may stop using your app, contact usersupport, or complain about it on social media.
Handling pending transactions
Watchtower Library Android App Pc
Note: Pending transactions are available only in Google Play Billing Libraryversions 2.0 and higher.Note: Additional forms of payment are not available for subscriptionspurchases.Google Play supports pending transactions, or transactions that requireone or more additional steps between when a user initiates a purchase andwhen the payment method for the purchase is processed. Your app should notgrant entitlement to these types of purchases until Google notifies youthat the user's payment method was successfully charged.
Watchtower Library Android App Offline
For example, a user can create a PENDING
purchase of an in-app item bychoosing cash as their form of payment. The user can then choose a physicalstore where they will complete the transaction and receive a code through bothnotification and email. When the user arrives at the physical store, theycan redeem the code with the cashier and pay with cash. Google then notifiesboth you and the user that cash has been received. Your app can then grantentitlement to the user.
To enable pending purchases, callenablePendingPurchases()
as part of initializing your app.
When your app receives a new purchase, either through yourPurchasesUpdatedListener
or as a result of callingqueryPurchases()
,use the getPurchaseState()
method to determine whether the purchase state is PURCHASED
or PENDING
.Note that you should grant entitlement only when the state is PURCHASED
. Ifyour app is running when the user completes the purchase, yourPurchasesUpdatedListener
is called again, and the PurchaseState
is now PURCHASED
. At this point,your app can process the purchase using the standard method forprocessing one-time purchases. Your app should also callqueryPurchases()
in your app's onResume()
and onCreate()
methods tohandle purchases that have transitioned to the PURCHASED
state while yourapp was not running.
Watchtower Library App Download
You should acknowledge a purchase only when the state isPURCHASED
.You cannot acknowledged while a purchase is PENDING
.Download Watchtower Library For Windows
Your app can also useReal-time developer notificationswith pending purchases by listening forOneTimeProductNotifications
. When the purchase transitions from PENDING
to PURCHASED
, your app receives aONE_TIME_PRODUCT_PURCHASED
notification. If the purchase is cancelled,your app receives a ONE_TIME_PRODUCT_CANCELED
notification. This canhappen if your customer does not complete payment in the required timeframe.When receiving these notifications, you can use the Google Play DeveloperAPI, which includes a PENDING
state forPurchases.products
.