可能重复:
Supporting Amazon and Android market links inside application
我想知道您是否以及如何区分Amazon App Store安装的应用程序和从Market安装的应用程序。
例如,假设我的应用程序名为“示例应用程序”,我想为亚马逊和市场开发。在应用程序中,我有链接评价示例应用程序。我也有一个购买Example App Pro的链接。这会产生问题,因为如果链接到不同的App商店,亚马逊将不会发布我的应用程序。
这需要我制作2个APK文件,这很痛苦。导出两者只需要大约30秒,但它会产生额外的混乱和测试时间。
所以有人找到了一种方法来制作一个可以上传到亚马逊和Android市场的APK,而无需在两者之间进行任何更改,以便在运行时我可以检查它是亚马逊还是安装它的市场和相应地更改链接?
答案 0 :(得分:17)
编辑:在发布这篇文章时,我并未意识到这一点,但确实存在getInstallerPackageName(),但我不确定它有多可靠。我也不确定它为Amazon / Market等带来了什么回报。它可能值得一看,但如果它不起作用,那么下面的方法适用于谷歌与亚马逊。
您必须正常签署应用程序,在您的测试设备上运行,从您的日志中获取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);
}
}
基本上,您从测试设备上安装的应用程序获得的hashCode()将与市场上的相同。来自应用程序商店的哈希代码将有所不同,因为根据https://developer.amazon.com/help/faq.html,应用程序商店会使用特定于您的开发者帐户的签名对应用程序进行签名,以便返回与您实际签名的内容不同的值。 / p>
我将isMarket和openStore方法放在一个名为OtherClass的不同类中,这样我只需要编写一次代码。然后,在我需要打开正确链接的任何活动中,我只需调用OtherClass.openStore(context);
注意:它可以成功打开市场,但我尚未在App Store上部署此方法,所以我还没有完全测试它。我相信它会起作用,但不能保证,所以如果你使用我建议但失败了,请不要让我负责。
This在提出答案方面提供了很大帮助,因此我可以测试使用的是哪个签名。