26

So one of my applications was rejected from the Amazon app store today. The reason was because inside my app, I linked to the paid version of the app on the Android market. Disappointing, but whatever, I guess everyone wants their cut...

So now I'm left having to modify the application to change the Android market link to an Amazon app store link. Not really a big deal except for now if I do that I'm left with a discrepancy when I want to upload a newer version back to the Android market. After all, it would be rather dumb to link someone to the Amazon app store if they purchase the app from the Android market.

Now we all know that it is a pain supporting/managing multiple versions of the same app. Consequently my question becomes how can I link to both at the same time? Is there a way to tell where an app was downloaded from so I can code both links into the app and thus point the user automatically to one or the other? Secondly, is it against the Amazon TOS to give the user a choice (say I pop up a dialog instead and ask the user where to download from)?

Thanks all.

Edit: Direct from Amazon customer service "Re: Link to both markets" (I wish the approval process was as fast as these guys):

For the time being, we need any linking to point back to the Amazon Appstore only for market links. Linking to your website is allowed, just not other markets.

When pointing to other apps from within your app, including up-sells, completion of purchase must be from the Amazon Appstore.

4

7 回答 7

12

好消息!显然,亚马逊商店的最新版本终于PackageManager.getInstallerPackageName()"com.amazon.venezia"Google Play 的"com.android.vending". 这将是确定您的应用程序是侧载、从 Amazon 安装还是从 Google 安装的最简单方法。

于 2013-05-31T17:49:44.147 回答
8

以下是您可以执行的操作:

  1. 完成申请的准备和签署。
  2. 将其安装在您的测试设备上
  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);
    }
}

基本上,您从安装在测试设备上的应用程序获得的 hashCode() 将与市场上的相同。来自应用商店的哈希码会有所不同,因为根据https://developer.amazon.com/help/faq.html,应用商店使用特定于您的开发者帐户的签名对应用程序进行签名,因此将返回不同的重视您实际签署的内容。

注:成功打开市场有效,但我还没有在App Store上部署这个方法,所以我没有完全测试过。我相信它会起作用,但不能保证,所以如果你使用我的建议但它失败了,请不要追究我的责任。

于 2011-10-07T03:41:48.277 回答
6

您可以执行以下操作:

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

  2. 要撰写评论和打开亚马逊应用商店,请使用以下意图

    amzn://apps/android?p=package_name
    

    p=Link特定包名称的详细信息页面的 位置。

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

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

于 2013-01-08T08:06:38.710 回答
5

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

最好的方法是检查是否安装了 android market 并采取相应措施:这里

另一种更复杂的方法是使用PackageManager.getInstallerPackageName查询应用安装程序的名称。这需要额外的工作,因为即使您在安装了 android market 的 android 设备上也可以通过并行市场安装该应用程序,并且您还必须检查它是否作为调试/开发安装(在这种情况下,安装程序包名称为空)。

于 2011-10-06T10:36:10.293 回答
4

要做到这一点真是太难了。如果您只想打开市场 url,只需检查带有 android 市场 url 的意图是否有任何知道如何处理它的活动。如果没有,请以另一种意图打开亚马逊应用商店。

 /**
     * 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;
    }

另一种方法是使用 ant 构建。通过这种方式,您可以动态生成一个 Java 类,其中常量设置为代表应用市场的值,并轻松输出不同的构建。然而,这需要一些学习,但是当你运行它时,它很容易。

于 2012-12-16T16:43:53.357 回答
0

只需将您的大部分项目重构为一个项目库,然后创建多个项目(例如,为每个应用商店),这些项目只有唯一的图标和字符串资源、它们自己的包 ID 在清单中声明,然后是一个扩展您在库中定义的主要活动。

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

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

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

于 2014-08-10T04:41:53.203 回答
0

我也在为此苦苦挣扎,但我认为我在亚马逊上的免费应用程序所取得的立竿见影的成功保证了我在进行新构建时有时间创建第二组 .apks。我现在使用亚马逊布尔标志,并创建一个通用版本,然后为亚马逊市场增加一个版本。没有其他市场需要内部链接,AFAIK。

我最终打算用一种巧妙的方式编写一个市场选择器来自动找出要做什么,但是有很多变量——不仅仅是一个应用程序的市场地址,还有不同的市场如何识别公司名称来查找所有应用程序. 一些市场应用劫持了主要的 Android 市场协议(如果我没记错的话,例如 Appslib 和 SlideMe),但不会以相同的方式存储公司名称。然后你需要决定加售链接的去向——相同的市场或共同的市场(我只向我使用的大多数市场提交了我的免费应用程序)。

我正在等待我的付费应用程序获得批准,但鉴于我的免费应用程序获得了多少下载量,我很确定在亚马逊市场上提供它是值得的。

于 2011-03-31T06:43:57.920 回答