Bagaimana saya bisa mengejek lokasi saya di perangkat fisik (Nexus One)? Saya tahu Anda dapat melakukan ini dengan emulator di panel Kontrol Emulator, tetapi ini tidak berfungsi untuk perangkat fisik.
Bagaimana saya bisa mengejek lokasi saya di perangkat fisik (Nexus One)? Saya tahu Anda dapat melakukan ini dengan emulator di panel Kontrol Emulator, tetapi ini tidak berfungsi untuk perangkat fisik.
Jawaban:
Sepertinya satu-satunya cara yang harus dilakukan adalah menggunakan penyedia lokasi tiruan.
Anda harus mengaktifkan lokasi tiruan di panel pengembangan di pengaturan Anda dan menambahkan
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
ke manifes Anda.
Sekarang Anda dapat masuk dalam kode Anda dan membuat penyedia lokasi tiruan Anda sendiri dan mengatur lokasi penyedia ini.
Jika Anda menggunakan telepon ini hanya di lab pengembangan, ada kemungkinan Anda dapat menyolder chip GPS dan memberi makan port serial langsung dengan urutan NMEA dari perangkat lain.
Saya berharap saya punya kabel saya berguna. Saya tahu Anda bisa telnet ke emulator untuk mengubah lokasinya
$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK
Saya tidak ingat apakah Anda bisa telnet ke perangkat Anda, tetapi saya pikir Anda bisa. Saya harap ini membantu.
Anda memerlukan adb (jembatan debugging android) untuk ini (CLI).
Anda dapat menggunakan izin Layanan Lokasi untuk mengejek lokasi ...
"android.permission.ACCESS_MOCK_LOCATION"
dan kemudian dalam kode java Anda,
// 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);
Saya sudah sukses dengan kode berikut. Meskipun itu membuat saya kunci tunggal untuk beberapa alasan (bahkan jika saya sudah mencoba pasangan LatLng berbeda), itu berhasil untuk saya. mLocationManager
adalah LocationManager
yang terhubung ke 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
digunakan di sini untuk memberi tahu / memposting ke / menjadwalkan acara dengan LocationManager bahwa penyedia GPS telah menemukan perbaikan "sekarang" sehingga pemrosesan acara tersebut dapat terjadi.
mLocationManager
adalah LocationManager
yang terhubung ke LocationListener"? bagaimana saya bisa melakukan ini? Terima kasih ..
LocationManager
layanan dan LocationListener
: blog.doityourselfandroid.com/2010/12/25/…
Apa yang diposting Dr1Ku berfungsi. Digunakan kode hari ini tetapi perlu menambahkan lebih banyak lok. Jadi, inilah beberapa peningkatan:
Opsional: Alih-alih menggunakan String LocationManager.GPS_PROVIDER, Anda mungkin ingin menentukan PROVIDER_NAME constat Anda sendiri dan menggunakannya. Saat mendaftar untuk pembaruan lokasi, pilih penyedia melalui kriteria alih-alih langsung menentukannya sebagai string.
Pertama: Alih-alih memanggil removeTestProvider, periksa terlebih dahulu apakah ada penyedia yang akan dihapus (untuk menghindari IllegalArgumentException):
if (mLocationManager.getProvider(PROVIDER_NAME) != null) {
mLocationManager.removeTestProvider(PROVIDER_NAME);
}
Kedua: Untuk mempublikasikan lebih dari satu lokasi, Anda harus mengatur waktu untuk lokasi:
newLocation.setTime(System.currentTimeMillis());
...
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);
Tampaknya juga ada Uji google yang menggunakan MockLocationProviders: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java
Contoh kerja bagus lainnya dapat ditemukan di: http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/
Artikel bagus lainnya adalah: http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1358 Anda juga akan menemukan beberapa kode yang benar-benar berfungsi untuk saya di emulator.
Mock Provider
, GPS normal tidak akan berfungsi, saya tidak bisa memperbaiki (saya sedang menguji langsung pada perangkat). Ini mungkin tidak terjadi karena banyak yang telah terjadi di Android sejak itu.
Ada aplikasi yang tersedia di Android Market yang memungkinkan Anda menentukan "Lokasi GPS Mock" untuk perangkat Anda.
Saya mencari https://market.android.com dan menemukan aplikasi bernama "Lokasi Palsu Saya" yang berfungsi untuk saya.
Penyedia Mock GPS yang disebutkan oleh Paul di atas (di http://www.cowlumbus.nl/forum/MockGpsProvider.zip ) adalah contoh lain yang menyertakan kode sumber - walaupun saya tidak dapat menginstal APK yang disediakan (katanya Kegagalan [INSTALL_FAILED_OLDER_SDK] dan mungkin hanya perlu dikompilasi ulang)
Untuk menggunakan lokasi tiruan GPS, Anda harus mengaktifkannya di pengaturan perangkat Anda. Buka Pengaturan -> Aplikasi -> Pengembangan dan centang "Izinkan lokasi palsu"
Anda kemudian dapat menggunakan aplikasi seperti yang dijelaskan di atas untuk mengatur koordinat GPS dan peta Google dan aplikasi lain akan menggunakan lokasi GPS tiruan yang Anda tentukan.
Ini bekerja untuk saya (Android Studio):
Nonaktifkan pelacakan GPS dan WiFi di ponsel. Pada Android 5.1.1 dan di bawah, pilih "aktifkan lokasi tiruan" di Opsi Pengembang.
Buat salinan manifes Anda di direktori src / debug. Tambahkan yang berikut ke sana (di luar tag "aplikasi"):
menggunakan-izin android: name = "android.permission.ACCESS_MOCK_LOCATION"
Menyiapkan fragmen peta yang disebut "peta". Sertakan kode berikut di 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);
}
};
Perhatikan bahwa Anda mungkin harus sementara meningkatkan "minSdkVersion" di file gradle modul Anda menjadi 17 untuk menggunakan metode "setElapsedRealtimeNanos".
Sertakan kode berikut di dalam kelas aktivitas utama:
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
// do whatever you want, scroll the map, etc.
}
}
Jalankan aplikasi Anda dengan AS. Di Android 6.0 dan di atasnya Anda akan mendapatkan pengecualian keamanan. Sekarang pergi ke Opsi Pengembang di Pengaturan dan pilih "Pilih aplikasi lokasi mock". Pilih aplikasi Anda dari daftar.
Sekarang ketika Anda mengetuk peta, onLocationChanged () akan memecat dengan koordinat keran Anda.
Saya baru saja memikirkan hal ini jadi sekarang saya tidak perlu menginjak-injak lingkungan dengan telepon di tangan.
Saya telah membuat Handler sederhana yang mensimulasikan posisi bergerak dari posisi awal.
Mulai di panggilan balik koneksi Anda:
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) {
}
};
Kelas 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;
}
}
}
Semoga bisa membantu ..
Solusi yang disebutkan oleh icyerasor dan disediakan oleh Pedro di http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ bekerja sangat baik untuk saya. Namun, ia tidak menawarkan dukungan untuk memulai, menghentikan, dan memulai kembali penyedia GPS tiruan dengan benar.
Saya telah sedikit mengubah kodenya dan menulis ulang kelas menjadi AsyncTask alih-alih sebuah Thread. Ini memungkinkan kami untuk berkomunikasi dengan Utas UI, sehingga kami dapat memulai ulang penyedia pada titik di mana kami berada ketika kami menghentikannya. Ini sangat berguna ketika orientasi layar berubah.
Kode, bersama dengan proyek sampel untuk Eclipse, dapat ditemukan di GitHub: https://github.com/paulhoux/Android-MockProviderGPS
Semua kredit harus diberikan kepada Pedro untuk melakukan sebagian besar kerja keras.
Tambahkan ke manifes Anda
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
tools:ignore="MockLocation,ProtectedPermissions" />
Fungsi lokasi tiruan
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);
}
Anda juga harus mengaktifkan lokasi tiruan di pengaturan pengembang perangkat Anda. Jika itu tidak tersedia, setel "mock location application" ke aplikasi Anda setelah penerapan di atas.
Aplikasi GPS palsu dari google play membantu saya. Pastikan Anda membaca semua petunjuk dalam deskripsi aplikasi. Anda harus menonaktifkan layanan lokasi lain serta memulai aplikasi Anda setelah Anda mengaktifkan "GPS Palsu". Bekerja sangat baik untuk apa yang saya butuhkan.
Berikut ini tautan ke aplikasi di GooglePlay: GPS Palsu
Tutorial Google untuk melakukan ini dapat ditemukan di sini, memberikan contoh kode dan menjelaskan prosesnya.
http://developer.android.com/training/location/location-testing.html#SendMockLocations
Instal aplikasi GPS Palsu https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=id
Opsi pengembang -> Pilih aplikasi lokasi tiruan (Berarti, aplikasi lokasi palsu dipilih).
Aplikasi GPS palsu :
Klik dua kali peta untuk menambahkan -> klik tombol putar -> Tampilkan roti panggang "Lokasi palsu dihentikan"
akhirnya periksa dengan aplikasi google map.
Saya menulis Aplikasi yang menjalankan WebServer (Seperti REST) di Ponsel Android Anda, sehingga Anda dapat mengatur posisi GPS dari jarak jauh . Situs web ini menyediakan Peta yang dapat Anda klik untuk mengatur posisi baru, atau gunakan tombol "wasd" untuk bergerak ke arah mana pun. Aplikasi ini adalah solusi cepat sehingga hampir tidak ada UI atau Dokumentasi, tetapi implementasinya lurus ke depan dan Anda dapat melihat semuanya dalam (hanya empat) kelas.
Repositori proyek: https://github.com/juliusmh/RemoteGeoFix
Jika perangkat Anda dicolokkan ke komputer Anda dan Anda mencoba mengubah mengirim tali GPS Melalui kontrol Emulator, itu tidak akan berfungsi.
Ini adalah kontrol EMULATOR karena suatu alasan.
Cukup atur untuk memperbarui Anda tentang perubahan 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);
}
};
Ketika GPS diperbarui, tulis ulang metode berikut untuk melakukan apa yang Anda inginkan;
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();
}
}
}
Jangan lupa letakkan ini di manifes
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION
Saya ingin tahu apakah Anda memerlukan pengaturan Lokasi Mock yang rumit. Dalam kasus saya begitu saya mendapatkan lokasi perbaikan, saya memanggil fungsi untuk melakukan sesuatu dengan lokasi baru itu. Dalam penghitung waktu, buat lokasi tiruan. Dan panggil fungsi dengan lokasi itu saja. Mengetahui semua itu dalam waktu singkat GPS akan datang dengan lokasi aktual saat ini. Tidak apa-apa. Jika Anda memiliki waktu pembaruan yang ditetapkan cukup lama.
Mungkin ini bukan pendekatan 'programmer', tetapi jika Anda ingin menghemat waktu dan mendapatkan solusi yang berfungsi, cobalah salah satu aplikasi yang didedikasikan untuk lokasi palsu yang tersedia di Google Play:
Manfaatkan simulator lokasi interaktif yang sangat nyaman dan gratis untuk ponsel dan tablet Android (bernama CATLES). Ini mengolok-olok lokasi GPS pada tingkat sistem (bahkan di dalam Google Maps atau aplikasi Facebook) dan bekerja pada perangkat fisik maupun virtual:
Situs web: http://ubicom.snet.tu-berlin.de/catles/index.html
Gunakan izin ini dalam file manifes
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">
android studio akan merekomendasikan bahwa "Lokasi mock hanya boleh diminta dalam file manifes uji atau debug khusus (biasanya src / debug / AndroidManifest.xml)" cukup nonaktifkan inspeksi
Sekarang pastikan Anda telah memeriksa " Izinkan lokasi palsu " di pengaturan pengembang ponsel Anda
Gunakan LocationManager
locationManager.addTestProvider(mocLocationProvider, false, false,
false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);
Sekarang atur lokasi di mana pun Anda inginkan
Location mockLocation = new Location(mocLocationProvider);
mockLocation.setLatitude(lat);
mockLocation.setLongitude(lng);
mockLocation.setAltitude(alt);
mockLocation.setTime(System.currentTimeMillis());
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation);
Solusi di atas tidak bekerja untuk saya karena saya menguji pada perangkat Android dengan versi Google Play Services terbaru yang menggunakan FusedLocationProviderClient . Setelah mengatur izin lokasi tiruan di manifes aplikasi dan aplikasi sebagai aplikasi lokasi tiruan yang ditentukan dalam pengaturan pengembang (seperti yang disebutkan dalam jawaban sebelumnya), saya kemudian menambahkan kode Kotlin di bawah ini yang berhasil mengejek lokasi.
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)