2013-10-25 28 views
5

Istnieje wiele podobnych pytań Stackoverflow.Czy można w niezawodny sposób wykryć, w którym sklepie zainstalowano aplikację dla systemu Android (Google Play lub Amazon Market)?

Wszystkie mają odpowiedzi sugerujące użycie metod takich jak getInstallerPackageName na klasie PackageManager.

Wszystkie mają również komentarze lub sprzeczne odpowiedzi, mówiąc, że nie jest to niezawodne podejście, sugerując, że jedynym sposobem, aby niezawodnie sprawdzić, który sklep zainstalował daną aplikację, jest wygenerowanie dwóch oddzielnych plików binarnych, każdy z zestawem storeFlag i przesłaniem jednego binarny do Amazon i jeden do Google Play.

Muszę wiedzieć, który sklep to instalator aplikacji, dzięki czemu wiem, do którego sklepu należy się komunikować w celu uzyskania funkcji zakupu w aplikacji.

Czy ostateczny 100% niezawodny podejście do generowania dwóch oddzielnych plików binarnych? Lub czy istnieje 100% niezawodne podejście do kodu oparte na kodzie?

+0

Czy masz problem z użyciem dwóch oddzielnych plików binarnych? To dosłownie kwestia zmiany POJEDYNCZEJ linii kodu. – Cruncher

+0

należy rozważyć, w jaki sposób można wykryć źródło magazynu na urządzeniu z obu? pamiętaj, że możesz zainstalować sklep Amazon na dowolnym urządzeniu, a zatem nie będziesz wiedział, skąd pochodzi. – Eluvatar

+0

@Cruncher, mogę przejść dwa oddzielne pliki binarne, ale jest to unikalna konfiguracja, w której preferowany jest pojedynczy plik binarny. –

Odpowiedz

5

dwa pliki binarne byłyby najbardziej niezawodną metodą, ale sprawdzenie zarówno pliku Build.MANUFACTURER, jak i parametru installerName powinno dać Ci bardzo bliskie (chociaż zakładając, że chcesz sprawdzić Amazon AppStore, jeśli użytkownik zainstalował starszą wersję instalatora na ich non-Kindle urządzenie i nie uaktualnił installername może zgłosić NULL)

boolean isAmazonDevice = Build.MANUFACTURER.equalsIgnoreCase("amazon"); 

final Application application = getApplication(); 
String installerName = application.getPackageManager().getInstallerPackageName(application.getPackageName()); 
boolean fromAmazonStore = installerName != null && installerName.equalsIgnoreCase("com.amazon.venezia"); 

a następnie sprawdzając wartość dla:

isAmazonDevice || fromAmazonStore 

powinien dostać to, czego potrzeba znacznej ilości czasu.

Jednym ze scenariuszy, w którym może to wprowadzać w błąd, jest sytuacja, w której odsyłacze są wykorzystywane do testowania - w takim przypadku nie będzie mieć poprawnej nazwy InstallerPackageName. Możesz go sfałszować, odkładając apk, używając:

adb install -i com.amazon.venezia APK_NAME