물리적 장치 (Nexus One)에서 내 위치를 어떻게 조롱 할 수 있습니까? 에뮬레이터 제어판의 에뮬레이터 로이 작업을 수행 할 수 있지만 실제 장치에서는 작동하지 않습니다.
물리적 장치 (Nexus One)에서 내 위치를 어떻게 조롱 할 수 있습니까? 에뮬레이터 제어판의 에뮬레이터 로이 작업을 수행 할 수 있지만 실제 장치에서는 작동하지 않습니다.
답변:
할 수있는 유일한 방법은 모의 위치 제공자를 사용하는 것입니다.
설정의 개발 패널에서 모의 위치를 활성화하고 추가해야합니다.
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
당신의 매니페스트에.
이제 코드로 들어가서 자신의 모의 위치 제공자를 만들고이 제공자의 위치를 설정할 수 있습니다.
이 랩을 개발 연구소에서만 사용하는 경우 GPS 칩을 납땜하여 다른 장치의 NMEA 시퀀스로 직렬 포트를 직접 공급할 수 있습니다.
케이블이 편리했으면 좋겠다. 에뮬레이터에 텔넷하여 위치를 변경할 수 있다는 것을 알고 있습니다.
$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK
장치에 텔넷을 사용할 수 있는지 기억할 수 없지만 할 수 있다고 생각합니다. 이게 도움이 되길 바란다.
이를 위해 adb (Android 디버깅 브리지)가 필요합니다 (CLI).
위치 서비스 권한을 사용하여 위치를 조롱 할 수 있습니다.
"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);
다음 코드로 성공했습니다. 비록 어떤 이유로 든 다른 잠금 장치를 시도했지만 (다른 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
);
}
setTestProviderStatus
여기에서는 GPS 제공 업체가 "지금"수정 사항을 발견하여 해당 이벤트의 처리가 발생할 수 있음을 LocationManager와 함께 이벤트에 알리거나 게시 / 예약하는 데 사용됩니다.
mLocationManager
는 LocationManager
LocationListener에 연결되어있는 것 "의 의미는 무엇입니까 ? 어떻게해야합니까?
LocationManager
서비스를 사용하여 위치 변경을 확인하는 방법 과 blog.doityourselfandroid.com/2010/12/25/… 를 설명하는 기사입니다 LocationListener
.
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 또한 실제로 작동하는 코드도 있습니다 에뮬레이터에서.
Mock Provider
정상적인 GPS가 작동하지 않고 문제를 해결할 수 없었습니다 (기기에서 직접 테스트 중이었습니다). 그 이후로 Android에서 많은 일이 발생했기 때문에 그렇지 않을 수 있습니다.
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 위치를 사용합니다.
이것은 나를 위해 일했습니다 (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 ()가 실행됩니다.
나는 방금 이것을 알아 냈으므로 이제는 손에 전화로 이웃을 밟을 필요가 없습니다.
초기 위치에서 움직이는 위치를 시뮬레이션하는 간단한 처리기를 만들었습니다.
연결 콜백에서 시작하십시오.
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;
}
}
}
도움이 되길 바랍니다 ..
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에게 가야합니다.
매니페스트에 추가
<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);
}
또한 장치 개발자 설정에서 모의 위치를 활성화해야합니다. 만약 이것이 가능하지 않다면, 위의 구현 후에 "모의 위치 애플리케이션"을 당신의 애플리케이션으로 설정하십시오.
이를위한 Google 튜토리얼은 여기에서 찾을 수 있으며 코드 예제와 프로세스를 설명합니다.
http://developer.android.com/training/location/location-testing.html#SendMockLocations
가짜 GPS 앱 설치 https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=ko
개발자 옵션-> 모의 위치 앱 선택 (즉, 가짜 위치 앱이 선택됨).
가짜 GPS 앱 :
추가 할 맵의 이중 탭-> 재생 버튼 클릭-> 토스트 표시 "가짜 위치가 중지되었습니다"
마지막으로 구글 맵 앱으로 확인하십시오.
Android 전화에서 WebServer (REST-Like)를 실행하는 앱을 작성 했으므로 GPS 위치를 원격으로 설정할 수 있습니다 . 웹 사이트는 클릭하여 새 위치를 설정하거나 "wasd"키를 사용하여 원하는 방향으로 이동할 수있는지도를 제공합니다. 이 앱은 빠른 솔루션이므로 UI 나 설명서가 거의 없지만 구현은 간단하며 (단 4 개) 클래스에서 모든 것을 찾을 수 있습니다.
프로젝트 저장소 : https://github.com/juliusmh/RemoteGeoFix
장치가 컴퓨터에 연결되어 있고 에뮬레이터 컨트롤을 통해 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 에 넣는 것을 잊지 마십시오 .
CATLES라는 Android 휴대 전화 및 태블릿을위한 매우 편리하고 무료의 대화식 위치 시뮬레이터를 사용하십시오. 시스템 전체 수준 (Google지도 또는 Facebook 앱 내에서도)에서 GPS 위치를 조롱하며 실제 및 가상 장치에서 작동합니다.
매니페스트 파일에서이 권한을 사용하십시오.
<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);
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)