2015-05-26 5 views
9

मैं एक लाइब्रेरी पर काम कर रहा हूं जिसका उपयोग एंड्रॉइड उपकरणों पर भूगर्भों की निगरानी के लिए किया जा सकता है। मैंने देखा है कि जब मैं स्थान सेवाओं को बंद करता हूं और डिवाइस सेटिंग्स में वापस चालू करता हूं, तो Google Play स्थान सेवा GeofencingApi क्लास के साथ पंजीकृत भूगर्भ खो जाते हैं।लाइब्रेरी में निगरानी स्थान सेटिंग्स

मैंने folks देखा है कि मुझे AndroidManifest.xml फ़ाइल में android.location.PROVIDERS_CHANGED प्रसारण रिसीवर के लिए पंजीकरण करने की आवश्यकता है। मैंने यह किया है - लेकिन जब मैं अपने परीक्षण आवेदन में परीक्षण प्रदाताओं को जोड़ता हूं और निकालता हूं तो यह प्रसारण रिसीवर केवल तब कॉल किया जाता है। डिवाइस सेटिंग्स में स्थान सेवाओं को टॉगल करते समय मुझे यह बिल्कुल प्राप्त नहीं होता है।

क्या मैं कुछ गलत कर रहा हूं? क्या किसी को पता है कि उपयोगकर्ता डिवाइस सेटिंग्स में स्थान सेवाओं को टॉगल करता है जब विश्वसनीय रूप से निर्धारित करने के लिए कैसे? मैं पृष्ठभूमि में इन घटनाओं को देखने में सक्षम होना चाहता हूं - भले ही मेरा ऐप नहीं चल रहा हो।

मुझे लगता है कि मैं पृष्ठभूमि में चलने वाला एक दोहराना कार्य स्थापित कर सकता हूं और समय-समय पर यह जांचने के लिए जांच करता हूं कि स्थान सेवाओं को टॉगल किया गया है, लेकिन यह सकल और अक्षम लगता है।

यदि यह मदद करता है, तो मैं एंड्रॉइड 4.4.2 चलाने वाले मोटो जी पर परीक्षण कर रहा हूं। भूगर्भ विज्ञान के साथ मैंने जो भी किया है, अब तक ठीक काम किया है।

संपादित करें: अधिक शोध करने के बाद मुझे पता चला है कि PROVIDERS_CHANGED प्रसारण का व्यवहार फोन संस्करण और मॉडल के आधार पर अत्यधिक चर है। एंड्रॉइड 5.1 चलाने वाला मेरा नेक्सस 5 वास्तव में ठीक काम करता प्रतीत होता है - मैं PROVIDERS_CHANGED को नियमित रूप से प्रसारित करने में सक्षम हूं। मेरे पास एक मोटो जी और मोटो एक्स फोन भी 4.4.x चल रहा है और उन्होंने कभी भी PROVIDERS_CHANGED मेरे लिए प्रसारण नहीं किया। एंड्रॉइड 4.2 पर एक सैमसंग गैलेक्सी एस 3 मेरे लिए प्रसारण का उत्पादन करेगा, लेकिन परीक्षण स्थान प्रदाताओं के साथ मैंने अपनी मानचित्र गतिविधि का उपयोग करने के बाद इसे रोकना बंद कर दिया है।

वैसे भी, मैंने अभी इस समस्या का पीछा करना बंद करने का फैसला किया है। मुझे लगता है कि एंड्रॉइड सिर्फ छोटी है।

+0

यह सहायक हो सकता है http://stackoverflow.com/questions/10311834/how-to-check-if-location-services-are-enabled भी आपने इसे रोकने के लिए स्थानीय रूप से या कहीं और भौगोलिक डेटा को सहेजने का प्रयास किया हटाए जाने से? –

+0

मैं पहले से ही geofences को स्थानीय रूप से सहेजता हूं इसलिए मैं उन्हें हमेशा के लिए खोने वाला नहीं हूं (जब तक उपयोगकर्ता कैश साफ़ नहीं करता)। वह मेरी समस्या नहीं है। मेरी समस्या यह है कि मुझे घटना नहीं मिलती है जो मुझे सूचित करता है कि स्थान प्रदाता सेटिंग्स बदल गई हैं। (यानी .: मुझे यह नहीं बताया जा रहा है कि उन्हें ओएस द्वारा हटा दिया गया है और मुझे यह नहीं बताया जा रहा है कि मेरे लिए फिर से लोड करना सुरक्षित है)। –

+1

http://stackoverflow.com/questions/25156977/google-location-services-vs-android-location-services/25160005#25160005 मैं कोड में प्रदाताओं के लिए पंजीकरण करता हूं आपको वास्तव में एक सभ्य उत्तर प्राप्त करने के लिए कुछ कोड चाहिए। 4.4.2 के साथ आईडीके शायद यह काम नहीं करता है। मैंने कई महीनों में अपने एंड्रॉइड देव पर्यावरण को नहीं निकाल दिया है। – danny117

उत्तर

7

यदि आप कुछ भी गलत कर रहे हैं तो अपना कोड देखे बिना बताना मुश्किल है, लेकिन मुझे एक गाइड के रूप में here से कोड का उपयोग करके और एक लाइब्रेरी में ब्रॉडकास्ट रिसीवर रखने के लिए इसका उपयोग करके एक सरल उदाहरण मिल रहा है और परीक्षण किया गया है।

ध्यान देने योग्य एक बात: लाइब्रेरी का उपयोग करने वाले ऐप को अपने AndroidManifest.xml में receiver होना आवश्यक होगा। here और here देखें, दोनों में @CommonsWare से जानकारी शामिल है।

यहाँ उद्धरण शामिल करना और मामले में कड़ी बुरा हो जाता है:

वहाँ स्वतंत्र रूप से अपने आप मेनिफ़ेस्ट फ़ाइल की रिसीवर के लिए रजिस्टर करने के लिए एक पुस्तकालय परियोजना के लिए कोई तरीका है?

वर्तमान समय में नहीं।

तो, आपकी लाइब्रेरी का उपयोग करने वाले किसी भी ऐप को अपने AndroidManifest.xml में receiver जोड़ा जाना आवश्यक होगा।

ध्यान दें कि यह सैमसंग एस 4 पर एंड्रॉइड 4.4.4 पर परीक्षण किया गया था।

मैं इस काम के लिए एक aar को संकलित एक पुस्तकालय परियोजना में एक BroadcastReceiver का उपयोग कर मिला है।

एक receiver तत्व यह है कि पुस्तकालय में BroadcastReceiver के लिए लिंक मुख्य अनुप्रयोग के AndroidManifest.xml में सेट अप का उपयोग करना, मैं घटना प्राप्त करने में सक्षम है जब किसी भी बदलाव के स्थान सेटिंग पर किया जाता है था:

    पर
  • स्थान
  • स्थान टॉगल उच्च सटीकता के लिए
  • बदलें स्थान मोड को टॉगल
  • बदलें स्थान मोड पावर के लिए सहेजा जा रहा है
  • बदलें स्थान मोड जीपीएस के लिए एक ही

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

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

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.location.LocationManager; 
import android.util.Log; 
import android.widget.Toast; 

public class LocationProviderChangedReceiver extends BroadcastReceiver { 
    private final static String TAG = "LocationProviderChanged"; 

    boolean isGpsEnabled; 
    boolean isNetworkEnabled; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) 
     { 
      Log.i(TAG, "Location Providers changed"); 

      LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
      isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
      isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      Toast.makeText(context, "GPS Enabled: " + isGpsEnabled + " Network Location Enabled: " + isNetworkEnabled, Toast.LENGTH_LONG).show(); 
     } 
    } 

} 

फिर, मुख्य अनुप्रयोग में, मैं libs फ़ोल्डर में संकलित myLibrary.aar रखा, और आर संकलित करने के लिए build.gradle की स्थापना:

यहाँ पुस्तकालय परियोजना में LocationProviderChangedReceiver.java है:

repositories{ 
     flatDir{ 
      dirs 'libs' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile "com.android.support:appcompat-v7:22.1.1" 
    compile "com.google.android.gms:play-services:7.3.0" 

    compile 'com.mylibrary.daniel:mylibrary:[email protected]' 

} 

सेट करें receiver मुख्य अनुप्रयोग के AndroidManifest.xml में:

<receiver 
     android:name="com.mylibrary.daniel.mylibrary.LocationProviderChangedReceiver" 
     android:exported="false" > 
     <intent-filter> 
      <action android:name="android.location.PROVIDERS_CHANGED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 

फिर, ऐप इंस्टॉल किया गया, और संशोधित स्थान सेटिंग्स को कुछ अलग तरीकों से स्थापित किया गया।

enter image description here

enter image description here

enter image description here

enter image description here

+0

आपके उत्तर के लिए धन्यवाद। मेरा कोड मूल रूप से आपके जैसा ही था।मैंने अपने ब्रॉडकास्ट रिसीवर को अपने मुख्य एप्लिकेशन और मेरी लाइब्रेरी में डालने की कोशिश की और व्यवहार वही है। ब्रॉडकास्ट रिसीवर लाइब्रेरी या ऐप में है, भले ही मैं नियमित रूप से अपने नेक्सस 5 पर प्रसारण प्राप्त कर सकता हूं। मुझे लगता है कि, जब तक मैं अपने ब्रॉडकास्ट रिसीवर को अपनी लाइब्रेरी की एंड्रॉइडमैनीफेस्ट.एक्सएमएल फ़ाइल में घोषित करता हूं और मैंने ब्रॉडल का उपयोग अपनी बिल्ड करने के लिए किया है, इससे कोई फर्क नहीं पड़ता कि ब्रॉडकास्ट रिसीवर कहां है। अन्य फोन बहुत कम विश्वसनीय हैं। मुझे लगता है कि एंड्रॉइड सिर्फ छोटी है और मैंने अब इस समस्या पर काम करना बंद कर दिया है। –

+0

हां, यह तब काम करता है जब ऐप आस-पास होता है, लेकिन जब टास्क मैनेजर से मार दिया जाता है/बंद होता है तो यह मेरे लिए काम नहीं करता है। मैं एमआई 3 डिवाइस पर एंड्रॉइड संस्करण 4.4.4 किटकैट का उपयोग कर रहा हूं। –

0

असल में, आप location.MODE_CHANGED का उपयोग करें और फिर अपने रिसीवर रजिस्टर कर सकते हैं से प्रसारण प्राप्त करने के लिए: पुस्तकालय में BroadcastReceiver हर बार ट्रिगर किया गया था यह

<receiver android:name=".Receivers.LocationModeReceiver"> 
    <intent-filter> 
     <action android:name="android.location.MODE_CHANGED" /> 
    </intent-filter> 
</receiver> 
संबंधित मुद्दे