2011-10-07 14 views
22

Eventuali duplicati:
Supporting Amazon and Android market links inside applicationCome sostenere Amazon e Android Market (Google Play) collegamenti nella stessa APK

Mi chiedevo se e come si potrebbe distinguere tra un Amazon App Store installata e installata dal Market.

Ad esempio, supponiamo di avere la mia app denominata "Esempio di app" e che desidero sviluppare per Amazon e il mercato. Nell'app ho link per valutare l'app di esempio. Ho anche un link per acquistare Example App Pro. Questo pone un problema perché Amazon non rilascerà la mia app se si collega a un altro App Store.

Ciò mi richiede di creare 2 file APK, il che è un problema. Ci vogliono solo circa 30 secondi in più per esportarli entrambi, ma crea ulteriore confusione e tempo di test.

Così qualcuno ha trovato un modo per creare un singolo APK che può essere caricato su Amazon e Android Market senza apportare modifiche tra i due in modo che in fase di esecuzione possa controllare se è Amazon o Market che lo ha installato e modificare i collegamenti di conseguenza?

+0

Questo è davvero interessante e utile. Tuttavia, penso che sia necessario separarlo in una risposta e una domanda (rispondi alla tua stessa domanda) per soddisfare le Domande frequenti sullo stack overflow. Per prima cosa, indica chiaramente la domanda, quindi rispondi tu stesso. – haimg

+0

@haimg aggiornato. :) – Jakar

+0

Sembra buono! (+1) – haimg

risposta

17

Modifica: Al momento di questo post, non ero a conoscenza, ma esiste getInstallerPackageName() ma non sono sicuro di quanto sia affidabile. Inoltre, non sono sicuro di cosa restituisca Amazon/Market, ecc. Potrebbe valerne la pena, ma se non funziona, il metodo seguente funziona per Google e Amazon.

Dovrete firmare l'applicazione normalmente, eseguire sul dispositivo di test, ottenere il valore di sig.hashCode() dai vostri registri, quindi sostituire -1545485543 con qualsiasi valore ottenuto per sig.hashCode(), quindi esportare e firmare di nuovo (CON LA STESSA CHIAVE COME PRIMA) e poi caricare su Amazon e Market entrambi - dallo stesso APK.

Do it:

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

In sostanza, il hashCode() che si ottiene dalla applicazione installata sul dispositivo di test sarà lo stesso dal mercato. Il codice hash dall'app store sarà diverso perché in base allo https://developer.amazon.com/help/faq.html, l'app store firma l'applicazione con una firma specifica per l'account sviluppatore, in modo che restituisca un valore diverso rispetto a ciò con cui l'hai effettivamente firmato.

E ho inserito i metodi isMarket e openStore in una classe diversa denominata OtherClass in modo che sia necessario codificarla solo una volta. Quindi da qualsiasi attività in cui ho bisogno di aprire il link corretto, chiamo semplicemente OtherClass.openStore (context);

Nota: Funziona per aprire il mercato con successo, ma non ho ancora implementato questo metodo su App Store, quindi non l'ho completamente testato. Sono sicuro che funzionerà, ma non posso fornire garanzie, quindi se usi ciò che ho suggerito e fallisce, per favore non ritenermi responsabile.

This è stato di grande aiuto nel fornire una risposta in modo da poter verificare quale firma era in uso.

+0

Roba fantastica Jakar, grazie.Domanda, quando prendi le tue firme lo memorizzi in un 'Firma [] '. Quindi si confronta l'ultima firma nell'array con qualsiasi hashcode determinato in precedenza. Ciò significa che si presume che il pacchetto sia stato firmato con un solo certificato. Questo non è un problema poiché di solito è così, l'ho trovato interessante visto che di recente ho imparato che puoi firmare APK con più di un certificato. La cosa strana è che Amazon accetterà anche gli APK firmati, quindi quando andranno a firmare con loro ci saranno due certificati. Questo potrebbe portare a falsi positivi nell'assegno? –

+0

Non lo so davvero. Penso che Amazon in pratica lo disimballi, rimuovendo la tua firma, e poi firmano di nuovo. Se contiene più di una firma dopo che Amazon lo ha firmato, immagino che potrebbe renderlo un po 'più difficile, ma potresti sempre confrontare ogni voce dell'array e se uno di questi! = YourSig, allora usa il link Amazon. – Jakar

+0

@Jakar Lo hai provato su un'app pubblicata sia sui mercati di Google che di Amazon? – CrackerJack9

Problemi correlati