在应用程序内支持Amazon和Android市场(Google Play)链接

所以我的一个应用程序今天被亚马逊app store拒绝了。 原因是因为在我的应用程序中,我链接到Android市场上的付费版本的应用程序。 令人失望,但无论如何,我想每个人都希望他们的切…

所以现在我不得不修改应用程序,将Android市场链接更改为亚马逊app store链接。 没有什么大不了的,除非现在如果我这样做,我想上传一个新的版本回到Android市场时,我留下了一个差异。 毕竟,如果从Android市场购买应用程序,将某人连接到亚马逊应用程序商店是相当愚蠢的。

现在我们都知道这是支持/pipe理同一个应用程序的多个版本的痛苦。 因此,我的问题变成了怎样才能同时链接到两者呢? 有没有办法告诉下载应用程序的位置,这样我可以将两个链接编码到应用程序中,从而将用户自动指向一个或另一个? 其次,它是反对亚马逊的TOS给用户一个select(比如我popup一个对话框,并要求用户从哪里下载)?

谢谢大家。

编辑:直接从亚马逊客户服务“回复:链接到两个市场”(我希望审批过程像这些家伙一样快):

目前,我们需要任何链接才能指向Amazon Appstore,仅用于市场链接。 链接到您的网站是允许的,而不是其他市场。

当从您的应用中指向其他应用(包括向上销售)时,必须从Amazon Appstore购买完成购买。

Solutions Collecting From Web of "在应用程序内支持Amazon和Android市场(Google Play)链接"

好消息! 显然 ,亚马逊商店的最新版本最终将PackageManager.getInstallerPackageName()"com.amazon.venezia" ,与Google Play的"com.android.vending"形成鲜明对比。 这将是确定您的应用程序是否已加载,从Amazon安装或从Google安装的最简单方法。

以下是你可以做的事情:

  1. 完成您的申请的准备和签署。
  2. 将其安装在您的testing设备上
  3. 使用PackageManager.getPackageInfo

这个怎么做:

 public static boolean isMarket(Context context){ boolean isMarketSig = false; int currentSig = 1; try { Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures; for (Signature sig : sigs) { currentSig = sig.hashCode(); Log.i("MyApp", "Signature hashcode : " + sig.hashCode()); // This Log is for first time testing so you can find out what the int value of your signature is. } } catch (Exception e){ e.printStackTrace(); } //-1545485543 was the int I got from the log line above, so I compare the current signature hashCode value with that value to determine if it's market or not. if (currentSig==-1545485543){ isMarketSig = true; } else { isMarketSig = false; } return isMarketSig; } public static void openStore(Context context){ if (isMarket(context)){ Intent goToMarket = new Intent(Intent.ACTION_VIEW,Uri.parse("market://d" + "etails?id=com.jakar.myapp")); goToMarket.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(goToMarket); } else { Intent goToAppstore = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.amazon.com/gp/mas/dl/andro" + "id?p=com.jakar.myapp")); goToAppstore.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(goToAppstore); } } 

基本上,从testing设备上安装的应用程序获得的hashCode()将与市场上的应用程序相同。 app store的哈希代码将会有所不同,因为根据https://developer.amazon.com/help/faq.html ,app store使用特定于您的开发者帐户的签名来签署应用程序,以便返回不同的价值,你实际上签了字。

注意:它成功地打开了市场,但我还没有在App Store上部署这个方法,所以我还没有完全testing它。 我相信它会起作用,但是不能保证,所以如果你使用我的build议而失败了,请不要让我负责。

你可以做以下事情:

  1. 检查基于其制造商的设备。 例如: https : //developer.amazon.com/sdk/fire/specifications.html

  2. 对于撰写评论和打开亚马逊App Store使用以下意图

     amzn://apps/android?p=package_name 

    其中p=Link到特定包名称的详细信息页面。

参考:亚马逊开发者链接。

https://developer.amazon.com/sdk/in-app-purchasing/sample-code/deeplink.html

正如你所说,你可以使用布尔值,然后被迫两次构build你的应用程序,所以我认为这不是最好的方法。

最好的方法是检查安卓市场是否安装,并采取相应的行动: 这里 。

另一个更复杂的方法是使用PackageManager.getInstallerPackageName来查询您的应用程序的安装程序的名称。 这需要额外的工作,因为应用程序可以通过并行市场来安装,即使您使用的是安装了android market的Android设备,也必须检查它是否安装为debug / development(安装程序包名称在此情况下为null)。

这是一个很难的方法。 如果你只是想打开市场的url,只是检查意图与Android市场的url有任何活动,知道如何处理它。 如果没有,打开另一个意图的亚马逊appstore。

  /** * Returns intent that opens app in Google Play or Amazon Appstore * @param context * @param packageName * @return null if no market available, otherwise intent */ public static Intent showApp(Activity activity, String packageName) { Intent i = new Intent(Intent.ACTION_VIEW); String url = "market://details?id=" + packageName; i.setData(Uri.parse(url)); if (isIntentAvailable(activity, i)) { return i; } i.setData(Uri.parse("http://www.amazon.com/gp/mas/dl/android?p=" + packageName)); if (isIntentAvailable(activity, i)) { return i; } return null; } public static boolean isIntentAvailable(Context context, Intent intent) { final PackageManager packageManager = context.getPackageManager(); List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; } 

另一种方法是使用antbuild立。 通过这种方式,您可以dynamic生成一个java类,其常量设置为表示应用程序市场的值,并轻松输出不同的构build版本。 然而,这需要一些学习,但是当你运行它时,这很容易。

我也在为此苦苦挣扎,但是决定用我在Amazon上的免费应用程序看到的即时成功,让我有时间在创build新版本时创build第二组.apks。 我现在用亚马逊的布尔标志去创build一个通用的版本,然后在亚马逊市场上增加一个版本。 没有其他市场需要内部链接,AFAIK。

我最终打算使用一种stream畅的方式来编码市场select器,以自动找出要做什么,但是有很多variables – 不仅仅是一个应用程序的市场地址,而且不同的市场如何识别公司名称以find所有的应用程序。 一些市场应用程序劫持主要的Android市场协议(例如,如果我没有记错的话,Appslib和SlideMe),但不要以同样的方式存储公司名称。 然后,您需要确定加售链接去往同一个市场或共同的市场(我只向我使用的大部分市场提交了我的免费应用程序)。

我正在等待我的付费应用程序被批准,但我相当确定它将是值得的,因为有多less下载我已经得到了我的免费应用程序在亚马逊市场上。

只需将大部分项目重构为一个Project Library,然后创build多个项目(例如,针对每个app store),这些项目只有唯一的图标和string资源,它们在清单中声明的​​包ID,然后是一个主要活动,您在库中定义的主要活动。

这样,通过在每个特定的应用程序项目的活动中覆盖在您图书馆的主要活动中定义的虚拟或抽象方法,可以提供所有唯一的URL。 显示这些URL的库代码可以通过对每个方法的多态调用来获得它们。

这样,每个这样的专业项目将会非常小,维护将主要针对您的图书馆,如下所述:

具有共享代码库的多个应用程序