2016-12-17 15 views
8

मैं जिसमें मैं उपयोगकर्ता की जरूरत है अपने वर्तमान स्थान उपहास करने के लिए एक Android एप्लिकेशन है के बाद वापस मूल करने के लिए बदल जाता है। नीचे कोड है जिसका उपयोग मैं करता हूं जो उपयोगकर्ता अपने स्थान का मज़ाक उड़ाते हुए हरे रंग के बटन दबाते हैं।एंड्रॉयड: कृत्रिम स्थान कुछ ही सेकंड

कोड नीचे स्थान faking जब "हरे बटन" दबाया जाता है शुरू होता है।

greenButton.setOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View view) { 
     LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     lm.addTestProvider(LocationManager.GPS_PROVIDER, 
       "requiresNetwork" == "", 
       "requiresSatellite" == "", 
       "requiresCell" == "", 
       "hasMonetaryCost" == "", 
       "supportsAltitude" == "", 
       "supportsSpeed" == "", 
       "supportsBearing" == "", 
       Criteria.POWER_LOW, 
       Criteria.ACCURACY_FINE); 

     Location newLocation = new Location(LocationManager.GPS_PROVIDER); 
     newLocation.setLatitude(fakeLocation.getLatitude()); 
     newLocation.setLongitude(fakeLocation.getLongitude()); 
     newLocation.setAccuracy(fakeLocation.getAccuracy()); 
     newLocation.setTime(System.currentTimeMillis()); 
     newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); 
     lm.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true); 
     lm.setTestProviderStatus(LocationManager.GPS_PROVIDER, 
       LocationProvider.AVAILABLE, 
       null, System.currentTimeMillis()); 
     lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation); 
     } 
}); 

मैं मानचित्र पर एक मार्कर जगह है और हरे बटन दबाएँ जब। स्थान मजाक शुरू होता है। वह "नकली स्थान" मेरा वर्तमान स्थान बन जाता है।

लेकिन जैसे 10-20 सेकंड के बाद, मजाक सिर्फ समाप्त होता है। मेरा "वास्तविक स्थान" मेरा वर्तमान स्थान बन जाता है। मैंने ऑनलाइन कई उदाहरण देखे हैं और वे उसी कोड का उपयोग करते हैं जिसका उपयोग मैं स्थान पर नकल करने के लिए कर रहा हूं। मुझे नहीं पता कि यह मेरे ऐप के साथ क्यों होता है। किसी भी सहायता की सराहना की जाएगी।

उत्तर

2

सबसे पहले, स्थान अनुरोध उचित स्थान प्रदाता के लिए आपके नकली स्थान को प्रभावित करेगा।

यदि आप जीपीएस प्रदाता के लिए नकली स्थान बनाते हैं और सेट करते हैं और फिर जीपीएस प्रदाता के लिए फिर से स्थान अनुरोध करते हैं, तो नकली एक तब तक जारी रहेगा जब तक कि जीपीएस हार्डवेयर को ताजा स्थान प्राप्त न हो जाए। इसमें 10-20 सेकंड या अधिक समय लग सकता है (लेकिन 10-20 सेकंड की तरह, मॉकिंग बस समाप्त होता है ...)

और यह प्रश्न कुछ नकली स्थान ऐप की समस्या का उत्तर है। आप इस ऐप का उपयोग करने के बाद "मुझे अपना असली वर्तमान स्थान नहीं मिल सकता है" जैसी टिप्पणियां देख सकते हैं !!! " बाजार पर क्योंकि उन्हें आपके द्वारा किए गए स्थान अनुरोध की आवश्यकता होती है।

और आखिरकार, सेवा में मॉकिंग ऑपरेशन को लूप करें। मैं पृष्ठभूमि थ्रेड पर ऐसा करने का सुझाव देता हूं, शायद प्रत्येक 1 या 2 सेकंड में। इस तरह, आप अन्य अनुप्रयोगों के संभावित स्थान अनुरोध को प्रभावित कर सकते हैं।

Handler mHandler; 

private void loopMocking(){ 
    mHandler.post(mMockRunnable); 
} 

private Runnable mMockRunnable = new Runnable() { 
    @Override 
    public void run() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); 
     } 

     newLocation.setTime(System.currentTimeMillis()); 
     lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation); 

     mHandler.postDelayed(mMockRunnable, 1000); // At each 1 second 
    } 
}; 
+0

यह पूरी तरह से काम करता है! धन्यवाद –

-1

आप कृत्रिम स्थान निर्धारित करने के बाद अधिक स्थान अनुरोध मिल बंद करने के लिए देखते हैं।

उपयोग manager.removeUpdates (यह)। documentation कहते हैं:

दिया LocationListener साथ वर्तमान गतिविधि का स्थान अपडेट के लिए किसी भी वर्तमान पंजीकरण को निकालता है। इस कॉल के बाद, इस श्रोता के लिए अपडेट अब नहीं होंगे। इसलिए आपका नकली स्थान सेट रहेगा।

संबंधित मुद्दे