How to distinguish if the Android app runs on Amazon Kindle Fire?

I have recently got my app rejected from Amazon Mobile App Distribution Portal with the argument that the Menu->"Rate the App" option redirects to Google Play Store.

In order to be accepted it should redirect to the Amazon Appstore, the Download URL must be which of course makes sense.

So I need something like:

String url = isKindle 
    ? "" 
    : "";

The question is: how can I distinguish if the app runs on Kindle Fire or on a "native" Android system?


You can read these:


On a Kindle Fire these return the values 'Amazon' and 'Kindle Fire'.

That should be sufficient for your app to make a determination that it's running on a Kindle Fire.


The preceding works for the gen 1 Kindle Fire.

Newer models of the Kindle Fire have different values for android.os.Build.MODEL.

Good news! Apparently the latest version of the Amazon store finally sets PackageManager.getInstallerPackageName() to "" to contrast with Google Play's "".

Older apps will still return null, and I haven't actually verified the API or whether installing the new Store and then upgrading an older app will set the installer. But installing a new app and checking /data/system/packages.xml indicates installer is correctly set.

Be sure to update the Build.MODEL check to handle the new Kindle Fire devices.

  • KFOT = Kindle Fire
  • KFTT = Kindle Fire HD 7"
  • KFJWI = Kindle Fire HD 8.9" Wi-Fi
  • KFJWA = Kindle Fire HD 8.9" WAN

These are listed on the bottom of the chart at

Detecting a Kindle Fire is part of the solution, but not the whole solution. The (current) last post in this thread seems to get to the core of "was this installed from the Amazon store" -- which may well be a Kindle Fire, or not!

<snip, slightly edited>

The correct way to determine if an app is installed via Appstore in production mode is by using the onSdkAvailable(boolean isSandboxMode) method.

Documentation on onSdkAvailable(boolean isSandboxMode) method. Abstract:

  • This callback is invoked once you register your PurchasingObserver with the PurchasingManager
  • This method tells you if the Purchasing Framework is running in sandbox mode with test data, or in production mode with real data
  • If your app is downloaded via the Amazon Client, isSandboxMode will return false
  • The initiating method should be called within the onStart() lifecycle method

On registering your PurchaseObserver, you get a async call back, onSdkAvailable(Boolean isSanboxMode). If the app is downloaded via the Amazon Client then isSandboxMode will always return false. This code will work successfully in production mode, however in development/test environment, the isSandboxMode will always return true as the app is not downlaoded via the Amazon Client in test environment.

I would just create 2 apps. One for Android. One for Kindle.

You could include a link to a general webpage, and then the webpage could redirect the traffic to the Amazon AppStore or to Google Play.

For instance, you could include the link, which then would redirect traffic to Google Play or Amazon.

Amazon is unlikely to accept a Google Play link, even with a logic behind.

Actually you can skip the check altogether and just link to market://details?id=packagename

Need Your Help

C++ - Detect whether a file is PNG or JPEG

c++ image png jpeg

Is there any fast way to determine if some arbitrary image file is a png file or a jpeg file or none of them?

How can I find out which files have been modified in a branch?

git branch msysgit

I have two branches: master and bug1. I checked out bug1, did bunch of changes and multiple commits. How do I get a list of all files that were changed on the branch? I'm not interested in hashes, ...