支持应用程序内的亚马逊和Android市场(Google Play)链接

时间:2011-03-29 23:38:44

标签: android amazon-appstore

因此我的一个应用程序今天被拒绝从亚马逊应用程序商店。原因是因为在我的应用程序中,我链接到Android市场上的应用程序的付费版本。令人失望,但无论如何,我想每个人都想要他们的削减......

所以现在我不得不修改应用程序以将Android市场链接更改为亚马逊应用商店链接。这并不是什么大不了的事情,除非现在如果我这样做,当我想将更新的版本上传回Android市场时,我仍然存在差异。毕竟,如果他们从Android市场购买应用程序,将某人链接到亚马逊应用程序商店会相当愚蠢。

现在我们都知道支持/管理同一个应用程序的多个版本很痛苦。因此,我的问题变成了如何同时链接到两者?有没有办法告诉应用程序从哪里下载,所以我可以将两个链接编码到应用程序中,从而将用户自动指向其中一个?其次,是否反对亚马逊TOS给用户一个选择(比如我弹出一个对话框并询问用户从哪里下载)?

谢谢大家。

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

  

暂时,我们需要任何   链接指向亚马逊   Appstore仅用于市场链接。   允许链接到您的网站,   只是没有其他市场。

     

指向其他应用时   在您的应用内,包括向上销售,   完成购买必须来自   亚马逊Appstore。

7 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:8)

以下是您可以做的事情:

  1. 完成申请的准备和签署。
  2. 将其安装在您的测试设备上
  3. 使用PackageManager.getPackageInfo
  4. 如何做到这一点:

    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,应用程序商店会使用特定于您的开发者帐户的签名对应用程序进行签名,以便返回与您实际签名的内容不同的值。 / p>

    注意:它可以成功打开市场,但我尚未在App Store上部署此方法,所以我还没有完全测试它。我相信它会起作用,但不能保证,所以如果你使用我建议但失败了,请不要让我负责。

答案 2 :(得分:6)

您可以执行以下操作:

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

  2. 要撰写评论并打开Amazon App Store,请使用以下意图

    amzn://apps/android?p=package_name
    

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

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

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

答案 3 :(得分:5)

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

最好的方法是检查是否已安装Android市场并采取相应措施:here

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

答案 4 :(得分:4)

这很难做到这一点。如果你只想打开市场网址,只需检查Android市场网址的意图是否有任何知道如何处理它的活动。如果没有,请打开另一个意图的amazon 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;
    }

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

答案 5 :(得分:0)

我也在努力解决这个问题,但我决定用我在亚马逊上的免费应用程序看到的即时成功保证在制作新版本时创建第二组.apks的时间。我现在使用亚马逊布尔标志,并创建一个通用版本,然后为亚马逊市场增加一个版本。没有其他市场需要内部联系,AFAIK。

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

我正在等待我的付费应用程序获得批准,但我非常确定,鉴于我为免费应用程序提供了多少下载量,因此可以在亚马逊市场上获得它。

答案 6 :(得分:0)

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

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

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

Multiple Apps with a shared code base