如何在同一APK中支持亚马逊和Android Market(Google Play)链接

Ree*_*eed 22 android amazon hyperlink google-play

可能重复:
支持应用程序内的亚马逊和Android市场链接

我想知道您是否以及如何区分Amazon App Store安装的应用程序和从Market安装的应用程序.

例如,假设我的应用程序名为"示例应用程序",我想为亚马逊和市场开发.在应用程序中,我有链接评估示例应用程序.我也有一个购买Example App Pro的链接.这会产生问题,因为如果链接到不同的App商店,亚马逊将不会发布我的应用程序.

这需要我制作2个APK文件,这很痛苦.导出两者只需要大约30秒,但它会产生额外的混乱和测试时间.

所以有人找到了一种方法来制作一个可以上传到亚马逊和Android市场的APK,而无需在两者之间进行任何更改,以便在运行时我可以检查它是亚马逊或安装它的市场并更改链接因此?

Ree*_*eed 17

编辑:在这篇文章的时候,我没有意识到它,但确实存在getInstallerPackageName(),但我不确定它是多么可靠.我也不确定它为Amazon/Market等带来了什么回报.它可能值得一看,但如果它不起作用,那么下面的方法适用于Google vs Amazon.

您必须正常签署应用程序,在测试设备上运行,从日志中获取sig.hashCode()的值,然后将-1545485543替换为sig.hashCode()获得的任何值,然后再导出并签名(使用相同的密钥,然后上传到亚马逊和市场 - 从相同的APK.

这样做:

public static boolean isMarket(Context context){
    boolean isMarketSig = false;
    int currentSig = 1; // I just set this to 1 to avoid any exceptions later on.
    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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我将isMarket和openStore方法放在一个名为OtherClass的不同类中,这样我只需要编写一次代码.然后,在我需要打开正确链接的任何活动中,我只需调用OtherClass.openStore(context);

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

对于提出答案是一个很大的帮助,所以我可以测试使用哪个签名.