Làm cách nào để giả lập vị trí GPS trong Trình giả lập Android?


444

Tôi muốn lấy kinh độ và vĩ độ trong trình giả lập Android để thử nghiệm.

Có ai có thể hướng dẫn tôi làm thế nào để đạt được điều này?

Làm cách nào để đặt vị trí của trình giả lập thành vị trí thử nghiệm?


Nếu bạn đang sử dụng Genymotion: stackoverflow.com/questions/30709329/ từ
Hachem Benyahia

Bạn có thể cài đặt một trong nhiều ứng dụng vị trí giả trên Cửa hàng Play.
whoKnows

Câu trả lời:


443

Bạn có thể kết nối với Trình mô phỏng qua Telnet. Sau đó, bạn có bảng điều khiển Trình mô phỏng cho phép bạn nhập một số dữ liệu nhất định như sửa lỗi địa lý, mạng, v.v.

Làm thế nào để sử dụng bàn điều khiển được giải thích rộng rãi ở đây . Để kết nối với bàn điều khiển, mở một dòng lệnh và gõ

telnet localhost 5554

Sau đó, bạn có thể sử dụng lệnh địa lý để đặt vĩ độ, kinh độ và nếu cần độ cao trên thiết bị được truyền cho tất cả các chương trình sử dụng nhà cung cấp vị trí gps. Xem liên kết ở trên để được hướng dẫn thêm.

Lệnh cụ thể để chạy trong giao diện điều khiển là

geo fix <longitude value> <latitude value>

Tôi thấy trang web này hữu ích để tìm một lat / lng thực tế: http://itouchmap.com/latlong.html

Nếu bạn cần nhiều hơn thì một tọa độ bạn có thể sử dụng tệp kml với một tuyến đường, đó là một chút mô tả trong bài viết này . Tôi không thể tìm thấy một nguồn tốt hơn vào lúc này.


13
bằng cách sử dụng sửa chữa địa lý tôi cũng đã thiết lập vĩ độ và kinh độ giả vẫn nhận được vị trí null.
UMAR

2
hoặc cách đơn giản bật gps trong trình giả lập và đi đến điều khiển trình giả lập cung cấp cho lat lat, các giá trị dài và gửi cho bạn sẽ nhận các giá trị đó trong trình giả lập làm vị trí gps.
UMAR

35
adb emu sửa lỗi địa lý 30.219470 -97.745361
Bryan Rehbein

12
Tâm trật tự, lon trước lat!
Christoph

14
Các geo fixlệnh chỉ có sẵn nếu bạn authđầu tiên. Có thể đáng nói đến ...
aroth

126

Không ai ở đây đề cập đến giải pháp tích hợp sẵn của trình giả lập, vì vậy đối với khách truy cập trong tương lai, tôi muốn chia sẻ nó với hình ảnh.

Đầu tiên, chạy Trình giả lập Android của bạn và nhấp vào nút menu (3 chấm) hiển thị bên dưới:

trình giả lập với nút menu

Sau đó từ khung bên trái, chọn Vị trí và thay đổi tọa độ theo nhu cầu của bạn. Sau khi nhấn nút Gửi , các thay đổi sẽ ngay lập tức có hiệu lực (Tôi khuyên bạn nên mở Google Maps để hiểu rõ hơn).

nhập mô tả hình ảnh ở đây

Phiên bản Android Studio: 2.3.3

Ngoài ra, để làm cho các vị trí khác nhau của bạn đến ứng dụng của bạn trong thời gian thực, bạn có thể sử dụng tệp GPX. Thật dễ dàng để tạo tệp này từ liên kết hướng Google Map:

  1. Truy cập google map, chọn một vị trí, sau đó nhấn "Chỉ đường" và nhập vị trí thứ hai.
  2. Sau khi tuyến đường được tạo, sao chép một liên kết từ trình duyệt
  3. Truy cập trang web này: https://mapstogpx.com và dán liên kết vào hộp "Let's Go"
  4. Nhấn nút "Let's Go" và tệp GPX sẽ được tải xuống

Sử dụng nút "Tải GPS / KML" để tải tệp đã tạo vào trình giả lập của bạn, chọn tốc độ và nhấn nút phát màu xanh lá cây ở phía dưới. Vị trí sẽ được gửi trong thời gian thực như thể hiện trong hình dưới đây.

nhập mô tả hình ảnh ở đây


trong giải pháp này cần một dịch vụ chơi trong trình giả lập?
Kevan Aghera

Tôi không nghĩ vậy.
eden

Khi tôi mở ứng dụng trong trình giả lập google api client null nên không thể tải bản đồ trong trình giả lập. và thiết bị di động là ok cho tôi.
Kevan Aghera

4
Tôi xác nhận rằng không cần phải đăng nhập vào Tài khoản Google của bạn để làm điều này. Mát mẻ!
xarlymg89

3
Tôi đã phải khởi động lại hệ điều hành giả lập để khiến nó nhận ra vị trí mới.
Nate Whittaker

109

Tôi đang tìm kiếm một cách tốt hơn để đặt tọa độ GPS của trình giả lập hơn là sử dụng geo fixvà xác định thủ công các tọa độ kinh độ và vĩ độ cụ thể.

Không thể tìm thấy bất cứ điều gì, tôi kết hợp một chương trình nhỏ sử dụng GWT và Google Maps API để khởi chạy một công cụ bản đồ dựa trên trình duyệt để đặt vị trí GPS trong trình giả lập:

trình giả lập android-gps

Hy vọng nó có thể được sử dụng để giúp đỡ những người khác chắc chắn sẽ vấp phải khó khăn / câu hỏi này.


ồ, cảm ơn bạn! thiết lập chỉ hoạt động tốt, nhưng tôi không thể quản lý kết nối với trình giả lập -> log in java.net.ConnectionRefuse. sau đó tôi đã thử telnet localhost 5554 (từ thiết bị đầu cuối) và nó đã hoạt động .. có ai khác đã thử nghiệm trình giả lập của bạn thành công trên mac không?
ottel142

1
Tôi đã không kiểm tra nó, nhưng điều này có vẻ rất tuyệt vời. Tôi nghĩ Google nên nói với thế giới về nó. Những ý tưởng đơn giản luôn là tốt nhất. Tại sao không ai nghĩ về điều này?
tiktak

@ ottel142 - Có, tôi thực sự đang chạy trên máy Mac mà không gặp vấn đề gì (sử dụng Chrome trên Mavericks). Tôi thấy ConnectionRefusedthông báo đó nếu tôi khởi chạy trình giả lập GPS trước khi khởi động thiết bị ảo Android. Ở đầu trình duyệt của tôi, nó cũng có thông báo "Lỗi khi tạo kết nối trên cổng 5554 ..." Mọi thứ đều hoạt động tốt nếu tôi nhấp vào nút "Thay đổi cổng trình giả lập" để kết nối lại
dpdear

Chính xác những gì tôi cần.
David

Đây là một chương trình tốt, nhưng hệ thống địa phương thay đổi cách thức hoạt động của phao. Trên hệ thống của tôi, nó phải giống như geo fix 42,42 42,42 42dấu phẩy thay vì dấu chấm.
Nurettin

81

Nếu bạn đang sử dụng Eclipse, hãy đi tới Window->Open Perspective->DDMS, sau đó nhập một Location Controlsvà nhấn Send.


8
Đây là phương pháp đơn giản nhất tôi từng thấy. Đảm bảo rằng bạn đã thiết lập AVD của mình với hỗ trợ GPS, sau đó trong phối cảnh DDMS, nhấp vào trình giả lập đang chạy trong Thiết bị, chọn tab Điều khiển Trình mô phỏng trên ngăn bên phải ở giữa, ở dưới cùng là phần Điều khiển vị trí mà SteveCav đã đề cập (Sử dụng Eclipse Juno 4.2 cho các nhà phát triển Java với ADT mới nhất). Bảng điều khiển Vị trí của tôi thậm chí đã được tải sẵn dữ liệu vị trí.
Steven Magana-Zook

câu trả lời chính xác! hoạt động với bất kỳ ide nào vì ddms là một phần của sdk (yoursdkfolder / tools /)
Zarokka

1
Điều này, cũng không phải là giải pháp telnet ở trên, đã làm việc cho tôi. Tôi đang cố gắng để có được vị trí của mình như thế này nhưng nó vẫn không có giá trị. LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Location location = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
crowmagnumb

Khi tôi sử dụng "Điều khiển vị trí" trong DDMS, tôi gặp lỗi sau khi gửi Unable to send command to the emulator. Bất cứ ý tưởng tại sao nó không hoạt động? Tôi đang sử dụng Nexus 4 AVD mặc định
emersonthis

1
Tôi không thể làm điều này, các điều khiển vị trí bị mờ đi
Utsav Gupta

33

Đối với người dùng Android Studio:

chạy trình giả lập,

Sau đó đi đến Tools -> Android ->Android device monitor

mở Emulator ControlTab và sử dụng nhóm điều khiển vị trí.


Trong trường hợp của tôi, tất cả các tập tin là không thể chỉnh sửa. Bạn có một ý tưởng ?
Olkunmustafa

4
@MustafaOlkun Có lẽ có nghĩa là trình giả lập có các điều khiển trên đó. Tìm kiếm một "..." bên cạnh trình giả lập.
Justin

3
Tôi có cùng một vấn đề. Chúng không thể chỉnh sửa. và vâng, có "...". Tuy nhiên, khi tôi đặt bất cứ thứ gì ở đó và Gửi, không có gì thay đổi trên ứng dụng ....
KansaiRobot

14

Giả sử bạn đã thiết lập và chạy mapview:

MapView mapView = (MapView) findViewById(R.id.mapview);
final MyLocationOverlay myLocation = new MyLocationOverlay(this, mapView);

mapView.getOverlays().add(myLocation);
myLocation.enableMyLocation();

myLocation.runOnFirstFix(new Runnable() {
    public void run() {
        GeoPoint pt = myLocation.getMyLocation();
    }
});

Bạn sẽ cần sự cho phép sau trong bảng kê khai của bạn:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Và để gửi tọa độ giả đến trình giả lập từ Eclipse, hãy chuyển đến trình đơn "Cửa sổ", chọn "Hiển thị chế độ xem"> "Khác"> "Điều khiển trình giả lập" và bạn có thể gửi tọa độ từ ngăn điều khiển trình giả lập xuất hiện.


3
nhưng bạn của tôi đâu là kinh độ và vĩ độ ??
UMAR

1
Tôi đã thử sử dụng ans này gửi các giá trị giả cho điều khiển trình giả lập nhưng khi tôi nhấn nút gửi, nó không làm gì cả, không có thông báo nào xuất hiện để xác nhận giá trị được gửi hay không. điều seocnd GeoPoint g = myLocation.getMyLocation (); đang trả về giá trị null.
UMAR

Bạn có chắc chắn rằng bạn đang sử dụng nó trong runOnFirstFix? Bởi vì đó là sự kiện được nêu ra khi thiết bị lần đầu tiên nhận được vị trí GPS, do đó, nếu điều đó được nâng lên, getMyLocationchắc chắn sẽ trả về một giá trị.
David Hedlund


13

1. Người dùng Android Studio.

Sau khi chạy trình giả lập goto Tools-> Android-> Trình giám sát thiết bị Android

Nhấp vào thay đổi Tab Điều khiển Trình mô phỏng từ nhóm điều khiển vị trí.

2. Người dùng Eclipse.

Đầu tiên trong Eclipse Trong Menu Chọn "Cửa sổ", sau đó chọn "Mở phối cảnh" rồi chọn "DDMS". tức là Window-> Open Pres perspective-> DDMS.

Bạn sẽ thấy trên Bảng điều khiển thiết bị bên trái và bên phải bạn sẽ thấy các tab khác nhau. Chọn tab "Điều khiển trình mô phỏng".

Ở phía dưới, bạn sẽ thấy Bảng điều khiển vị trí. Chọn tab "Thủ công".

Nhập Kinh độ và Vĩ độ trong Hộp văn bản, sau đó nhấp vào nút Gửi. Nó sẽ gửi vị trí cho bạn giả lập và ứng dụng.

3. Sử dụng telnet.

Trong lệnh chạy kiểu này.

telnet localhost 5554

Nếu bạn không sử dụng windows, bạn có thể sử dụng bất kỳ máy khách telnet nào.

Sau khi kết nối với telnet, hãy sử dụng lệnh sau để gửi vị trí của bạn tới trình giả lập.

geo fix long lat    
geo fix -121.45356 46.51119 4392

4. Sử dụng công cụ Google maps dựa trên trình duyệt

Có một chương trình sử dụng GWT và Google Maps API để khởi chạy một công cụ bản đồ dựa trên trình duyệt để đặt vị trí GPS trong trình giả lập:

trình giả lập android-gps


Tùy chọn đầu tiên này làm việc cho tôi, với một thay đổi nhỏ. Tôi không thể mở cửa sổ DDMS từ Eclipse, tôi chỉ có một trang màu xám trống. Nhưng trong khi tôi chạy trình giả lập, nếu tôi mở DDMS từ dấu nhắc lệnh (C: \ Program Files \ Android \ android-sdk \ tools \ ddms) thì tôi có thể thấy cửa sổ bạn mô tả với Thiết bị bên trái và "Điều khiển trình giả lập "Tab bên phải. Cảm ơn!
Eric Barr

10

Sử dụng lệnh "Geo" trong bảng điều khiển giả lập

Để gửi dữ liệu vị trí giả từ dòng lệnh:

  1. Khởi chạy ứng dụng của bạn trong trình giả lập Android và mở terminal / console trong thư mục công cụ / SDK của SDK.

  2. Kết nối với bảng điều khiển giả lập:

    telnet localhost 5555 (Thay thế 5555 bằng bất kỳ cổng nào trình giả lập của bạn đang chạy)

  3. Gửi dữ liệu vị trí: * sửa địa lý để gửi một vị trí địa lý cố định.

    Lệnh này chấp nhận kinh độ và vĩ độ theo độ thập phân và độ cao tùy chọn tính bằng mét. Ví dụ:

    geo fix -121.45356 46.51119 4392

8

Tôi đã viết một kịch bản python để đẩy các vị trí gps đến trình giả lập thông qua telnet. Nó xác định một nguồn và một vị trí đích. Ngoài ra còn có thời gian bù cho phép bạn kiểm soát thời gian tọa độ sẽ được đẩy đến thiết bị. Một địa điểm là ong đẩy một lần một giây.

Trong ví dụ dưới đây, kịch bản chuyển từ Berlin đến Hamburg trong 120 giây. Một bước / vị trí gps mỗi giây với khoảng cách ngẫu nhiên.

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import telnetlib
from time import sleep
import random

HOST = "127.0.0.1"
PORT = 5554
TIMEOUT = 10
LAT_SRC = 52.5243700
LNG_SRC = 13.4105300
LAT_DST = 53.5753200
LNG_DST = 10.0153400
SECONDS = 120

LAT_MAX_STEP = ((max(LAT_DST, LAT_SRC) - min(LAT_DST, LAT_SRC)) / SECONDS) * 2
LNG_MAX_STEP = ((max(LNG_DST, LNG_SRC) - min(LNG_DST, LNG_SRC)) / SECONDS) * 2

DIRECTION_LAT = 1 if LAT_DST - LAT_SRC > 0 else -1
DIRECTION_LNG = 1 if LNG_DST - LNG_SRC > 0 else -1

lat = LAT_SRC
lng = LNG_SRC

tn = telnetlib.Telnet(HOST, PORT, TIMEOUT)
tn.set_debuglevel(9)
tn.read_until("OK", 5)

tn.write("geo fix {0} {1}\n".format(LNG_SRC, LAT_SRC))
#tn.write("exit\n")

for i in range(SECONDS):
    lat += round(random.uniform(0, LAT_MAX_STEP), 7) * DIRECTION_LAT
    lng += round(random.uniform(0, LNG_MAX_STEP), 7) * DIRECTION_LNG

    #tn.read_until("OK", 5)
    tn.write("geo fix {0} {1}\n".format(lng, lat))
    #tn.write("exit\n")
    sleep(1)

tn.write("geo fix {0} {1}\n".format(LNG_DST, LAT_DST))
tn.write("exit\n")

print tn.read_all()

Hoạt động như một lá bùa! Cám ơn vì đã chia sẻ.
Alberto Gaona

Mmmmm. Tôi nghĩ rằng có một lỗi nhỏ: Theo như tôi biết, thông báo sửa lỗi địa lý nhận được Kinh độ và Vĩ độ, theo thứ tự đó: Bạn đang gửi chúng theo cách khác. Xem câu trả lời ở trên.
Alberto Gaona

Không làm việc. Trình giả lập đang nghe trên cổng nhưng nó không nhận được gì.
Durga Swaroop


5

Trong Linux, nơi các cổng giao tiếp bị chặn. điều hướng thiết bị đầu cuối đến thư mục công cụ nền tảng bên trong android sdkvà thực hiện lệnh này:

./adb -s #{device_name} emu geo fix #{longitude} #{latitude}

5

Trong Mac, Linux hoặc Cygwin:

echo 'geo fix -99.133333 19.43333 2202' | nc localhost 5554

Điều đó sẽ đưa bạn đến Mexico City. Thay đổi kinh độ / vĩ độ / cao độ tương ứng. Điều đó là đủ nếu bạn không quan tâm đến bước sóng.


Bạn có thể phải điều chỉnh 5554 sang cổng nghe giả lập hiện tại của mình.
Alberto Gaona

5

Giải pháp sau đây có hiệu quả với tôi - mở dòng lệnh và viết:

adb emu geo fix [longtitude] [latitude]

5

Cuối cùng với bản phát hành mới nhất của Android Studio 4 và bản cập nhật Trình giả lập mới 23/11/2019, nó trở nên dễ dàng hơn. Bắt đầu trình giả lập của bạn và đi đến các tham số giả lập ...> trong tab "Tuyến đường", bạn có thể chọn hai điểm trên bản đồ từ / đến và bắt đầu một tuyến đường mới với tốc độ phát lại có thể điều chỉnh có thể đi tới hơn 1000km / h!

nhập mô tả hình ảnh ở đây



4

Đầu tiên hãy vào phần DDMS trong nhật thực của bạn Hơn điều khiển trình giả lập mở .... Đi đến Phần thủ công đặt lat và dài rồi nhấn nút Gửi


3

Tôi đã cố gắng đặt sửa lỗi địa lý thông qua adb cho nhiều điểm và không thể khiến ứng dụng của tôi thấy bất kỳ dữ liệu GPS nào. Nhưng khi tôi thử mở DDMS, chọn quy trình của ứng dụng và gửi tọa độ thông qua tab điều khiển trình giả lập, nó hoạt động ngay lập tức.


Bạn không cần chỉ định một quy trình ... Hoặc có lẽ DDMS trong năm 2010 yêu cầu thực hiện điều đó.

3

Trình theo dõi gỡ lỗi Dalvik> Chọn Trình mô phỏng> Tab Điều khiển trình mô phỏng> Điều khiển vị trí.

DDMS - android_sdk / tools / ddms HOẶC android_sdk / tools / màn hình


2

Nếu bạn đang sử dụng nhật thực thì sử dụng trình điều khiển Trình mô phỏng, bạn có thể đặt thủ công vĩ độ và kinh độ và chạy ứng dụng dựa trên bản đồ của mình trong trình giả lập


2

Nếu bạn đang sử dụng Android Studio (1.3):

  • Nhấp vào Menu "Công cụ"
  • "Android"
  • "Màn hình thiết bị Android"
  • nhấp vào Trình giả lập hiện tại của bạn
  • Tab "Điều khiển trình mô phỏng"
  • đi tới "Điều khiển vị trí" và nhập Lat và Lon

2

Chỉ cần làm cho câu trả lời của Alberto Gaona thành một dòng

token=$(cat ~/.emulator_console_auth_token); cat <(echo -e "auth $token \n  geo fix 96.0290791 16.9041016  \n exit") - | nc localhost 5554

5554 là số cổng giả lập được hiển thị trong adb devices .

Nó sẽ tốt hơn nếu adb emulàm việc.


rất hữu ích một lót! trong trường hợp của tôi, tôi đã phải xóa khoảng trắng giữa \ n: token = $ (cat ~ / .emulator_console_auth_token); mèo <(echo -e "auth $ token \ ngeo sửa 96.0290791 19.9041016 \ nexit") - | nc localhost 5554
Jeremie

1

Nếu các giải pháp trên không hoạt động. Thử cái này:

Bên trong Manifest.xml trên Android của bạn, hãy thêm hai liên kết BÊN NGOÀI của thẻ ứng dụng, nhưng bên trong thẻ kê khai của bạn tất nhiên

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
<uses-permission android:name="android.permission.INTERNET" ></uses-permission>

1

Tôi không thể sửa lỗi GPS trên trình giả lập khi trình giả lập đang chạy hình ảnh Android mà không có Google API. Ngay sau khi tôi thay đổi hình ảnh để chứa API Google, tất cả các cách được đề cập ở đây để sửa lỗi GPS hoạt động.

Đảm bảo bạn chọn một hình ảnh với Google API khi tạo AVD.


Bạn có ý nghĩa gì với Image và trong khi tạo AVD, làm cách nào để tôi chọn một hình ảnh với Google API? không có tùy chọn nào như vậy trong khi tạo AVD trong nhật thực.
dùng1911703

Đảm bảo bạn đã tải xuống hình ảnh bằng API Google thông qua trình quản lý SDK Android.
dvim

1

Câu trả lời đã được đề cập nhiều lần để sử dụng lệnh shell " sửa lỗi địa lý ... " là câu trả lời đúng. Nhưng trong trường hợp bạn sử dụng LocationClient.getLastLocation () để truy xuất dữ liệu của mình, điều đáng nói là nó sẽ không hoạt động lúc đầu. Lớp LocationClient sử dụng Dịch vụ Google Play để truy xuất tọa độ. Đối với tôi điều này bắt đầu hoạt động sau khi chạy ứng dụng bản đồ giả lập một lần. Trong lần bắt đầu đầu tiên, bạn được yêu cầu cho phép các ứng dụng google truy cập vào vị trí của bạn, điều mà tôi đoán là có mẹo.


1

Đối với một dự án của riêng tôi, tôi đã phát triển một dịch vụ trực tuyến có thể cung cấp vị trí mô phỏng cho trình giả lập Android.

Nó sử dụng bước sóng địa lý thay vì sửa lỗi địa lý cho phép nó thiết lập tốc độ, khóa học, thời gian chính xác, v.v. ngoài việc chỉ có lat / lon.

Dịch vụ này yêu cầu tiện ích dòng lệnh nc (netcat) và không có gì khác.

http://www.kisstech.ch/nmea/




1

Mở studio Android-> Menu công cụ-> Android-> Màn hình thiết bị Android-> Tab Trình mô phỏng-> Điều khiển vị trí-> Đặt vĩ độ và kinh độ cần thiết của bạn và kiểm tra dự án của bạn theo nhu cầu của bạn


bạn có thể đặt giá trị vị trí tĩnh (Vĩ độ & Kinh độ) vị trí bạn cần kiểm tra trực tiếp trong phần mã hóa?
Premkumar Manipillai

0

Trong nhật thực:

Bạn có thể phải kéo cửa sổ DDMS xuống. 'Điều khiển vị trí' nằm trong 'Hành động điện thoại' và có thể bị ẩn bởi chế độ xem bảng điều khiển có kích thước thông thường (thanh có bảng điều khiển, LogCat, v.v. có thể che nó!)

~


Bên trong DDMS tôi tìm thấy dưới Trình điều khiển Trình mô phỏng. Tab bên dưới Điều khiển vị trí.
dùng914425
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.