2011-10-07 2 views
22

Можно создать дубликат:
Supporting Amazon and Android market links inside applicationКак поддержать Amazon и Android Market (Google Play) ссылки в одном APK

мне было интересно, если и как вы могли бы дифференцировать между Amazon App Store установленное приложение и одно из установленных на рынке.

Например, скажем, у меня есть приложение под названием «Пример приложения», и я хочу разработать для Amazon и Market. В приложении у меня есть ссылки на приложение примера ставок. У меня также есть ссылка для покупки примера App Pro. Это создает проблему, потому что Amazon не выпустит мое приложение, если оно связано с другим магазином приложений.

Это требует от меня сделать 2 файла APK, что является болью. Для экспорта обоих требуется всего около 30 секунд, но это создает дополнительные беспорядки и время тестирования.

Итак, кто-нибудь нашел способ сделать один APK, который можно загрузить в Amazon и Android Market, без каких-либо изменений между ними, чтобы во время выполнения я мог проверить, установлена ​​ли это Amazon или Market и соответственно изменить ссылки?

+0

Это действительно интересно и полезно. Тем не менее, я думаю, вам нужно разделить его на ответ и вопрос (ответьте на свой вопрос), чтобы встретить FAQ по переполнению стека. Во-первых, четко сформулируйте вопрос, затем ответьте сами. – haimg

+0

@haimg Обновлено. :) – Jakar

+0

Выглядит хорошо! (+1) – haimg

ответ

17

Редактировать: На момент публикации я не знал об этом, но существует getInstallerPackageName(), но я не уверен, насколько он надежный. Я также не уверен, что он возвращает для Amazon/Market и т. Д. Возможно, стоит посмотреть, но если это не сработает, то метод ниже работает для Google против Amazon.

Вам необходимо подписать приложение как обычно, запустить на тестовом устройстве, получить значение sig.hashCode() из ваших журналов, а затем заменить -1545485543 на любое значение, которое вы получили для sig.hashCode(), затем экспортировать и снова подпишите (С ТОЧНЫМ КЛЮЧОМ КАК ПЕРЕД), а затем загрузите на Amazon и Market оба - из того же 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); 
    } 
} 

В принципе, хэш-код(), что вы получите из приложения, установленного на устройстве тестирования будет таким же, один из рынка. Хэш-код из магазина приложений будет отличаться, поскольку в соответствии с https://developer.amazon.com/help/faq.html магазин приложений подписывает приложение с подписью, специфичной для вашей учетной записи разработчика, так что будет возвращено другое значение, с которым вы фактически подписали его.

И я поместил методы isMarket и openStore в другой класс под названием OtherClass, так что мне нужно только его закодировать. Затем из любой активности, где мне нужно открыть правильную ссылку, я просто вызываю OtherClass.openStore (контекст);

Примечание: Он работает, чтобы успешно открыть рынок, но я еще не развернул этот метод в App Store, поэтому я не полностью его протестировал. Я уверен, что это сработает, но не может гарантировать никаких гарантий, поэтому, если вы используете то, что я предложил, и это не удается, пожалуйста, не держите меня подотчетным.

This был большой помощью при подготовке ответа, чтобы я мог проверить, какая подпись использовалась.

+0

Удивительный материал Джакар, спасибо.Вопрос, когда вы захватываете свои подписи, вы храните их в 'Подпись []'. Затем вы сравниваете последнюю сигнатуру в массиве с любым ранее заданным хэш-кодом. Это означает, что вы предполагаете, что пакет был подписан только с одним сертификатом. Это не проблема, так как это обычно происходит, просто стало интересно, так как я недавно узнал, что вы можете подписывать APK с несколькими сертификатами. Странно, что Amazon также примет подписанные APK, поэтому, когда они отправятся подписываться вместе, будут два сертификата. Может ли это привести к ложным срабатываниям вашего чека? –

+0

Я действительно не знаю. Я думаю, что Amazon на самом деле в основном распаковывает его, что удаляет вашу собственную подпись, а затем они подписывают ее снова. Если он содержит несколько подписи после того, как Amazon подписывает его, я думаю, это может сделать его немного сложнее, но вы всегда можете сравнить каждую запись в массиве, и если один из них! = ВашSig, то используйте ссылку Amazon. – Jakar

+0

@Jakar Вы протестировали это на приложении, опубликованном на рынках Google и Amazon? – CrackerJack9

 Смежные вопросы

  • Нет связанных вопросов^_^