Làm cách nào tôi có thể giả định vị trí của mình trên thiết bị vật lý (Nexus One)? Tôi biết bạn có thể làm điều này với trình giả lập trong bảng điều khiển Trình mô phỏng, nhưng điều này không hoạt động đối với một thiết bị vật lý.
Làm cách nào tôi có thể giả định vị trí của mình trên thiết bị vật lý (Nexus One)? Tôi biết bạn có thể làm điều này với trình giả lập trong bảng điều khiển Trình mô phỏng, nhưng điều này không hoạt động đối với một thiết bị vật lý.
Câu trả lời:
Có vẻ như cách duy nhất để làm là sử dụng một nhà cung cấp vị trí giả.
Bạn phải bật các vị trí giả trong bảng phát triển trong cài đặt của mình và thêm
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
để biểu hiện của bạn.
Bây giờ bạn có thể nhập mã của mình và tạo nhà cung cấp vị trí giả của riêng bạn và đặt vị trí của nhà cung cấp này.
Nếu bạn chỉ sử dụng điện thoại này trong phòng thí nghiệm phát triển, có khả năng bạn có thể hàn chip GPS và cung cấp cổng nối tiếp trực tiếp với các chuỗi NMEA từ thiết bị khác.
Tôi ước tôi có cáp của tôi tiện dụng. Tôi biết bạn có thể telnet đến trình giả lập để thay đổi vị trí của nó
$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK
Tôi không thể nhớ nếu bạn có thể telnet đến thiết bị của mình, nhưng tôi nghĩ bạn có thể. Tôi hi vọng cái này giúp được.
Bạn sẽ cần adb (cầu gỡ lỗi android) cho việc này (CLI).
Bạn có thể sử dụng quyền Dịch vụ vị trí để giả định vị trí ...
"android.permission.ACCESS_MOCK_LOCATION"
và sau đó trong mã java của bạn,
// Set location by setting the latitude, longitude and may be the altitude...
String[] MockLoc = str.split(",");
Location location = new Location(mocLocationProvider);
Double lat = Double.valueOf(MockLoc[0]);
location.setLatitude(lat);
Double longi = Double.valueOf(MockLoc[1]);
location.setLongitude(longi);
Double alti = Double.valueOf(MockLoc[2]);
location.setAltitude(alti);
Tôi đã thành công với mã sau đây. Mặc dù nó đã cho tôi một khóa duy nhất vì một số lý do (ngay cả khi tôi đã thử các cặp LatLng khác nhau), nó vẫn hoạt động với tôi. mLocationManager
là một LocationManager
cái được nối với một LocationListener
:
private void getMockLocation()
{
mLocationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
mLocationManager.addTestProvider
(
LocationManager.GPS_PROVIDER,
"requiresNetwork" == "",
"requiresSatellite" == "",
"requiresCell" == "",
"hasMonetaryCost" == "",
"supportsAltitude" == "",
"supportsSpeed" == "",
"supportsBearing" == "",
android.location.Criteria.POWER_LOW,
android.location.Criteria.ACCURACY_FINE
);
Location newLocation = new Location(LocationManager.GPS_PROVIDER);
newLocation.setLatitude (/* TODO: Set Some Lat */);
newLocation.setLongitude(/* TODO: Set Some Lng */);
newLocation.setAccuracy(500);
mLocationManager.setTestProviderEnabled
(
LocationManager.GPS_PROVIDER,
true
);
mLocationManager.setTestProviderStatus
(
LocationManager.GPS_PROVIDER,
LocationProvider.AVAILABLE,
null,
System.currentTimeMillis()
);
mLocationManager.setTestProviderLocation
(
LocationManager.GPS_PROVIDER,
newLocation
);
}
setTestProviderStatus
được sử dụng ở đây để thông báo / đăng lên / lên lịch một sự kiện với LocationManager rằng nhà cung cấp GPS đã tìm thấy bản sửa lỗi "ngay bây giờ" để việc xử lý sự kiện nói trên có thể xảy ra.
mLocationManager
là một LocationManager
cái được nối với LocationListener" là gì? tôi có thể làm cái này như thế nào? Cảm ơn bạn ..
LocationManager
dịch vụ và LocationListener
: blog.doityourselfandroid.com/2010/12/25/ợi
Những gì Dr1Ku đăng công trình. Đã sử dụng mã ngày hôm nay nhưng cần thiết để thêm nhiều locus. Vì vậy, đây là một số cải tiến:
Tùy chọn: Thay vì sử dụng Chuỗi LocationManager.GPS_PROVIDER, bạn có thể muốn xác định constat PROVIDER_NAME của riêng mình và sử dụng nó. Khi đăng ký cập nhật vị trí, hãy chọn nhà cung cấp qua tiêu chí thay vì chỉ định trực tiếp dưới dạng chuỗi.
Đầu tiên: Thay vì gọi removeTestProvider, trước tiên hãy kiểm tra xem có nhà cung cấp nào bị xóa không (để tránh IllegalArgumentException):
if (mLocationManager.getProvider(PROVIDER_NAME) != null) {
mLocationManager.removeTestProvider(PROVIDER_NAME);
}
Thứ hai: Để xuất bản nhiều hơn một địa điểm, bạn phải đặt thời gian cho địa điểm đó:
newLocation.setTime(System.currentTimeMillis());
...
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);
Dường như cũng có một Thử nghiệm google sử dụng MockLocationProviders: http://grepcode.com/file/reposective.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProighborTest.java
Một ví dụ hoạt động tốt khác có thể được tìm thấy tại: http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/
Một bài viết hay khác là: http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1353 Bạn cũng sẽ tìm thấy một số mã thực sự hoạt động cho tôi trên trình giả lập.
Mock Provider
, GPS bình thường sẽ không hoạt động, tôi không thể sửa chữa (tôi đã thử nghiệm trực tiếp trên thiết bị). Đây có thể không phải là trường hợp vì rất nhiều đã xảy ra trong Android kể từ đó.
Có những ứng dụng có sẵn trong Android Market cho phép bạn chỉ định "Vị trí GPS giả" cho thiết bị của mình.
Tôi đã tìm kiếm https://market.android.com và tìm thấy một ứng dụng có tên "My Fake Location" phù hợp với tôi.
Nhà cung cấp Mock GPS được Paul đề cập ở trên (tại http://www.cowlumbus.nl/forum/MockGpsProvider.zip ) là một ví dụ khác bao gồm mã nguồn - mặc dù tôi không thể cài đặt APK được cung cấp (nó báo Lỗi [INSTALL_FAILED_OLDER_SDK] và có thể chỉ cần biên dịch lại)
Để sử dụng vị trí giả định GPS, bạn cần bật nó trong cài đặt thiết bị của mình. Chuyển đến Cài đặt -> Ứng dụng -> Phát triển và kiểm tra "Cho phép vị trí giả"
Sau đó, bạn có thể sử dụng một ứng dụng như các ứng dụng được mô tả ở trên để đặt tọa độ GPS và bản đồ Google và các ứng dụng khác sẽ sử dụng vị trí giả định GPS mà bạn chỉ định.
Điều này làm việc cho tôi (Android Studio):
Vô hiệu hóa theo dõi GPS và WiFi trên điện thoại. Trên Android 5.1.1 trở xuống, chọn "bật vị trí giả" trong Tùy chọn nhà phát triển.
Tạo một bản sao của bảng kê khai của bạn trong thư mục src / debug. Thêm phần sau vào nó (bên ngoài thẻ "ứng dụng"):
android cho phép sử dụng: name = "ERIC.ACCESS_MOCK_LOCATION"
Thiết lập một mảnh bản đồ gọi là "bản đồ". Bao gồm đoạn mã sau trong onCreate ():
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
ll = new MyLocationListener();
if (lm.getProvider("Test") == null) {
lm.addTestProvider("Test", false, false, false, false, false, false, false, 0, 1);
}
lm.setTestProviderEnabled("Test", true);
lm.requestLocationUpdates("Test", 0, 0, ll);
map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng l) {
Location loc = new Location("Test");
loc.setLatitude(l.latitude);
loc.setLongitude(l.longitude);
loc.setAltitude(0);
loc.setAccuracy(10f);
loc.setElapsedRealtimeNanos(System.nanoTime());
loc.setTime(System.currentTimeMillis());
lm.setTestProviderLocation("Test", loc);
}
};
Lưu ý rằng bạn có thể phải tạm thời tăng "minSdkVersion" trong tệp lớp mô-đun của mình lên 17 để sử dụng phương thức "setElapsedRealtimeNanos".
Bao gồm các mã sau trong lớp hoạt động chính:
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
// do whatever you want, scroll the map, etc.
}
}
Chạy ứng dụng của bạn với AS. Trên Android 6.0 trở lên, bạn sẽ nhận được một ngoại lệ bảo mật. Bây giờ, hãy vào Tùy chọn nhà phát triển trong Cài đặt và chọn "Chọn ứng dụng vị trí giả". Chọn ứng dụng của bạn từ danh sách.
Bây giờ khi bạn nhấn vào bản đồ, onLocationChanged () sẽ kích hoạt với tọa độ của vòi của bạn.
Tôi chỉ cần tìm ra điều này vì vậy bây giờ tôi không phải đi lang thang quanh khu phố với điện thoại trong tay.
Tôi đã tạo một Trình xử lý đơn giản mô phỏng vị trí di chuyển từ vị trí ban đầu.
Bắt đầu nó trong cuộc gọi lại kết nối của bạn:
private final GoogleApiClient.ConnectionCallbacks mConnectionCallbacks = new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
if (BuildConfig.USE_MOCK_LOCATION) {
LocationServices.FusedLocationApi.setMockMode(mGoogleApiClient, true);
new MockLocationMovingHandler(mGoogleApiClient).start(48.873399, 2.342911);
}
}
@Override
public void onConnectionSuspended(int i) {
}
};
Lớp Handler:
private static class MockLocationMovingHandler extends Handler {
private final static int SET_MOCK_LOCATION = 0x000001;
private final static double STEP_LATITUDE = -0.00005;
private final static double STEP_LONGITUDE = 0.00002;
private final static long FREQUENCY_MS = 1000;
private GoogleApiClient mGoogleApiClient;
private double mLatitude;
private double mLongitude;
public MockLocationMovingHandler(final GoogleApiClient googleApiClient) {
super(Looper.getMainLooper());
mGoogleApiClient = googleApiClient;
}
public void start(final double initLatitude, final double initLongitude) {
if (hasMessages(SET_MOCK_LOCATION)) {
removeMessages(SET_MOCK_LOCATION);
}
mLatitude = initLatitude;
mLongitude = initLongitude;
sendEmptyMessage(SET_MOCK_LOCATION);
}
public void stop() {
if (hasMessages(SET_MOCK_LOCATION)) {
removeMessages(SET_MOCK_LOCATION);
}
}
@Override
public void handleMessage(Message message) {
switch (message.what) {
case SET_MOCK_LOCATION:
Location location = new Location("network");
location.setLatitude(mLatitude);
location.setLongitude(mLongitude);
location.setTime(System.currentTimeMillis());
location.setAccuracy(3.0f);
location.setElapsedRealtimeNanos(System.nanoTime());
LocationServices.FusedLocationApi.setMockLocation(mGoogleApiClient, location);
mLatitude += STEP_LATITUDE;
mLongitude += STEP_LONGITUDE;
sendEmptyMessageDelayed(SET_MOCK_LOCATION, FREQUENCY_MS);
break;
}
}
}
Hy vọng nó có thể giúp ..
Giải pháp được đề cập bởi icyerasor và được Pedro cung cấp tại http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ đã làm việc rất tốt cho tôi. Tuy nhiên, nó không cung cấp hỗ trợ cho việc khởi động, dừng và khởi động lại đúng cách nhà cung cấp GPS giả.
Tôi đã thay đổi mã của anh ấy một chút và viết lại lớp thành AsyncTask thay vì Thread. Điều này cho phép chúng tôi liên lạc với UI Thread, vì vậy chúng tôi có thể khởi động lại nhà cung cấp tại điểm mà chúng tôi đã dừng khi chúng tôi dừng nó. Điều này có ích khi hướng màn hình thay đổi.
Mã này, cùng với một dự án mẫu cho Eclipse, có thể được tìm thấy trên GitHub: https://github.com/paulhoux/Android-MockProviderGPS
Tất cả tín dụng nên đến Pedro để làm hầu hết các công việc khó khăn.
Thêm vào bảng kê khai của bạn
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
tools:ignore="MockLocation,ProtectedPermissions" />
Chức năng định vị giả
void setMockLocation() {
LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
locationManager.addTestProvider(LocationManager.GPS_PROVIDER, false, false,
false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);
Location mockLocation = new Location(LocationManager.GPS_PROVIDER);
mockLocation.setLatitude(-33.852); // Sydney
mockLocation.setLongitude(151.211);
mockLocation.setAltitude(10);
mockLocation.setAccuracy(5);
mockLocation.setTime(System.currentTimeMillis());
mockLocation.setElapsedRealtimeNanos(System.nanoTime());
locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, mockLocation);
}
Bạn cũng sẽ cần bật các vị trí giả trong cài đặt nhà phát triển thiết bị của mình. Nếu không có sẵn, hãy đặt "ứng dụng vị trí giả" cho ứng dụng của bạn sau khi việc trên đã được thực hiện.
Ứng dụng GPS giả từ google play đã lừa tôi. Chỉ cần chắc chắn rằng bạn đọc tất cả các hướng trong mô tả ứng dụng. Bạn phải vô hiệu hóa các dịch vụ định vị khác cũng như khởi động ứng dụng của mình sau khi bật "GPS giả". Làm việc tuyệt vời cho những gì tôi cần.
Đây là liên kết đến ứng dụng trên GooglePlay: Fake GPS
Hướng dẫn Google để làm điều này có thể được tìm thấy ở đây, nó cung cấp các ví dụ mã và giải thích quy trình.
http://developer.android.com/training/location/location-testing.html#SendMockLocations
Cài đặt ứng dụng Fake GPS https://play.google.com/store/apps/details?id=com.incorporat Ứng dụng.fakegps.fre & hl = en
Tùy chọn nhà phát triển -> Chọn ứng dụng vị trí giả (Có nghĩa là, Ứng dụng vị trí giả được chọn).
Ứng dụng GPS giả :
Tab đôi trên bản đồ để thêm -> nhấp vào nút phát -> Hiển thị bánh mì nướng "Vị trí giả đã dừng"
cuối cùng kiểm tra với các ứng dụng google map.
Tôi đã viết một Ứng dụng chạy Máy chủ Web (Giống như REST) trên Điện thoại Android của bạn, để bạn có thể đặt vị trí GPS từ xa . Trang web cung cấp Bản đồ mà bạn có thể nhấp để đặt vị trí mới hoặc sử dụng các phím "wasd" để di chuyển theo bất kỳ hướng nào. Ứng dụng này là một giải pháp nhanh chóng nên gần như không có UI cũng như Tài liệu, nhưng việc triển khai rất đơn giản và bạn có thể tra cứu mọi thứ trong (chỉ bốn) lớp.
Kho dự án: https://github.com/juliusmh/RemoteGeoFix
Nếu thiết bị của bạn được cắm vào máy tính và bạn đang cố thay đổi gửi dây GPS qua điều khiển Trình mô phỏng, thiết bị sẽ không hoạt động.
Đây là một điều khiển EMULATOR vì một lý do.
Chỉ cần thiết lập nó để cập nhật cho bạn về thay đổi GPS.
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
ll = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
onGPSLocationChanged(location);
}
public void onStatusChanged(String provider, int status, Bundle extras) {
bigInfo.setText("Changed "+ status);
}
public void onProviderEnabled(String provider) {
bigInfo.setText("Enabled "+ provider);
}
public void onProviderDisabled(String provider) {
bigInfo.setText("Disabled "+ provider);
}
};
Khi GPS được cập nhật, hãy viết lại phương pháp sau để thực hiện những gì bạn muốn;
public void onGPSLocationChanged(Location location){
if(location != null){
double pLong = location.getLongitude();
double pLat = location.getLatitude();
textLat.setText(Double.toString(pLat));
textLong.setText(Double.toString(pLong));
if(autoSave){
saveGPS();
}
}
}
Đừng quên đặt những thứ này trong bảng kê khai
ERIC.ACCESS_FINE_LOCATION
ERIC.ACCESS_MOCK_LOCATION
Tôi tự hỏi nếu bạn cần thiết lập Mock Location phức tạp. Trong trường hợp của tôi khi tôi có một vị trí sửa chữa, tôi đã gọi một hàm để làm một cái gì đó với vị trí mới đó. Trong một bộ đếm thời gian tạo một vị trí giả. Và gọi hàm với vị trí đó thay thế. Biết tất cả cùng một lúc trong một thời gian ngắn GPS sẽ tìm ra một vị trí hiện tại thực sự. Cái nào cũng được. Nếu bạn có thời gian cập nhật được thiết lập đủ dài.
Có thể đó không phải là phương pháp 'lập trình viên', nhưng nếu bạn muốn tiết kiệm thời gian và nhận giải pháp làm việc ngay lập tức, hãy thử một trong những ứng dụng dành riêng cho vị trí giả có sẵn trong Google Play:
Sử dụng trình giả lập vị trí tương tác rất thuận tiện và miễn phí cho điện thoại và máy tính bảng Android (có tên CATLES). Nó giả định vị trí GPS ở cấp độ toàn hệ thống (ngay cả trong các ứng dụng Google Maps hoặc Facebook) và nó hoạt động trên các thiết bị vật lý cũng như ảo:
Trang web: http://ubicom.snet.tu-berlin.de/catles/index.html
Sử dụng quyền này trong tệp kê khai
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">
android studio sẽ khuyến nghị rằng "Chỉ nên yêu cầu vị trí giả trong tệp kê khai dành riêng cho thử nghiệm hoặc gỡ lỗi (thường là src / debug / AndroidManifest.xml)" chỉ cần vô hiệu hóa kiểm tra
Bây giờ, hãy đảm bảo bạn đã kiểm tra " Cho phép vị trí giả " trong cài đặt dành cho nhà phát triển của điện thoại
Sử dụng LocationManager
locationManager.addTestProvider(mocLocationProvider, false, false,
false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);
Bây giờ đặt vị trí bất cứ nơi nào bạn muốn
Location mockLocation = new Location(mocLocationProvider);
mockLocation.setLatitude(lat);
mockLocation.setLongitude(lng);
mockLocation.setAltitude(alt);
mockLocation.setTime(System.currentTimeMillis());
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation);
Các giải pháp trên không phù hợp với tôi vì tôi đã thử nghiệm trên thiết bị Android với phiên bản Dịch vụ Google Play mới nhất sử dụng FuseLocationProviderClient . Sau khi đặt quyền giả định vị trí trong bảng kê khai ứng dụng và ứng dụng làm ứng dụng vị trí giả được chỉ định trong cài đặt của nhà phát triển (như đã đề cập trong các câu trả lời trước), sau đó tôi đã thêm mã Kotlin bên dưới để giả định vị trí thành công.
locationProvider = FusedLocationProviderClient(context)
locationProvider.setMockMode(true)
val loc = Location(providerName)
val mockLocation = Location(providerName) // a string
mockLocation.latitude = latitude // double
mockLocation.longitude = longitude
mockLocation.altitude = loc.altitude
mockLocation.time = System.currentTimeMillis()
mockLocation.accuracy = 1f
mockLocation.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mockLocation.bearingAccuracyDegrees = 0.1f
mockLocation.verticalAccuracyMeters = 0.1f
mockLocation.speedAccuracyMetersPerSecond = 0.01f
}
// locationManager.setTestProviderLocation(providerName, mockLocation)
locationProvider.setMockLocation(mockLocation)