Jednym z efektów ubocznych instalacji aplikacji z poziomu Android Marketu jest utworzenie wpisów w PackageManagerze, które zawierają informację o tym, że aplikacja została zainstalowana (kupiona) z poziomu Marketu. Dzięki temu możemy zabronić uruchamiania aplikacji nie instalowanych z Marketu co pozwala chronić aplikacje przed piractwem (niestety nie wiem od jak dawna Android Market ustawia ten wpis podczas instalacji, więc możliwe że dla dawno zainstalowanych aplikacji będzie on pusty mimo instalacji z poziomu Android Marketu - ale podejrzewam, że każda aktualizacji aplikacji ustawia ten wpis od nowa). Wystarczy poniższy kawałek kodu:
który możemy wrzucić w dowolne miejsce programu (np. metodę onCreate()). W dokumentacji metody PackageManager.getInstallerPackageName(String packageName) możemy przeczytać:
Po zainstalowaniu aplikacji z poziomu środowiska Eclipse i wywołaniu powyższego kodu dostaniemy informację:
W sumie nie rozumiem dlaczego nie ma tutaj informacji w stylu "ADB" lub coś podobnego, pozwoliłoby to odróżnić instalację np. z poziomu środowiska developerskiego od tej z poziomu karty SD. Ułatwiłoby to testowanie takiego rozwiązania.
Po zainstalowaniu aplikacji z Android Marketu i jej uruchomieniu dostaniemy z kolei taką informację:
Rozwiązanie jest proste i niektórzy wydawcy go używają w swoich aplikacjach. Dodatkową zaletą jest brak konieczności połączanie z internetem, co jest wymagane w przypadku usługi LVL. Niestety są też minusy, na różnych telefonach zwracana jest różna wartość z metody, a czasem w ogóle (patrz ten post).
Niestety nie wiem w jaki sposób Android Market ustawia tą wartość, w opisie metody jest informacja, że można rozróżniać z jakiego sklepu jest aplikacja, więc może inne "markety" będą mogły (mogą?) ustawiać tam swoja wartość w jakiś sposób?
Retrieve the package name of the application that installed a package. This identifies which market the package came from.Jako parametr należy podać pakiet naszej aplikacji, który można uzyskać za pomocą metody Context.getPackageName().
Po zainstalowaniu aplikacji z poziomu środowiska Eclipse i wywołaniu powyższego kodu dostaniemy informację:
W sumie nie rozumiem dlaczego nie ma tutaj informacji w stylu "ADB" lub coś podobnego, pozwoliłoby to odróżnić instalację np. z poziomu środowiska developerskiego od tej z poziomu karty SD. Ułatwiłoby to testowanie takiego rozwiązania.
Po zainstalowaniu aplikacji z Android Marketu i jej uruchomieniu dostaniemy z kolei taką informację:
Rozwiązanie jest proste i niektórzy wydawcy go używają w swoich aplikacjach. Dodatkową zaletą jest brak konieczności połączanie z internetem, co jest wymagane w przypadku usługi LVL. Niestety są też minusy, na różnych telefonach zwracana jest różna wartość z metody, a czasem w ogóle (patrz ten post).
Niestety nie wiem w jaki sposób Android Market ustawia tą wartość, w opisie metody jest informacja, że można rozróżniać z jakiego sklepu jest aplikacja, więc może inne "markety" będą mogły (mogą?) ustawiać tam swoja wartość w jakiś sposób?





