Konumumu fiziksel bir cihazda (Nexus One) nasıl alay edebilirim? Bunu Emulator Kontrol panelindeki emülatörle yapabileceğinizi biliyorum, ancak bu fiziksel bir cihaz için çalışmıyor.
Konumumu fiziksel bir cihazda (Nexus One) nasıl alay edebilirim? Bunu Emulator Kontrol panelindeki emülatörle yapabileceğinizi biliyorum, ancak bu fiziksel bir cihaz için çalışmıyor.
Yanıtlar:
Yapmanın tek yolu sahte bir konum sağlayıcı kullanmaktır.
Sahte konumların ayarlarınızdaki geliştirme panelinde etkinleştirilmesi ve
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
manifestinize.
Artık kodunuza girebilir ve kendi sahte konum sağlayıcınızı oluşturabilir ve bu sağlayıcının konumunu ayarlayabilirsiniz.
Bu telefonu sadece geliştirme laboratuvarında kullanırsanız, GPS yongasını lehimleme ve seri bağlantı noktasını doğrudan diğer cihazlardan NMEA dizileriyle besleme şansınız vardır.
Keşke kablom kullanışlı olsaydı. Konumunu değiştirmek için emülatöre telnet yapabileceğinizi biliyorum
$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK
Cihazınıza telnet yapıp yapamayacağınızı hatırlayamıyorum, ancak yapabileceğinizi düşünüyorum. Umarım bu yardımcı olur.
Bunun için adb'ye (android hata ayıklama köprüsü) ihtiyacınız olacak (CLI).
Konumu taklit etmek için Konum Hizmetleri iznini kullanabilirsiniz ...
"android.permission.ACCESS_MOCK_LOCATION"
ve sonra java kodunuzda,
// 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);
Aşağıdaki kod ile başarılı oldum. Bir nedenden dolayı bana tek bir kilit olsa da (farklı LatLng çiftlerini denesem bile), benim için çalıştı. mLocationManager
aşağıdakilere bağlı LocationManager
olan bir 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
burada, GPS sağlayıcısının bir söz konusu olayın işlenebilmesi için bir "şimdi" düzeltmesi bulduğu bir olayı LocationManager'a bildirmek / göndermek / planlamak için kullanılır.
mLocationManager
bağlı bir LocationManager
olan" nedir? bunu nasıl yapabilirim? Thank you ..
LocationManager
Hizmeti ve bir konum değişikliğini nasıl kontrol edeceğinizi açıklayan bir makale ve a LocationListener
: blog.doityourselfandroid.com/2010/12/25/…
Dr1Ku ne yayınladı çalışır. Kodu bugün kullandı, ancak daha fazla yer eklemek gerekiyordu. İşte bazı iyileştirmeler:
İsteğe bağlı: LocationManager.GPS_PROVIDER Dizesini kullanmak yerine, kendi constat PROVIDER_NAME öğenizi tanımlayıp kullanmak isteyebilirsiniz. Konum güncellemelerine kaydolurken, doğrudan bir dize olarak belirtmek yerine ölçütleri kullanarak bir sağlayıcı seçin.
İlk olarak: removeTestProvider'ı çağırmak yerine, kaldırılacak bir sağlayıcı olup olmadığını kontrol edin (IllegalArgumentException öğesinden kaçınmak için):
if (mLocationManager.getProvider(PROVIDER_NAME) != null) {
mLocationManager.removeTestProvider(PROVIDER_NAME);
}
İkinci olarak: Birden fazla konum yayınlamak için konumun zamanını ayarlamanız gerekir:
newLocation.setTime(System.currentTimeMillis());
...
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);
Ayrıca MockLocationProviders kullanan bir Google Testi var gibi görünüyor: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java
Başka bir iyi çalışma örneği şu adreste bulunabilir: http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/
Başka bir iyi makale: http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1358 Ayrıca gerçekten işe yarayan bazı kodlar da bulacaksınız beni emülatörde.
Mock Provider
normal GPS çalışmaz, bir düzeltme alamadım (doğrudan bir cihazda test ediyordum). O zamandan beri Android'de çok şey olduğu için durum böyle olmayabilir.
Android Market'te, cihazınız için bir "Sahte GPS Konumu" belirtmenize olanak tanıyan uygulamalar vardır.
Https: //market.android.com'u aradım ve benim için çalışan "Sahte Konumum" adlı bir uygulama buldum.
Yukarıda Paul tarafından belirtilen Mock GPS Sağlayıcısı ( http://www.cowlumbus.nl/forum/MockGpsProvider.zip adresinde ), sağlanan APK'yı yükleyememiş olmama rağmen kaynak kodunu içeren başka bir örnektir. [INSTALL_FAILED_OLDER_SDK] ve yeniden derlemeniz gerekebilir)
GPS sahte konumlarını kullanmak için, cihaz ayarlarında etkinleştirmeniz gerekir. Ayarlar -> Uygulamalar -> Geliştirme'ye gidin ve "Sahte konumlara izin ver" i işaretleyin
Daha sonra GPS koordinatlarını ayarlamak için yukarıda açıklananlar gibi bir uygulama kullanabilirsiniz; Google haritaları ve diğer uygulamalar belirttiğiniz sahte GPS konumunu kullanır.
Bu benim için çalıştı (Android Studio):
Telefonda GPS ve WiFi izlemeyi devre dışı bırakın. Android 5.1.1 ve önceki sürümlerde, Geliştirici Seçeneklerinde "sahte konumları etkinleştir" i seçin.
Bildiriminizin bir kopyasını src / debug dizininde oluşturun. Aşağıdakini ekleyin ("uygulama" etiketinin dışında):
android kullanır: name = "android.permission.ACCESS_MOCK_LOCATION"
Bir harita oluşturun "map" adlı bir parça oluşturun. OnCreate () öğesine aşağıdaki kodu ekleyin:
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" yöntemini kullanmak için modül not dosyanızdaki "minSdkVersion" ı geçici olarak 17'ye yükseltmeniz gerekebileceğini unutmayın.
Ana etkinlik sınıfına aşağıdaki kodu ekleyin:
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
// do whatever you want, scroll the map, etc.
}
}
Uygulamanızı AS ile çalıştırın. Android 6.0 ve sonraki sürümlerde bir güvenlik istisnası alırsınız. Şimdi Ayarlar'daki Geliştirici Seçenekleri'ne gidin ve "Sahte konum uygulamasını seçin" i seçin. Listeden uygulamanızı seçin.
Şimdi haritaya dokunduğunuzda, onLocationChanged () dokunuşunuzun koordinatları ile tetiklenecektir.
Ben sadece anladım bu yüzden şimdi el telefonları ile mahalle etrafında ezmek zorunda değilim.
Başlangıç konumundan hareket eden bir konumu simüle eden basit bir Handler oluşturdum.
Bağlantı geri aramanızda başlatı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) {
}
};
Handler sınıfı:
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;
}
}
}
Umarım yardımcı olabilir ..
Iicyerasor tarafından bahsedilen ve Pedro tarafından http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ adresinde sağlanan çözüm benim için çok iyi çalıştı. Ancak, sahte GPS sağlayıcısını düzgün bir şekilde başlatmak, durdurmak ve yeniden başlatmak için destek sunmaz.
Kodunu biraz değiştirdim ve sınıfı bir iş parçacığı yerine AsyncTask olarak yeniden yazdım. Bu, UI İş Parçacığı ile iletişim kurmamızı sağlar, böylece sağlayıcıyı durduğumuzda olduğumuz noktada yeniden başlatabiliriz. Bu, ekran yönü değiştiğinde kullanışlıdır.
Kod, Eclipse için örnek bir proje ile birlikte GitHub'da bulunabilir: https://github.com/paulhoux/Android-MockProviderGPS
Tüm krediler, zor işlerin çoğunu yapmak için Pedro'ya gitmelidir.
Manifestinize ekleyin
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
tools:ignore="MockLocation,ProtectedPermissions" />
Sahte konum işlevi
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);
}
Ayrıca, cihaz geliştirici ayarlarınızda sahte yerleri etkinleştirmeniz gerekir. Bu mevcut değilse, yukarıdaki uygulamalar uygulandıktan sonra "sahte konum uygulaması" nı uygulamanıza ayarlayın.
Google oyundan sahte GPS uygulaması benim için hile yaptı. Sadece uygulama açıklamasındaki tüm talimatları okuduğunuzdan emin olun. "Sahte GPS" özelliğini etkinleştirdikten sonra diğer konum hizmetlerini devre dışı bırakmanız ve uygulamanızı başlatmanız gerekir. İhtiyacım olan şey için harika çalıştı.
İşte GooglePlay'deki uygulama bağlantısı: Sahte GPS
Bunu yapmak için Google eğiticisini burada bulabilirsiniz, kod örnekleri sağlar ve işlemi açıklar.
http://developer.android.com/training/location/location-testing.html#SendMockLocations
Sahte GPS uygulamasını yükleyin https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=tr
Geliştirici seçenekleri -> Sahte konum uygulamasını seç (Yani, Sahte konum uygulaması seçildi).
Sahte GPS uygulaması :
Haritada eklemek için çift sekme -> oynat düğmesini tıklayın -> Tostu göster "Sahte konum durdu"
son olarak google harita uygulamaları ile kontrol edin.
Android Telefonunuzda bir WebServer (REST-Like) çalıştıran bir Uygulama yazdım, böylece GPS konumunu uzaktan ayarlayabilirsiniz . Web sitesi, üzerine yeni bir pozisyon ayarlamak için tıklayabileceğiniz veya herhangi bir yönde hareket etmek için "wasd" tuşlarını kullanabileceğiniz bir Harita sunuyor. Uygulama hızlı bir çözümdü, bu yüzden neredeyse hiç kullanıcı arayüzü veya Dokümantasyon yok, ancak uygulama basittir ve (sadece dört) sınıfta her şeyi arayabilirsiniz.
Proje deposu: https://github.com/juliusmh/RemoteGeoFix
Cihazınız bilgisayarınıza bağlıysa ve değiştirmeye çalışıyorsanız, GPS kablolarını Emulator kontrolü ile göndermeye çalıştığınızda çalışmaz.
Bu bir sebepten ötürü bir EMULATOR kontrolüdür.
Sadece GPS değişikliğinde sizi güncellemek için ayarlayın.
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 güncellendiğinde, istediğiniz yöntemi yapmak için aşağıdaki yöntemi yeniden yazı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();
}
}
}
Bunları
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION bildirimine koymayı unutmayın
Ayrıntılı Mock Location kurulumuna ihtiyacınız olup olmadığını merak ediyorum. Benim durumumda bir kez sabit bir konum var ben bu yeni konum ile bir şeyler yapmak için bir işlev çağırıyordu. Bir zamanlayıcıda sahte bir konum oluşturun. Ve bunun yerine işlevi bu konumla çağırın. Kısa bir süre içinde tüm bunları bilmek GPS gerçek bir güncel konuma gelecektir. Hangisi iyi. Güncelleme süreniz yeterince uzunsa.
Belki 'programcı' yaklaşımı değildir, ancak zaman kazanmak ve çalışma çözümü almak istiyorsanız, Google Play'de mevcut olan sahte konumlara adanmış uygulamalardan birini deneyin:
Android telefonlar ve tabletler için çok uygun ve ücretsiz etkileşimli konum simülatörünü kullanın (CATLES olarak adlandırılır). GPS konumunu sistem genelinde (Google Haritalar veya Facebook uygulamalarında bile) alay eder ve hem fiziksel hem de sanal cihazlarda çalışır:
Web sitesi: http://ubicom.snet.tu-berlin.de/catles/index.html
Manifest dosyasında bu izni kullanın
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">
android tavsiye edecektir stüdyo "Sahte konumu sadece bir test ya da ayıklama özgü manifest dosyasında talep edilmelidir (tipik src / debug / AndroidManifest.xml'sinde)" sadece muayene devre dışı
Şimdi , telefonunuzun geliştirici ayarında " Sahte konumlara izin ver " seçeneğini işaretlediğinizden emin olun .
LocationManager'ı kullan
locationManager.addTestProvider(mocLocationProvider, false, false,
false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);
Şimdi konumu istediğiniz yere ayarlayın
Location mockLocation = new Location(mocLocationProvider);
mockLocation.setLatitude(lat);
mockLocation.setLongitude(lng);
mockLocation.setAltitude(alt);
mockLocation.setTime(System.currentTimeMillis());
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation);
Yukarıdaki çözümler benim için işe yaramadı çünkü FusedLocationProviderClient kullanan en son Google Play Hizmetleri sürümüne sahip bir Android cihazında test yapıyordum . Uygulama bildiriminde ve uygulamada sahte konum iznini, geliştirici ayarlarında belirtilen sahte konum uygulaması olarak ayarladıktan sonra (önceki yanıtlarda belirtildiği gibi), daha sonra aşağıda başarıyla konum alay eden Kotlin kodunu ekledim.
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)