Pokazywanie postów oznaczonych etykietą kod. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą kod. Pokaż wszystkie posty

piątek, 20 sierpnia 2010

How-to: prosty sposób na piractwo w Android Market

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ć:
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? 

poniedziałek, 19 lipca 2010

Problemy z kontaktami w telefonie - czyli stare i nowe Contacts API

Dostałem dziś informację, że program "Który Operator?", który rozwijam nie działa poprawnie na telefonie HTC Desire (dziękuję Rafałowi za zgłoszenie błędu zamiast po prostu odinstalowanie programu :). 

O co chodzi? Problem polega na tym, że program nie wyświetla wszystkich kontaktów w telefonie, a jedynie te z konta Google. Po wymianie kilku e-maili, chwili wyszukiwania oraz pytaniu na grupie PLAG okazało się, że HTC Desire ma swoją własną aplikację do zarządzania kontaktami zamiast tej domyślnej z Androida 2.1:
 
(po lewej aplikacja kontaktów z HTC Desire, po prawej czysty Android 2.x)

Podczas zapisu kontaku w aplikacji na HTC Desire użytkownik może wybrać gdzie kontakt ma być zapisany (telefon, karta sim, albo kontakty Google). Okazało się, że kontakty zapisane "w telefonie" nie są widoczne w programie "Który Operator?"

Zacząłem więc się zastanawiać co jest nie tak. Kontakty w programie pobieram za pomocą "starego" API (program powstał zanim została wydana wersja 2.0, poza tym powinien być kompatybilny wstecz). Na moim Nexusie działał bez problemu, nie miałem też innych sygnałów że coś jest nie tak więc nie było powodu by cokolwiek zmieniać:


Postanowiłem więc sprawdzić czy to kwestia używania starego API. Przepisałem więc metodę pobierającą kontakty za pomocą nowego API:


Sprawdziłem na swoim telefonie - pobierają się te same kontakty co za pomocą starego API. Połowa sukcesu. Na grupie PLAG znalazłem chętnych do przetestowania zmian (dzięki!). Okazało się, że problem był właśnie w użyciu starego API. Za pomocą nowego API wszystkie kontakty czytają się bez problemu. Dzięki Matuszowi Grzechocińskiemu z PLAG za testy nowego API na HTC Desire, wszystkie 3 rodzaje kontaktów są poprawnie odczytywane w programie:

 
(po prawej można zobaczyć nadchodzącą nową wersję programu Który operator?)

Do tej pory nie miałem motywacji by korzystać z nowego API - przecież stare jest kompatybilne a pozwala dotrzeć do większej liczby urządzeń. Jak się okazuje nie do końca i warto korzystać z nowszego API. Pozostaje decyzja czy pisać na urządzenia z Androidem >= 2.0 czy też rzeźbić za pomocą refleksji - chyba spróbuję refleksji by poznać coś nowego. I pewnie kiedyś pojawi sięo tym wpis na blogu.