如何区分 Android 应用程序是不是在 Amazon Kindle Fire 上运行?

Posted

技术标签:

【中文标题】如何区分 Android 应用程序是不是在 Amazon Kindle Fire 上运行?【英文标题】:How to distinguish if the Android app runs on Amazon Kindle Fire?如何区分 Android 应用程序是否在 Amazon Kindle Fire 上运行? 【发布时间】:2012-07-11 14:18:38 【问题描述】:

我最近被亚马逊移动应用分发门户拒绝了我的应用,理由是菜单->“评价应用”选项重定向到 Google Play 商店。

为了被接受,它应该重定向到亚马逊应用商店,下载 URL 必须是 http://www.amazon.com/gp/mas/dl/android?p=packagename,这当然是有意义的。

所以我需要类似的东西:

String url = isKindle 
    ? "http://www.amazon.com/gp/mas/dl/android?p=packagename" 
    : "https://play.google.com/store/apps/details?id=packagename";

问题是:如何区分应用是在 Kindle Fire 上运行还是在“原生”Android 系统上运行?

【问题讨论】:

我不知道这个问题的答案,但人们通常不只是导出一个单独的 APK 以提交到亚马逊应用商店吗? 【参考方案1】:

你可以阅读这些:

android.os.Build.MANUFACTURER 
android.os.Build.MODEL

在 Kindle Fire 上,这些返回值“Amazon”和“Kindle Fire”。

http://developer.android.com/reference/android/os/Build.html

这应该足以让您的应用确定它在 Kindle Fire 上运行。


更新:

上述方法适用于第一代 Kindle Fire。

较新型号的 Kindle Fire 具有不同的 android.os.Build.MODEL 值。

https://developer.amazon.com/sdk/fire/specifications.html

【讨论】:

太好了,可以。你知道我在哪里可以看到这些属性的可能值吗? @Ilya:不。我没有这些信息,也不知道它是否在某个地方收集在一起。对不起。 (您当然不是唯一对此感兴趣的应用开发者。) 只是好奇,你为什么确定“在 Kindle Fire 上这些是 'Amazon' 和 'Kindle Fire'”?再次感谢 看到这个问题:***.com/questions/8309624/…【参考方案2】:

好消息! Apparently亚马逊商店最新版本终于将PackageManager.getInstallerPackageName()设置为"com.amazon.venezia",与Google Play的"com.android.vending"形成对比。

较旧的应用程序仍会返回null,而且我还没有真正验证 API,或者安装新商店然后升级旧应用程序是否会设置安装程序。但是安装新应用并检查/data/system/packages.xml 表明installer 设置正确。

【讨论】:

【参考方案3】:

确保更新 Build.MODEL 检查以处理新的 Kindle Fire 设备。

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

这些都列在图表底部https://developer.amazon.com/sdk/fire/specifications.html

【讨论】:

在 2013 年末给出这个背景:这些是 第 2 代 代模型 ID,但该链接涵盖了迄今为止的所有内容。【参考方案4】:

检测 Kindle Fire 是解决方案的一部分,但不是全部解决方案。 this thread 中的(当前)最后一篇帖子似乎触及了“这是从亚马逊商店安装的”的核心——这很可能是 Kindle Fire,也可能不是!

确定应用程序是否在生产模式下通过 Appstore 安装的正确方法是使用 onSdkAvailable(boolean isSandboxMode) 方法。

onSdkAvailable(boolean isSandboxMode) method 上的文档。摘要:

一旦您将PurchasingObserver 注册到PurchasingManager,就会调用此回调 此方法告诉您采购框架是在沙盒模式下运行测试数据,还是在生产模式下运行真实数据 如果您的应用是通过亚马逊客户端下载的,isSandboxMode 将返回 false 应该在onStart()生命周期方法中调用启动方法

在注册您的PurchaseObserver 时,您会收到一个异步回调onSdkAvailable(Boolean isSanboxMode)。如果应用程序是通过 Amazon 客户端下载的,那么 isSandboxMode 将始终返回 false。此代码将在生产模式下成功运行,但在开发/测试环境中,isSandboxMode 将始终返回 true,因为在测试环境中未通过 Amazon 客户端下载应用程序。

【讨论】:

我认为这只有在您进行应用内购买时才有效?任何想法如何在没有 IAP 的情况下做到这一点? 不,抱歉。虽然我看到一个引用“com.amazon.venezia”的答案,但这将是一个部分解决方案。整个过程很乏味且容易出错:(【参考方案5】:

我只会创建 2 个应用程序。一款适用于安卓。 Kindle 一个。

【讨论】:

没有必要,因为斯宾塞的解决方案真的很容易应用。 问题是亚马逊是否会接受它作为解决方案。我猜如果它包含对 Play 商店的引用,他们仍然会拒绝它。例如,如果有人通过 Galaxy Nexus 上的 Amazon Appstore 下载他的应用程序,它将重定向到通过 Play 进行评分。他应该保留 2 个版本。 是的,也不是。您必须记住的是,仅仅因为它是一个 Android,并不意味着它会完全一样地移植。您现在或将来可能会发现应用程序运行和/或显示的方式存在细微差别。虽然他的回答很简单,可能对您有好处,但请记住,您可能必须进行仅影响 Android/Kindle 的更改。祝你好运! @Blaine,你提出了一些重要的考虑。我只回答了被问到的问题,“我的应用程序如何确定它是否在 Kindle Fire 上运行”。 @spencer7593,你是对的。你确实回答了这个问题,而且你做得很好。我想这就是你得到这么多票的原因!老实说,我自己投了赞成票。我只是想为您提供的精彩答案添加更多内容。深思熟虑,如果你愿意的话。【参考方案6】:

您可以包含指向一般网页的链接,然后该网页可以将流量重定向到 Amazon AppStore 或 Google Play。

例如,您可以包含链接 www.yourwebsite.com/getapp,然后将流量重定向到 Google Play 或 Amazon。

即使背后有逻辑,亚马逊也不太可能接受 Google Play 链接。

【讨论】:

这可能有效,但用户会首先看到浏览器,对吧?此外,您必须实施相同的逻辑来决定它是什么操作系统。我想还是用 Android 代码做比较好。【参考方案7】:

实际上,您可以完全跳过检查,只需链接到 market://details?id=packagename

【讨论】:

以上是关于如何区分 Android 应用程序是不是在 Amazon Kindle Fire 上运行?的主要内容,如果未能解决你的问题,请参考以下文章

焦点对话AMA:Cirus如何重新定义所有权经济 用数据释放时代价值

焦点对话AMA:Cirus如何重新定义所有权经济 用数据释放时代价值

CSS,如何区分ios和android?

AMA预告波卡生态 DeFi 拉开序幕,Zenlink 如何备战上线?

如何以编程方式区分 android Activity 和 Sub Activity?

确定是不是是第一次使用 Android 应用程序