Vị trí giả Android trên thiết bị?


147

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ý.


Đối với máy tính để bàn, bạn có thể tạo / cài đặt trình điều khiển mô phỏng thiết bị GPS / thiết bị cổng nối tiếp cho mục đích thực hiện loại thử nghiệm này. Có lẽ bạn có thể tạo hoặc tìm một cái gì đó tương tự cho Android.
AaronLS

6
Có một số ứng dụng trong Market có thể mô phỏng vị trí GPS. Ví dụ: "Vị trí loa siêu trầm".
Vlad

Có rất nhiều ứng dụng trong cửa hàng thực hiện điều này .. Bạn có thể dùng thử ứng dụng này - play.google.com/store/apps/iêu hoặc này - play.google.com/store/apps/ trộm
Yehuda

1
Ngoài ra còn có một ứng dụng trong cửa hàng hỗ trợ các lệnh "sửa lỗi địa lý" và "địa lý bước sóng" giống như trình giả lập! play.google.com/store/apps/ Kẻ
luv

@Iuv hơn nó là mã nguồn mở github.com/luv/mockgeofix
Vlad

Câu trả lời:


166

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.


83
Có một ứng dụng trên thị trường gọi là "Fake GPS". Nếu bạn bật Vị trí mô phỏng trên thiết bị của mình, nó sẽ cung cấp GUI đẹp để đặt vị trí của bạn. Tôi nhận ra đây không phải là giải pháp tự làm, nhưng chắc chắn là một giải pháp xứng đáng để thử nghiệm nhanh.
Tim Green

2
đây có thể là liên kết - cùng ngày và nội dung có liên quan.
DefenestrationDay

4
@TimGreen của bạn nên là câu trả lời được chấp nhận (không chỉ là một nhận xét)! Cho đến nay, cách dễ nhất để kiểm tra
Bostone

Trên thực tế, ứng dụng "fake gps" không phải là tốt nhất vì nó chỉ có thể đặt vị trí và di chuyển ngẫu nhiên xung quanh. Phiên bản mới của họ có thể định tuyến nhưng nó chỉ lặp đi lặp lại qua các điểm để nhảy rất lớn vào vị trí. Câu trả lời của Janusz thực sự chính xác rằng bạn cần phải tạo nhà cung cấp giả của riêng mình. Gần đây chúng tôi đã làm điều đó và nếu bất cứ ai cần nó hoặc nếu câu hỏi này vẫn cần trợ giúp, tôi sẽ đăng mã.
vkinra

5
Câu lệnh "đi vào mã của bạn và tạo nhà cung cấp vị trí giả của riêng bạn" cần được giải thích chi tiết hơn.
dims

102

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.


68
Tại sao lại ghét? Câu trả lời này là cốt lõi cực kỳ khó khăn.
Ben Zotto

61
Mặc dù rất khó tính nhưng cũng vô dụng / không liên quan.
olivervbk

13
Đủ vui, mặc dù.
etienne

23
Ừm, tôi nghĩ bất cứ ai mà câu trả lời này sẽ có liên quan, đã biết họ có thể làm điều này. Tôi nghi ngờ ba người đó đang tìm kiếm stackoverflow để tìm giải pháp.
ToolmakerSteve

10
Nếu bạn gặp khó khăn trong việc tìm ra cách tạo các chuỗi NMEA thực tế vào thiết bị chưa được bán của mình, có một lựa chọn tuyệt vời: hàn một thiết bị GPS bên ngoài thực tế và di chuyển toàn bộ phòng thí nghiệm phát triển trên đường đua thực tế, trên đầu một nhóm người chạy / đi xe đạp / ô tô / máy bay / bất cứ điều gì tùy thuộc vào tốc độ bạn muốn mô phỏng. Đừng quên mở một lỗ trên nóc phòng thí nghiệm phát triển để thiết bị có thể nhận tín hiệu vô tuyến từ các vệ tinh. Không có gì. ;-)
Stéphane Gourichon

32

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 nhận được quyền từ chối mọi thứ bạn gửi dưới dạng lệnh tới bảng điều khiển của thiết bị. Có thể là có thể với một ứng dụng đầu cuối nhưng tôi nghĩ rằng nó yêu cầu quyền truy cập root
Janusz

Vì vậy, chúng ta đang ở trên cùng một trang: bạn không nói về "vỏ adb" phải không? Những gì tôi đang nói là khác nhau, đây là một thiết lập cho phép bạn thiết lập các tham số dành riêng cho Android. Tôi biết, ví dụ, bạn có thể thiết lập chuyển tiếp cổng (tức là localhost: 1234 sang điện thoại: 1234) mà không cần truy cập root, vì vậy bạn có thể thiết lập proxy SOCKS và đường hầm thông qua root w / o root.
Tim Green

Bạn có thể sử dụng adb Forward tcp: 6000 tcp: 23 để chuyển tiếp cổng 6000 trên máy của bạn sang cổng 23 trên thiết bị nhưng tôi không thể kết nối ngay cả khi cổng được hiển thị là mở. Sử dụng máy khách telnet trên thiết bị và kết nối với localhost cũng không thành công
Janusz

15
Điều này hoạt động tốt cho trình giả lập nhưng không hoạt động cho một thiết bị thực tế. Vì vậy, nó hoàn toàn không trả lời câu hỏi của OP :(
Matthew Gilliard

4
@TimGreen Giải pháp của bạn chỉ dành cho trình giả lập. Câu hỏi là về thiết bị thực.
IgorGanapolsky

29

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);

9
Giá trị của mocLocationProvider là gì?
Victor

ví dụ: LocationManager.GPS_PROVIDER
enigma969

25

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. mLocationManagerlà một LocationManagercá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
    );      
}

1
Bài đăng đẹp, xem câu trả lời của tôi dưới đây để bổ sung.
băng giá

Theo tôi nhớ, 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.
Dr1Ku

Ý nghĩa của " mLocationManagerlà một LocationManagercá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 ..
Yehuda

Dưới đây là một bài viết giải thích cách kiểm tra thay đổi vị trí bằng cách sử dụng LocationManagerdịch vụ và LocationListener: blog.doityourselfandroid.com/2010/12/25/ợi
Dr1Ku

2
cộng 1 cho cách bạn thể hiện (các) đúng và sai trong phương thức addTestProvider
A.Alqadomi

16

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.


Gợi ý thú vị về việc xác định Nhà cung cấp của riêng bạn, điều cần sử dụng GPS_PROVIDER là bạn (dường như) không thể thoát khỏi nhà cung cấp giả (chính xác hơn là bạn không thể chuyển sang GPS bình thường) cho đến khi khởi động lại. Bài đăng tuyệt vời là tốt, tôi sẽ kiểm tra các tài liệu tham khảo!
Dr1Ku

@ Dr1KU Vẫn là trường hợp bạn không thể chuyển về GPS bình thường? Được chỉ định ở đâu đó?
Kaz Dragon

@KazDragon Đó là trường hợp trước đó. Từ những gì tôi có thể nhớ lại, sau khi bật 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ừ đó.
Dr1Ku

@ Dr1Ku Ah, tốt, tôi đang làm một cái gì đó rất giống bây giờ và nhận được kết quả tương tự như những gì bạn mô tả. Tôi đã hy vọng biết liệu đây là một hạn chế được xây dựng trong nền tảng hay tôi chỉ thiếu một cuộc gọi chức năng ở đâu đó. Tôi có lẽ nên làm cho một câu hỏi về điều này.
Kaz Dragon

9

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.


GPS giả đơn giản hơn. Tôi chỉ tự hỏi tại sao họ lại yêu cầu id người gọi trong quyền ứng dụng: S
Guillaume Massé

8

Đ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 nghĩ rằng nó hoạt động trên Android 6 nếu bạn đặt mã này vào dịch vụ
Hamza

7

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 ..


6

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.


6

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.


3

Ứ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



2

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.


2

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


1

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


0

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.


0

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:

Giả mạo vị trí GPS

Địa điểm giả

Vị trí GPS giả


1
Bạn đã thử chúng? Họ đã làm việc theo yêu cầu trong câu hỏi?
arekolek

Có ưu tiên nào không? Hay người ta cần tất cả chúng? : P
arekolek

Giả mạo vị trí GPS giả là đủ tốt, nhưng Mock Locations cho phép đặt tuyến đường là một tính năng hay.
klimat


0

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); 

0

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)
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.