android - 如何在同一个 APK 中支持 Amazon 和 Android Market (Google Play) 链接

标签 android hyperlink google-play amazon

Possible Duplicate:
Supporting Amazon and Android market links inside application

我想知道您是否以及如何区分亚马逊应用商店安装的应用和从市场安装的应用。

例如,假设我有一个名为“Example App”的应用程序,我想为亚马逊和市场开发。在应用程序中,我有对示例应用程序进行评分的链接。我还有一个购买 Example App Pro 的链接。这带来了一个问题,因为如果我的应用链接到不同的应用商店,亚马逊将不会发布它。

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

那么有没有人找到一种方法来制作一个可以同时上传到亚马逊和 Android 市场的 APK,而无需在两者之间进行任何更改,以便在运行时我可以检查安装它的是亚马逊还是市场相应地更改链接?

最佳答案

编辑:在发这篇文章时,我并不知道,但确实存在 getInstallerPackageName()但我不确定这有多可靠。我也不确定它为亚马逊/市场等返回什么。它可能值得一看,但如果它不起作用,那么下面的方法适用于谷歌和亚马逊。

您必须照常签署应用程序,在您的测试设备上运行,从您的日志中获取 sig.hashCode() 的值,然后将 -1545485543 替换为您为 sig.hashCode() 获得的任何值,然后导出并再次签名(使用与之前相同的 key ),然后从同一个 APK 上传到 Amazon 和 Market。

这样做:

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);
    }
}

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

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

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

This对提出答案有很大帮助,因此我可以测试正在使用的签名。

关于android - 如何在同一个 APK 中支持 Amazon 和 Android Market (Google Play) 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7683130/

相关文章:

Android - 连接调试工具时故意使应用程序崩溃

java - 如何从 Android 中的信号处理函数通过 JNI 调用 Java 函数

jquery - 使用 GET 从 jqGrid 中的列值链接到新页面

android - Google Play 商店说我的应用程序使用 AdMob

android - 如何从 Google Playstore 获取最新版本的 Android 应用程序?

android - Google Play 发布前报告在播放计费库上获取安全和信任异常权限使用问题

android - Viewflipper - 垂直 slider

css - 如何使链接区域大于图像

url - 需要在 ie8 的新选项卡中打开链接!

android - Android中DialogFragment和FragmentActivity之间的通信