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.
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
@haimg aggiornato. :) – Jakar
Sembra buono! (+1) – haimg