четверг, 20 сентября 2012 г.

Fake GPS FAQ


I've got a lot of messages about the same issues from different people every day. I decide to write the answers once in a one place instead of writing tons of replies. If you found a new issue which is not in the list below - feel free to  contact me.

Q: I've got my phone stacked at the last faked location
Q: My phone can't fetch the real location
Q: After uninstalling your app I still got wrong location even after factory reset

All of this are the same issue which happened with you when you forgot to disable "Wireless/Network location provider" as it's recommended in the description. Don't worry - yout gps sensor is ok. Read this article to understand why you are pinned to a wrong location after playing with Fake GPS:
http://www.zdnet.com/blog/networking/how-google-and-everyone-else-gets-wi-fi-location-data/1664

You have two options to do:
1st way:
  • Enable "Wireless/Network location provider" back
  • Install "GPS status" app from Google Play
  • Get a fresh GPS fix
  • Wait for 24 hours (may be less) until google updates your Wi-Fi access point's location (don't use Fake GPS during this time)
  • When you've got it and wish to continue using Fake GPS remember to DISABLE "Wireless/Network location provider" to avoid this issue in future
or
2nd way:
  • Add "_nomap" suffix at the end of your Wi-Fi access point name. E.g.: "JohnSmith" => "JohnSmith_nomap"
  • After that you can enable "Wireless/Network location provider" back without any future issues
This force google not to use your Wi-Fi access point to determine your location. But you may find that GPS stop working in your premises. So don't use this method unless you understand what you are doing clearly. For more details see http://googleblog.blogspot.com/2011/11/greater-choice-for-wireless-access.html

Q: It doesn't work with MLB At Bat!

MLB At Bat uses double check of your location: GPS location + GeoIP location. The second one means they can get your rough location by your IP address (issued by your local internet provider) and black you out so. The only way to cope with it is using Fake GPS paired with a VPN service that could replace your external IP address with a new one. But if the new IP address match an area which is blacked out too you'd try to use another VPN provider.

Q: It doesn't work with Google+

When you tap a location button and see that yes/no dialog - just press back and you'll got a list of places near your faked location. You should have "Wireless/Network location provider" option disabled to do this.

Q: It stopped working after some time

Go to the Settings and check the Accuracy value - it should not be zero! If it is - set it to 1 meter or more.

Q: Where can I find apk for the donate version

For Android 4.1 and higher google stores paid apps on a local device in an encrypted way. More details can be found at http://nelenkov.blogspot.com/2012/07/using-app-encryption-in-jelly-bean.html
So the apk for donated version can be found at /mnt/asec/com.lexa.fakegpsdonate-1/pkg.apk Note please that "-1" at the end of the package name could be any other number. You should do the follow steps:
- copy apk to SD card
- install application from apk on SD card
- you'll get /data/app/com.lexa.fakegpsdonate.apk which could be moved to /system/app/
On some devices it is necessary to set permission to 644 and reboot your device

Q: Moving apk to /system/app/ doesn't work on Android 4.4 kitkat

You should put apk to /system/app-priv/ instead

Q: Does your app have a command line support (Donate version only)

Yes, you can start and stop Fake GPS using command line only:

am startservice -a com.lexa.fakegps.START -e lat 56.1234 -e long 44.0011
am startservice -a com.lexa.fakegps.STOP
If you don't want to save location in the History just add --ez no_history true to a start string

Q: Tasker integration (Donate version only)

To start Fake GPS at (38.89765, -77.0365)
1. Create a new task and entitle it "Start Fake GPS"
2. Add Action -> Misc -> Send Intent
3. Fill fields:
    - Action: com.lexa.fakegps.START
    - Extra: lat:38.89768D
    - Extra: long:-77.0365D
    - Target: Service

To stop Fake GPS use
    - Action: com.lexa.fakegps.STOP
    - Target: Service

You can use variables to specify lat/long as well. Please remember to add "D" to extras to specify it as Double

среда, 11 апреля 2012 г.

Почему отваливается VPN

При работе периодически отваливается VPN. Поднять заново недолго, но когда по 20 раз на дню ... Глянул в логи - при отваливании пишет:
nm-pptp-service warn[decaps_gre:pptp_gre.c:331]: short read (-1): Message too long

Погуглил я на эту тему - и вот что обнаружилось:
http://i-heart-geek.blogspot.com/2011/06/solved-vpn-short-read-1-message-too.html

Солюшн оказался простым - в VPNовском фрагменте сети может быть установлен меньший MTU (maximum transmission unit), чем у нас - в результате мы и получаем у себя Message too long.
Чтобы найти правильное значение MTU нужно сделать traceroute на интересующий узел VPNа:
traceroute -n --mtu xxx.xxx.xxx.xxx

берем минимальный и проставляем в настройках Network Manager или ручками:
sudo ifconfig eth0 mtu VALUE

понедельник, 19 марта 2012 г.

Поднимаем WiFi Access Point под Ubuntu 11.10

Очень подробный мануал вот здесь:
http://exain.wordpress.com/2011/03/31/making-a-wifi-hotspot-access-point-using-linux-wifi-lan-cardusb-adapter/

На моем буке Asus K73S все заработало практически без напильника
Два маленьких дополнения:
dhcpd под Ubuntu оказывается называется isc-dhcp-server, о как!
Соответственно стартует он через
sudo service isc-dhcp-server start

И конфиги его лежат не в /etc/dhcp3/ как указано в источнике, а в
/etc/dhcp/dhcpd.conf

среда, 14 марта 2012 г.

Custom screen resolution for android-x86 under Virtual Box

Занимаюсь сейчас проектом под планшеты с Андроидом 4.0. Эмулятор тормозит, несмотря на свежее железо. В основном видимо из-за большого экрана - при стандартном HVGA все летает. Решил вернуться обратно на android-x86 + Virtual Box. Скачал 8 гигов исходников, собрал за 3 часа - все работает. Одна беда - разрешение нужно нетривиальное: 1280х800. VESA такое не поддерживает, поэтому в загрузе kernel параметр vga=xxx не помогает. Решено было задействовать uvesafb:

1. меняем строчку загрузки: kernel ... video=-16 vga=xxx video=uvesa UVESA_MODE=1280x800 (обязательно большими буквами!)
2. из консоли запускаем: VBoxManage setextradata "Your VM name" "CustomVideoMode1" "1280x800x32"

вуаля )))

среда, 27 апреля 2011 г.

OpenGL ES Texture и GalaxyTab

Задача - нарисовать плоскость с натянутой текстурой. Нашел демку, которая прекрасно работает на эмуляторе:
http://www.anddev.org/android-2d-3d-graphics-opengl-problems-f55/draw-a-bitmap-using-opengl-t14920.html

И все бы ничего, но при запуске данного кода на девайсе Galaxy Tab вместо текстуры - пустой белый квадрат.

Примерно час убил на гугление и эксперименты, и оказалось, что нужно добавить два обязательных условия:
1. Размер текстуры должен быть кратным 2: 32х32, 64х64, 128х128 и не превышать 128 (видимо хардварное ограничение)
2. Текстуры нужно хранить в drawable-nodpi

В решении проблемы очень помогли комменты вот к этой ветке:
http://blog.jayway.com/2010/12/30/opengl-es-tutorial-for-android-%E2%80%93-part-vi-textures/

четверг, 21 апреля 2011 г.

Отказываемся от RelativeLayout

Задача - реализовать вот такой макет:


Думаете потребуется RelativeLayout? А вот и нет! Все можно сделать с помощью одних только LinearLayout. Там есть замечательный атрибут layout_weight, который позволяет задавать вес элемента (не путать с layout_width!). Поскольку по-умолчанию веса всех элементов равны нулю, достаточно у ListView сделать layout_weight="1" и он сразу же займет все свободное место вверху, прижав строчку с кнопкой к низу экрана. Точно также - задав у строки ввода layout_weight="1" мы прижимаем кнопку "Add" к правому краю.

Другие возможности - можно сделать ряд одинаковых кнопок, размер которых будет одинаков для всех разрешений экрана - достаточно установить у каждой тот самый layout_weight. Исключительно полезный атрибут - поэкспериментируйте!

Устанавливаем ListView на конкретную позицию

Вот вроде простая задачка, ан-нет! На собеседованиях я это часто спрашиваю - мало кто отвечает. Странно ... Вот вроде по логике должно быть достаточно:

list.setSelection(position);

А вот не работает! Оказывается нужно так:

list.requestFocusFromTouch();
list.setSelection(position);

Кто-бы мог подумать!