मैं भौतिक उपकरण (Nexus One) पर अपना स्थान कैसे मॉक कर सकता हूं? मुझे पता है कि आप एमुलेटर कंट्रोल पैनल में एमुलेटर के साथ ऐसा कर सकते हैं, लेकिन यह एक भौतिक डिवाइस के लिए काम नहीं करता है।
मैं भौतिक उपकरण (Nexus One) पर अपना स्थान कैसे मॉक कर सकता हूं? मुझे पता है कि आप एमुलेटर कंट्रोल पैनल में एमुलेटर के साथ ऐसा कर सकते हैं, लेकिन यह एक भौतिक डिवाइस के लिए काम नहीं करता है।
जवाबों:
ऐसा लगता है कि ऐसा करने का एकमात्र तरीका एक नकली स्थान प्रदाता का उपयोग करना है।
आपको अपनी सेटिंग में विकास पैनल में स्थानों को सक्षम करना होगा और जोड़ना होगा
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
आपके प्रकट करने के लिए।
अब आप अपने कोड में जाकर अपना मॉक लोकेशन प्रोवाइडर बना सकते हैं और इस प्रोवाइडर की लोकेशन सेट कर सकते हैं।
यदि आप इस फोन को केवल विकास प्रयोगशाला में उपयोग करते हैं, तो एक मौका है कि आप जीपीएस चिप को दूर कर सकते हैं और सीरियल डिवाइस को सीधे दूसरे डिवाइस से NMEA दृश्यों के साथ फीड कर सकते हैं।
काश मेरे पास मेरा केबल होता। मुझे पता है कि आप एमुलेटर को अपनी जगह बदलने के लिए टेलनेट कर सकते हैं
$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK
मुझे याद नहीं है कि आप अपने डिवाइस को टेलनेट कर सकते हैं, लेकिन मुझे लगता है कि आप कर सकते हैं। आशा है कि ये आपकी मदद करेगा।
आपको इसके लिए (CLI) adb (android debugging bridge) की आवश्यकता होगी।
लोकेशन सर्विसेज़ की अनुमति का इस्तेमाल आप लोकेशन मॉक करने के लिए कर सकते हैं ...
"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);
मुझे निम्नलिखित कोड के साथ सफलता मिली है। यद्यपि यह मुझे किसी कारण के लिए एक ही ताला मिला (भले ही मैंने अलग-अलग लाटलिंग जोड़े की कोशिश की हो), इसने मेरे लिए काम किया। 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
इसका उपयोग यहाँ पर एक घटना को सूचित करने / स्थान देने / करने के लिए किया जाता है जिसका स्थान LocationManager के पास है कि GPS प्रदाता ने "अब" ठीक कर लिया है ताकि उक्त घटना का प्रसंस्करण हो सके।
mLocationManager
है LocationManager
जो लोकेशनलिस्ट तक पहुंच गया है " का अर्थ क्या है ? मैं यह कैसे कर सकता हूँ? धन्यवाद ..
LocationManager
सेवा का उपयोग करके स्थान परिवर्तन की जांच कैसे करें LocationListener
: a। Blog.doityourselfandroid.com/2010/12/25/…
Dr1Ku ने क्या काम किया है। आज कोड का उपयोग किया है लेकिन अधिक स्थानों को जोड़ने के लिए आवश्यक है। तो यहाँ कुछ सुधार कर रहे हैं:
वैकल्पिक: LocationManager.GPS_PROVIDER स्ट्रिंग का उपयोग करने के बजाय, आप अपने स्वयं के constVIDER_NAME को परिभाषित करना और उसका उपयोग करना चाह सकते हैं। स्थान अद्यतनों के लिए पंजीकरण करते समय, किसी प्रदाता को मापदंड के माध्यम से सीधे स्ट्रिंग के रूप में निर्दिष्ट करने के बजाय चुनें।
पहला: RemoveTestProvider को कॉल करने के बजाय, पहले देखें कि क्या कोई प्रदाता हटाया जाना है (IllegalArgumentException से बचने के लिए):
if (mLocationManager.getProvider(PROVIDER_NAME) != null) {
mLocationManager.removeTestProvider(PROVIDER_NAME);
}
दूसरा: एक से अधिक स्थान प्रकाशित करने के लिए, आपको स्थान के लिए समय निर्धारित करना होगा:
newLocation.setTime(System.currentTimeMillis());
...
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);
ऐसा लगता है कि एक Google परीक्षण भी है जो MockLocationProviders का उपयोग करता है: http://grepcode.com/file/repository.grepcode.com/java/ext/google.android/android/1.5_r4/android/location/LocationManagerProProTest.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
, सामान्य जीपीएस काम नहीं करेगा, मुझे फिक्स नहीं मिल सकता है (मैं सीधे एक डिवाइस पर परीक्षण कर रहा था)। Android में बहुत कुछ होने के बाद से ऐसा नहीं हो सकता है।
एंड्रॉइड मार्केट में ऐसे एप्लिकेशन उपलब्ध हैं जो आपको अपने डिवाइस के लिए "मॉक जीपीएस लोकेशन" निर्दिष्ट करने की अनुमति देते हैं।
मैंने https://market.android.com को खोजा और "माय फ़ेक लोकेशन" नामक एक ऐप मिला जो मेरे लिए काम करता है।
ऊपर पॉल द्वारा उल्लिखित मॉक जीपीएस प्रदाता ( http://www.cowlumbus.nl/forum/MockGpsProvider.zip पर ) एक अन्य उदाहरण है जिसमें स्रोत कोड शामिल है - हालांकि मैं प्रदान की गई एपीके को स्थापित करने में सक्षम नहीं था (इसे कहते हैं विफलता [INSTALL_FAILED_OLDER_SDK] और बस एक recompile की आवश्यकता हो सकती है)
GPS मॉक स्थानों का उपयोग करने के लिए आपको अपनी डिवाइस सेटिंग में इसे सक्षम करना होगा। सेटिंग पर जाएं -> एप्लिकेशन -> डेवलपमेंट और चेक करें "मॉक लोकेशन की अनुमति दें"
फिर आप जीपीएस निर्देशांक सेट करने के लिए ऊपर वर्णित लोगों की तरह एक ऐप का उपयोग कर सकते हैं और Google मानचित्र और अन्य एप्लिकेशन आपके द्वारा निर्दिष्ट मॉक जीपीएस स्थान का उपयोग करेंगे।
यह मेरे लिए काम किया (Android Studio):
फ़ोन पर GPS और WiFi ट्रैकिंग अक्षम करें। एंड्रॉइड 5.1.1 और नीचे पर, डेवलपर विकल्पों में "सक्षम मॉक स्थानों" का चयन करें।
Src / डिबग डायरेक्टरी में अपने मैनिफ़ेस्ट की एक प्रति बनाएँ। इसे निम्नलिखित में जोड़ें ("एप्लिकेशन" टैग के बाहर):
उपयोग-अनुमति Android: नाम = "android.permission.ACCESS_MOCK_LOCATION"
एक नक्शा सेट करें, जिसे "मैप" कहा जाता है। निम्नलिखित कोड 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" विधि का उपयोग करने के लिए अपने मॉड्यूल ग्रेडल फ़ाइल में "minSdkVersion" को अस्थायी रूप से 17 तक बढ़ाना पड़ सकता है।
मुख्य गतिविधि वर्ग के अंदर निम्नलिखित कोड शामिल करें:
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
// do whatever you want, scroll the map, etc.
}
}
AS के साथ अपना ऐप चलाएं। एंड्रॉइड 6.0 और इसके बाद के संस्करण पर आपको एक सुरक्षा अपवाद मिलेगा। अब Settings में Developer Options पर जाएं और "Select mock location app" चुनें। सूची से अपना ऐप चुनें।
अब जब आप मानचित्र पर टैप करते हैं, तो 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 द्वारा उल्लिखित समाधान और पेड्रो द्वारा http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ पर मेरे लिए बहुत अच्छा काम किया गया है। हालाँकि, यह मॉक जीपीएस प्रदाता को ठीक से शुरू करने, रोकने और पुनः आरंभ करने के लिए समर्थन प्रदान नहीं करता है।
मैंने उसके कोड को थोड़ा बदल दिया है और कक्षा को थ्रेड के बजाय AsyncTask होने के लिए फिर से लिखा है। यह हमें UI थ्रेड के साथ संवाद करने की अनुमति देता है, इसलिए हम प्रदाता को उस बिंदु पर पुनः आरंभ कर सकते हैं जहां हम थे जब हमने इसे रोक दिया था। यह तब काम आता है जब स्क्रीन ओरिएंटेशन बदलता है।
कोड ग्रहण के लिए एक नमूना परियोजना के साथ, GitHub पर पाया जा सकता है: https://github.com/paulhoux/Android-MockProviderGPS
ज्यादातर मेहनत करने के लिए सारा श्रेय पेड्रो को जाना चाहिए।
अपने प्रकट में जोड़ें
<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);
}
आपको अपने डिवाइस डेवलपर सेटिंग में नकली स्थानों को सक्षम करना होगा। यदि यह उपलब्ध नहीं है, तो उपरोक्त लागू होने के बाद अपने आवेदन में "मॉक लोकेशन एप्लिकेशन" सेट करें।
गूगल प्ले से फेक जीपीएस ऐप ने मेरे लिए ट्रिक बनाई। बस सुनिश्चित करें कि आप एप्लिकेशन विवरण में सभी दिशाओं को पढ़ें। "फ़ेक जीपीएस" सक्षम करने के बाद आपको अन्य स्थान सेवाओं को अक्षम करना होगा और साथ ही साथ अपना ऐप भी शुरू करना होगा। मुझे जो चाहिए उसके लिए बहुत मेहनत की।
यहां GooglePlay पर ऐप का लिंक दिया गया है: फेक जीपीएस
ऐसा करने के लिए Google ट्यूटोरियल यहां पाया जा सकता है, यह कोड उदाहरण प्रदान करता है और प्रक्रिया को समझाता है।
http://developer.android.com/training/location/location-testing.html#SendMockLocations
फेक जीपीएस ऐप इंस्टॉल करें https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en
डेवलपर विकल्प -> मॉक लोकेशन ऐप चुनें (इसका मतलब है, फेक लोकेशन ऐप चुना गया है)।
नकली जीपीएस ऐप :
जोड़ने के लिए मानचित्र पर डबल टैब -> प्ले बटन पर क्लिक करें -> टोस्ट दिखाएं "नकली स्थान रोका गया"
अंत में गूगल मैप ऐप्स से जांच करें।
मैंने एक ऐप लिखा है जो आपके एंड्रॉइड फोन पर एक वेबसर्वर (REST- लाइक) चलाता है, जिससे आप GPS स्थिति को दूरस्थ रूप से सेट कर सकते हैं । वेबसाइट एक मानचित्र प्रदान करती है जिस पर आप एक नई स्थिति निर्धारित करने के लिए क्लिक कर सकते हैं, या किसी भी दिशा में जाने के लिए "wasd" कुंजियों का उपयोग कर सकते हैं। एप्लिकेशन एक त्वरित समाधान था, इसलिए लगभग कोई UI या दस्तावेज़ नहीं है, लेकिन कार्यान्वयन सीधे आगे है और आप (केवल चार) कक्षाओं में सब कुछ देख सकते हैं।
प्रोजेक्ट रिपॉजिटरी: https://github.com/juliusmh/RemoteGeoFix
यदि आपके डिवाइस को आपके कंप्यूटर में प्लग किया गया है और आपके द्वारा एमुलेटर कंट्रोल के माध्यम से GPS डोर को भेजने की कोशिश की जा रही है, तो यह काम नहीं करेगा।
यह एक कारण के लिए एक इम्यूलेटर नियंत्रण है।
बस इसे आपको 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);
}
};
जब जीपीएस अपडेट किया जाता है, तो आप इसे करने के लिए निम्न विधि को फिर से लिखना चाहते हैं;
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
मुझे आश्चर्य है कि अगर आपको विस्तृत मॉक लोकेशन सेटअप की आवश्यकता है। मेरे मामले में एक बार मुझे एक निश्चित स्थान मिल गया, मैं उस नए स्थान के साथ कुछ करने के लिए एक फ़ंक्शन को बुला रहा था। एक टाइमर में एक नकली स्थान बनाएँ। और इसके स्थान पर फ़ंक्शन को कॉल करें। कुछ ही समय में यह जानकर कि जीपीएस वास्तविक वर्तमान स्थान के साथ आएगा। जो ठीक है। यदि आपके पास अपडेट का समय पर्याप्त रूप से लंबा है।
हो सकता है कि यह 'प्रोग्रामर' दृष्टिकोण नहीं है, लेकिन यदि आप अपना समय बचाना चाहते हैं और काम का समाधान प्राप्त करना चाहते हैं, तो उन ऐप्स में से एक को आज़माएं, जो Google Play में उपलब्ध नकली स्थान के लिए समर्पित हैं:
एंड्रॉइड फोन और टैबलेट (CATLES नाम) के लिए बहुत सुविधाजनक और मुफ्त इंटरैक्टिव स्थान सिम्युलेटर का उपयोग करें। यह सिस्टम-वाइड लेवल (यहां तक कि Google मैप्स या फेसबुक ऐप्स के भीतर) पर जीपीएस-लोकेशन का मजाक उड़ाता है और यह फिजिकल के साथ-साथ वर्चुअल डिवाइसेज पर भी काम करता है:
मेनिफ़ेस्ट फ़ाइल में इस अनुमति का उपयोग करें
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">
एंड्रॉइड स्टूडियो अनुशंसा करेगा कि "नकली स्थान केवल एक परीक्षण या डिबग-विशिष्ट मैनिफ़ेस्ट फ़ाइल (आमतौर पर src / debug / AndroidManifest.xml) में अनुरोध किया जाना चाहिए" निरीक्षण को अक्षम करें
अब सुनिश्चित करें कि आपने अपने फ़ोन की डेवलपर सेटिंग में " अनुमति दें नकली स्थान " की जाँच कर ली है
स्थान प्रबंधक का उपयोग करें
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);
उपरोक्त समाधान मेरे काम नहीं आए क्योंकि मैं नवीनतम Google Play Services संस्करण के साथ एक Android डिवाइस पर परीक्षण कर रहा था जो FusedLocationProviderClient का उपयोग करता है । एप्लिकेशन मैनिफ़ेस्ट में मॉक लोकेशन की अनुमति और ऐप को डेवलपर सेटिंग्स में निर्दिष्ट नकली स्थान ऐप के रूप में सेट करने के बाद (जैसा कि पिछले उत्तरों में उल्लेख किया गया है), मैंने फिर कोटलिन कोड को नीचे जोड़ा जिसमें सफलतापूर्वक स्थान को मॉक किया गया।
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)