기기에서 Android 위치 정보를 찾았습니까?


Answers

개발 랩에서만이 전화기를 사용하면 GPS 칩을 납땜하고 직렬 포트에 다른 장치의 NMEA 시퀀스를 직접 입력 할 수 있습니다.

Question

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




정교한 모의 장소 설정이 필요한지 궁금합니다. 필자의 경우 일단 수정 된 위치를 얻었 으면 새로운 위치에서 작업을 수행하는 함수를 호출했습니다. 타이머에서 모의 ​​위치를 ​​만듭니다. 그리고 대신 그 위치로 함수를 호출하십시오. 짧은 시간 안에 GPS를 통해 실제 위치를 알 수 있습니다. 어느 것이 좋습니다. 업데이트 시간을 충분히 길게 설정 한 경우







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

연결 콜백에서 시작 :

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

희망이 도움이 될 수 ..




매니페스트 파일에서이 권한 사용

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

android studio는 "모의 위치는 테스트 또는 디버그 관련 매니페스트 파일 (일반적으로 src / debug / 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);







Dr1Ku가 게시 한 작품. 오늘 코드를 사용했지만 loc을 더 추가해야했습니다. 여기에 몇 가지 개선 사항이 있습니다.

선택 사항 : 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를 사용하는 Google 테스트 인 것 같습니다. 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 입니다. 실제로 작동하는 코드도 있습니다. 에뮬레이터에서 나.




해결책은 http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ 에서 Pedro가 제공 한 icyerasor에서 언급 한 솔루션으로 나에게 매우 효과적이었습니다. 그러나 모의 GPS 제공 업체의 시작, 중지 및 재시작에 대한 지원은 제공하지 않습니다.

나는 코드를 조금 바꿨으며 클래스 대신 스레드 대신 AsyncTask로 다시 작성했다. 이를 통해 우리는 UI 스레드와 통신 할 수 있으므로 우리가 중단 한 지점에서 공급자를 다시 시작할 수 있습니다. 이것은 화면 방향이 변경 될 때 유용합니다.

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

모든 신용은 Pedro에게 대부분의 노력을 기울여야합니다.




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

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