कुछ साल बाद इस धागे पर ठोकर लगी। 2016 में, अधिकांश एंड्रॉइड डिवाइसों में एपीआई स्तर> = 18 होगा और इस प्रकार फर्नांडो द्वारा बताए गए स्थान पर भरोसा करना चाहिए ।isFromMockProvider () ।
मैंने बड़े पैमाने पर विभिन्न एंड्रॉइड डिवाइस और डिस्ट्रो पर नकली / नकली स्थानों के साथ प्रयोग किया। दुर्भाग्य से .isFromMockProvider () 100% विश्वसनीय नहीं है। हर एक बार एक नकली स्थान को नकली के रूप में लेबल नहीं किया जाएगा । ऐसा लगता है कि Google स्थान API में कुछ गलत आंतरिक संलयन तर्क के कारण है।
मैंने इस बारे में एक विस्तृत ब्लॉग पोस्ट लिखी , यदि आप और अधिक सीखना चाहते हैं। संक्षेप में बताने के लिए, यदि आप स्थान एपीआई से स्थान अपडेट की सदस्यता लेते हैं, तो एक नकली जीपीएस ऐप पर स्विच करें और प्रत्येक स्थान का परिणाम प्रिंट करें। स्ट्रिंग () कंसोल पर, आपको कुछ इस तरह दिखाई देगा:
ध्यान दें कि कैसे, स्थान अपडेट की धारा में, एक स्थान में अन्य लोगों के समान निर्देशांक होते हैं, लेकिन मॉक के रूप में चिह्नित नहीं किया जाता है और इसमें बहुत कम स्थान सटीकता होती है।
इस समस्या को हल करने के लिए, मैं एक उपयोगिता वर्ग ने लिखा है कि होगा सभी आधुनिक Android संस्करण (एपीआई स्तर 15 और ऊपर) भर में मज़बूती से दबाने कृत्रिम स्थान:
LocationAssistant - Android पर परेशानी रहित स्थान अपडेट
मूल रूप से, यह गैर-नकली स्थानों को "अविश्वास" करता है जो अंतिम ज्ञात नकली स्थान के 1 किमी के भीतर हैं और उन्हें एक नकली के रूप में लेबल करता है। यह तब तक करता है जब तक कि महत्वपूर्ण संख्या में गैर-नकली स्थान नहीं आ गए। LocationAssistant न केवल कृत्रिम स्थान अस्वीकार कर सकते हैं, लेकिन यह भी स्थापित करने और स्थान अपडेट की ग्राहकी की परेशानी से ज्यादातर से आप unburdens।
केवल वास्तविक स्थान अपडेट प्राप्त करने के लिए (अर्थात मोज़ेक को दबाएं), इसका उपयोग इस प्रकार करें:
public class MyActivity extends Activity implements LocationAssistant.Listener {
private LocationAssistant assistant;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
assistant = new LocationAssistant(this, this, LocationAssistant.Accuracy.HIGH, 5000, false);
}
@Override
protected void onResume() {
super.onResume();
assistant.start();
}
@Override
protected void onPause() {
assistant.stop();
super.onPause();
}
@Override
public void onNewLocationAvailable(Location location) {
}
...
}
onNewLocationAvailable()
अब केवल वास्तविक स्थान जानकारी के साथ लागू किया जाएगा। कुछ और श्रोता विधियां हैं जिन्हें आपको लागू करने की आवश्यकता है, लेकिन आपके प्रश्न के संदर्भ में (जीपीएस स्पूफिंग को कैसे रोका जाए) यह मूल रूप से है।
बेशक, एक जड़ वाले ओएस के साथ आप अभी भी स्थान की जानकारी को खराब करने के तरीके पा सकते हैं जो सामान्य एप्लिकेशन के लिए पता लगाना असंभव है।