기기의 Android 모의 위치?


147

물리적 장치 (Nexus One)에서 내 위치를 어떻게 조롱 할 수 있습니까? 에뮬레이터 제어판의 에뮬레이터 로이 작업을 수행 할 수 있지만 실제 장치에서는 작동하지 않습니다.


데스크톱 컴퓨터의 경우 이러한 종류의 테스트를 목적으로 GPS 장치 / 직렬 포트 장치를 에뮬레이트하는 드라이버를 생성 / 설치할 수 있습니다. 아마도 안드로이드와 비슷한 것을 만들거나 찾을 수 있습니다.
AaronLS

6
Market에는 GPS 위치를 에뮬레이트 할 수있는 여러 응용 프로그램이 있습니다. 예를 들어 "Location spoofer"입니다.
Vlad

상점에이를 수행하는 많은 앱이 있습니다 .. 이것을 시도해보십시오. play.google.com/store/apps/… 또는 이것 -play.google.com/store/apps/…
Yehuda

1
에뮬레이터와 같이 "geo fix"및 "geo nmea"명령을 지원하는 앱도 상점에 있습니다! play.google.com/store/apps/…
luv

@Iuv 더 위에 오픈 소스입니다 github.com/luv/mockgeofix은
블라드

답변:


166

할 수있는 유일한 방법은 모의 위치 제공자를 사용하는 것입니다.

설정의 개발 패널에서 모의 ​​위치를 ​​활성화하고 추가해야합니다.

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

당신의 매니페스트에.

이제 코드로 들어가서 자신의 모의 위치 제공자를 만들고이 제공자의 위치를 ​​설정할 수 있습니다.


83
시장에 "가짜 GPS"라는 응용 프로그램이 있습니다. 장치에서 Mock Locations를 활성화하면 위치 설정을위한 유용한 GUI가 제공됩니다. 나는 이것이 스스로 할 수있는 솔루션이 아니라 빠른 테스트를위한 가치있는 솔루션이라는 것을 알고 있습니다.
Tim Green

2
이것은 링크, 같은 날짜 및 관련 내용 일 수 있습니다.
Defenestration4

4
@TimGreen 당신은 (댓글이 아닌) 정답이되어야합니다! 가장 쉬운 테스트 방법
Bostone

실제로 "가짜 GPS"응용 프로그램은 위치를 설정하고 무작위로 이동할 수 있기 때문에 가장 좋지 않습니다. 그들의 새로운 버전은 경로를 정할 수 있지만 위치에서 너무 많은 점프를 반복합니다. Janusz의 대답은 실제로 자신의 모의 공급자를 만들어야한다는 것이 맞습니다. 우리는 최근에 그렇게 했으므로 누군가가 필요로 하거나이 질문에 여전히 도움이 필요한 경우 코드를 게시 할 것입니다.
vkinra 2016 년

5
"코드에 들어가서 자신 만의 모의 위치 제공자를 작성하십시오"라는 문구에 대해 자세히 설명해야합니다.
Dims

102

이 랩을 개발 연구소에서만 사용하는 경우 GPS 칩을 납땜하여 다른 장치의 NMEA 시퀀스로 직렬 포트를 직접 공급할 수 있습니다.


68
왜 싫어? 이 답변은 엄청나게 어려운 핵심입니다.
Ben Zotto

61
놀랍게도 쓸모없고 무관하지만 하드 코어.
olivervbk

13
그래도 재미있다.
etienne

23
음, 나는이 답변과 관련이있는 사람이라면 누구나 그들이 할 수 있다는 것을 이미 알고 있습니다. 그 세 사람이 솔루션에 대한 스택 오버 플로우를 검색하는 것을 의심합니다.
ToolmakerSteve

10
납땜되지 않은 장치에 현실적인 NMEA 시퀀스를 생성하는 방법을 알아내는 데 어려움이 있다면 멋진 외부 옵션을 사용하십시오. 실제 외부 GPS 장치를 납땜하고 전체 개발 실험실을 실제 트랙에서 러너 / 바이커 팀 / 시뮬레이션하려는 속도에 따라 자동차 / 비행기 / 무엇이든 장치가 위성으로부터 무선 신호를 수신 할 수 있도록 개발 실험실의 지붕에 구멍을 여는 것을 잊지 마십시오. 천만에요. ;-)
Stéphane Gourichon

32

케이블이 편리했으면 좋겠다. 에뮬레이터에 텔넷하여 위치를 변경할 수 있다는 것을 알고 있습니다.

$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK

장치에 텔넷을 사용할 수 있는지 기억할 수 없지만 할 수 있다고 생각합니다. 이게 도움이 되길 바란다.

이를 위해 adb (Android 디버깅 브리지)가 필요합니다 (CLI).


장치의 콘솔에 명령으로 보내는 모든 것에 대한 권한이 거부됩니다. 아마도 터미널 응용 프로그램으로 가능할 수도 있지만 루트 액세스가 필요하다고 생각합니다.
Janusz

우리는 같은 페이지에 있습니다. "adb shell"에 대해 이야기하고 있지 않습니까? 내가 말하는 것은 다릅니다. 이것은 안드로이드 특정 매개 변수를 설정할 수있는 설정입니다. 예를 들어 루트 액세스없이 포트 전달 (예 : localhost : 1234는 phone : 1234로 이동)을 설정할 수 있으므로 루트가없는 케이블을 통해 SOCKS 프록시 및 터널을 설정할 수 있습니다.
Tim Green

adb forward tcp : 6000 tcp : 23을 사용하여 컴퓨터의 포트 6000을 장치의 포트 23으로 앞당길 수 있지만 포트가 열린 것으로 표시되어 있어도 연결할 수 없었습니다. 장치에서 텔넷 클라이언트를 사용하고 localhost에 연결하는 것도 실패합니다
Janusz

15
에뮬레이터에서는 제대로 작동하지만 실제 장치에서는 작동하지 않습니다. 그래서 그것은 OP의 질문에 전혀 대답하지 않습니다 :(
Matthew Gilliard

4
@TimGreen 솔루션은 에뮬레이터 전용입니다. 문제는 실제 장치에 관한 것이었다.
IgorGanapolsky

29

위치 서비스 권한을 사용하여 위치를 조롱 할 수 있습니다.

"android.permission.ACCESS_MOCK_LOCATION"

그런 다음 자바 코드에서

// 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
mocLocationProvider의 가치는 무엇입니까?
Victor

예 : LocationManager.GPS_PROVIDER
enigma969

25

다음 코드로 성공했습니다. 비록 어떤 이유로 든 다른 잠금 장치를 시도했지만 (다른 LatLng 쌍을 시도한 경우에도) 그것은 나를 위해 일했습니다. mLocationManager는에 LocationManager연결되어 있습니다 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
좋은 게시물, 추가 내용은 아래 답변을 참조하십시오.
icyerasor 2018 년

내가 기억하는 한, setTestProviderStatus여기에서는 GPS 제공 업체가 "지금"수정 사항을 발견하여 해당 이벤트의 처리가 발생할 수 있음을 LocationManager와 함께 이벤트에 알리거나 게시 / 예약하는 데 사용됩니다.
Dr1Ku

" mLocationManagerLocationManagerLocationListener에 연결되어있는 것 "의 의미는 무엇입니까 ? 어떻게해야합니까?
Yehuda

다음은 LocationManager서비스를 사용하여 위치 변경을 확인하는 방법 과 blog.doityourselfandroid.com/2010/12/25/… 를 설명하는 기사입니다 LocationListener.
Dr1Ku

2
플러스 메소드 addTestProvider에서 당신이 참 (들) 표현 방식과 거짓 (들)에 대한 1
A.Alqadomi

16

Dr1Ku가 게시 한 내용이 작동합니다. 오늘 코드를 사용했지만 더 많은 위치를 추가해야했습니다. 개선 된 사항은 다음과 같습니다.

선택 사항 : LocationManager.GPS_PROVIDER 문자열을 사용하는 대신 고유 한 변수 PROVIDER_NAME을 정의하여 사용할 수 있습니다. 위치 업데이트를 등록 할 때 직접 문자열로 지정하는 대신 기준을 통해 공급자를 선택하십시오.

첫 번째 : removeTestProvider를 호출하는 대신 먼저 제거 할 공급자가 있는지 확인합니다 (IllegalArgumentException을 피하기 위해).

if (mLocationManager.getProvider(PROVIDER_NAME) != null) {
  mLocationManager.removeTestProvider(PROVIDER_NAME);
}

둘째 : 둘 이상의 위치를 ​​게시하려면 위치의 시간을 설정해야합니다.

newLocation.setTime(System.currentTimeMillis());
...
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);

또한 구글 테스트가 될 것 같다 용도의 MockLocationProviders이 : http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java

또 다른 좋은 예제는 http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ 에서 찾을 수 있습니다.

또 다른 좋은 기사는 다음과 같습니다. http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1358 또한 실제로 작동하는 코드도 있습니다 에뮬레이터에서.


자신의 공급자를 정의하는 것에 대한 멋진 제안은 GPS_PROVIDER를 사용하여 재부팅 할 때까지 모의 공급자를 제거 할 수 없다는 것입니다 (더 정확하게는 정상적인 GPS로 전환 할 수 없음). 멋진 게시물도 참고 문헌을 확인하겠습니다!
Dr1Ku

@ Dr1KU 그래도 일반 GPS로 다시 전환 할 수 없습니까? 어딘가에 지정되어 있습니까?
Kaz Dragon

@KazDragon 당시의 경우였습니다. 내가 기억할 수있는 것에서, 전원을 켠 후에 Mock Provider정상적인 GPS가 작동하지 않고 문제를 해결할 수 없었습니다 (기기에서 직접 테스트 중이었습니다). 그 이후로 Android에서 많은 일이 발생했기 때문에 그렇지 않을 수 있습니다.
Dr1Ku

@ Dr1Ku 아, 글쎄, 나는 지금 매우 비슷한 일을하고 있으며 당신이 묘사 한 것과 비슷한 결과를 얻고 있습니다. 나는 이것이 플랫폼에 내장 된 제한인지 또는 어딘가에서 함수 호출이 누락되었는지 알고 싶었습니다. 아마 이것으로부터 질문을해야 할 것입니다.
Kaz Dragon

9

Android 마켓에서 기기의 "Mock GPS 위치"를 지정할 수있는 앱이 있습니다.

https://market.android.com을 검색 하여 "My Fake Location"이라는 앱을 찾았습니다.

위에서 언급 한 Mock GPS Provider ( http://www.cowlumbus.nl/forum/MockGpsProvider.zip )는 소스 코드를 포함하는 또 다른 예입니다. 제공된 APK를 설치할 수는 없지만 (실패라고 말합니다. [INSTALL_FAILED_OLDER_SDK]이며 다시 컴파일해야 할 수도 있습니다)

GPS 모의 위치를 ​​사용하려면 장치 설정에서 GPS 모의 위치를 ​​활성화해야합니다. 설정-> 응용 프로그램-> 개발로 이동하여 "모의 위치 허용"을 확인하십시오.

그런 다음 위에서 설명한 것과 같은 앱을 사용하여 GPS 좌표를 설정하면 Google지도와 다른 앱이 지정한 모의 GPS 위치를 사용합니다.


가짜 GPS가 더 간단합니다. 앱 승인에서 발신자 ID를 요청하는 이유가 궁금합니다. : S
Guillaume Massé

8

이것은 나를 위해 일했습니다 (Android Studio).

휴대 전화에서 GPS 및 WiFi 추적을 사용 중지합니다. Android 5.1.1 이하에서는 개발자 옵션에서 "모의 위치 사용"을 선택하십시오.

src / debug 디렉토리에 매니페스트 사본을 만드십시오. "application"태그 외부에 다음을 추가하십시오.

uses-permission android : name = "android.permission.ACCESS_MOCK_LOCATION"

"map"이라는 맵 조각을 설정하십시오. 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);
    }
};

"setElapsedRealtimeNanos"메소드를 사용하려면 모듈 gradle 파일에서 "minSdkVersion"을 일시적으로 17로 늘려야 할 수도 있습니다.

기본 활동 클래스에 다음 코드를 포함하십시오.

private class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        // do whatever you want, scroll the map, etc.
    }
}

AS로 앱을 실행하십시오. Android 6.0 이상에서는 보안 예외가 발생합니다. 설정에서 개발자 옵션으로 이동하여 "모의 위치 앱 선택"을 선택하십시오. 목록에서 앱을 선택하십시오.

이제지도를 탭하면 탭의 좌표로 onLocationChanged ()가 실행됩니다.

나는 방금 이것을 알아 냈으므로 이제는 손에 전화로 이웃을 밟을 필요가 없습니다.


이 코드를 서비스에 넣으면 안드로이드 6에서 작동한다고 생각합니다
Hamza

7

초기 위치에서 움직이는 위치를 시뮬레이션하는 간단한 처리기를 만들었습니다.

연결 콜백에서 시작하십시오.

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

    }
};

핸들러 클래스 :

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

도움이 되길 바랍니다 ..


6

icyerasor가 언급하고 Pedro가 http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ 에서 제공 한 솔루션 은 저에게 매우 효과적이었습니다. 그러나 모의 GPS 제공 업체를 올바르게 시작, 중지 및 다시 시작하는 기능은 지원하지 않습니다.

그의 코드를 약간 변경하고 클래스를 Thread 대신 AsyncTask로 다시 작성했습니다. 이를 통해 UI 스레드와 통신 할 수 있으므로 중단했을 때 제공자를 다시 시작할 수 있습니다. 화면 방향이 바뀔 때 편리합니다.

Eclipse 용 샘플 프로젝트와 함께 코드는 GitHub에서 찾을 수 있습니다 : https://github.com/paulhoux/Android-MockProviderGPS

모든 노력을 기울인 모든 크레딧은 Pedro에게 가야합니다.


6

매니페스트에 추가

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
    tools:ignore="MockLocation,ProtectedPermissions" />

모의 위치 기능

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

또한 장치 개발자 설정에서 모의 ​​위치를 ​​활성화해야합니다. 만약 이것이 가능하지 않다면, 위의 구현 후에 "모의 위치 애플리케이션"을 당신의 애플리케이션으로 설정하십시오.


3

구글 플레이에서 가짜 GPS 앱이 나를 위해 트릭을했습니다. 앱 설명의 모든 지시 사항을 읽으십시오. "가짜 GPS"를 활성화 한 후 다른 위치 서비스를 비활성화하고 앱을 시작해야합니다. 내가 필요한 것을 위해 훌륭하게 일했습니다.

GooglePlay의 앱에 대한 링크는 다음과 같습니다. 가짜 GPS




2

Android 전화에서 WebServer (REST-Like)를 실행하는 앱을 작성 했으므로 GPS 위치를 원격으로 설정할 수 있습니다 . 웹 사이트는 클릭하여 새 위치를 설정하거나 "wasd"키를 사용하여 원하는 방향으로 이동할 수있는지도를 제공합니다. 이 앱은 빠른 솔루션이므로 UI ​​나 설명서가 거의 없지만 구현은 간단하며 (단 4 개) 클래스에서 모든 것을 찾을 수 있습니다.

프로젝트 저장소 : https://github.com/juliusmh/RemoteGeoFix


1

장치가 컴퓨터에 연결되어 있고 에뮬레이터 컨트롤을 통해 GPS 코드를 보내려고하면 작동하지 않습니다.
이것은 이유로 EMULATOR 컨트롤입니다.
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);
        }
      };

GPS가 업데이트되면 원하는 방법으로 다음 방법을 다시 작성하십시오.

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

이것을 매니페스트
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION 에 넣는 것을 잊지 마십시오 .


0

정교한 Mock Location 설정이 필요한지 궁금합니다. 제 경우에는 수정 위치를 얻은 후에 새 위치로 무언가를 수행하는 함수를 호출했습니다. 타이머에서 모의 ​​위치를 ​​만듭니다. 대신 해당 위치에서 함수를 호출하십시오. GPS가 실제 현재 위치를 찾는 동안 짧은 시간 안에 모든 것을 알면. 어느 것이 좋습니다. 업데이트 시간을 충분히 길게 설정 한 경우


0

아마도 '프로그래머'접근 방법은 아니지만 시간을 절약하고 효과적인 솔루션을 얻으려면 Google Play에서 사용할 수있는 모의 위치 전용 앱 중 하나를 사용해보십시오.

가짜 GPS 위치 Spoofer

모의 위치

가짜 GPS 위치


1
당신은 그들을 시도 했습니까? 질문에서 요청한대로 작동 했습니까?
arekolek

어떤 선호? 아니면 그들 모두가 필요합니까? : P
arekolek

가짜 GPS 위치 Spoofer는 충분하지만 Mock Locations는 멋진 기능인 경로를 설정할 수 있습니다.
klimat


0

매니페스트 파일에서이 권한을 사용하십시오.

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">

안드로이드 것을 권장합니다 스튜디오 "모의 위치는 테스트 또는 디버그 특정 매니페스트 파일에 요청해야한다 (일반적으로 SRC / 디버그 /의 AndroidManifest.xml)"바로 검사를 비활성화

이제 휴대 전화 개발자 설정에서 " 모의 위치 허용 "을 확인했는지 확인하십시오.

LocationManager 사용

locationManager.addTestProvider(mocLocationProvider, false, false,
                false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);

이제 원하는 위치를 설정하십시오

Location mockLocation = new Location(mocLocationProvider); 
mockLocation.setLatitude(lat); 
mockLocation.setLongitude(lng); 
mockLocation.setAltitude(alt); 
mockLocation.setTime(System.currentTimeMillis()); 
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation); 

0

FusedLocationProviderClient 를 사용하는 최신 Google Play 서비스 버전으로 Android 기기에서 테스트했기 때문에 위의 솔루션이 효과가 없었 습니다 . 앱 매니페스트 및 앱 설정에서 모의 ​​위치 권한을 개발자 설정에서 지정된 모의 위치 앱으로 설정 한 후 (이전 답변에서 언급했듯이) 아래에 Kotlin 코드를 추가하여 위치를 성공적으로 조롱했습니다.

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.