2011-02-17 13 views
5

मैं एक विधि लिख रहा हूं जो एक जीपीएस सेंसर मौजूद और सक्षम होने पर सत्य वापस आ जाएगा, लेकिन अगर अनुपस्थित है या बंद हो गया है तो वह झूठी वापसी करता है। यह कड़ी मेहनत कर रहा है क्योंकि ...एक जीपीएस सेंसर की उपस्थिति की जांच कैसे करें?

hasSystemFeature("FEATURE_LOCATION_GPS") // on PackageManager 

गलत है, चाहे डिवाइस में एक जीपीएस है या नहीं। तो यहां तक ​​कि एक डिवाइस पर भी एक है, और यह चालू है, यह अभी भी झूठी वापसी करता है। मुझे पूरी तरह से गलत लगता है, लेकिन मैं नहीं देख सकता क्यों।

isProviderEnabled("gps") // on LocationManager 

सच है, यहां तक ​​कि मेरे यहां मौजूद डिवाइस पर भी कोई जीपीएस हार्डवेयर नहीं है। यह पूरी तरह से प्रतिद्वंद्वी लगता है।

मैं स्वीकार करता हूं कि ये परिणाम हो सकते हैं क्योंकि मुझे कुछ याद आ रहा है, एसडीके सहज नहीं है, या शायद यहां तक ​​कि जिन उपकरणों के साथ मैं परीक्षण कर रहा हूं वे अजीब तरीके से व्यवहार कर रहे हैं।

मुझे क्या याद आ रही है?

उत्तर

13

यह काम करना चाहिए। जब आप यह कॉल करते हैं तो लॉगकैट में कोई त्रुटि संदेश है?

PackageManager pm = getPackageManager(); 
boolean hasGps = pm.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS); 
+0

कोई त्रुटि नहीं है, लेकिन यह उस डिवाइस पर सच है, जिसमें एक जीपीएस नहीं है (एडवेंट वेगा 10 "गैर-Google- अनुमोदित टैबलेट)। शायद टैबलेट को दोष देना है और ओएस गलत तरीके से स्थापित है डिवाइस –

+1

वैसे डिवाइस डेवलपर को एसडीके पैकेज मैनेजर सार के बाद से पैकेजमैनेजर क्लास को कार्यान्वित करना होगा। यह पहली बार नहीं होगा जब डिवाइस डेवलपर ने कुछ तोड़ दिया। –

+0

मैंने इसे किंडे फायर (जीपीएस के बिना) पर परीक्षण किया और यह एक जैसा काम करता है आकर्षण। (मुझे लगता है कि गैर-Google अनुमोदित क्रेप्स का समर्थन करने के लायक नहीं है) –

1

आपका hasSystemFeature() शायद हमेशा गलत रिटर्न क्योंकि FEATURE_LOCATION_GPS एक निरंतर के लिए एक संदर्भ है, और एक स्ट्रिंग नहीं शाब्दिक। मेरा मानना ​​है कि वर्तमान स्ट्रिंग शब्दशः यह वास्तव में "android.hardware.location.gps" इंगित करता है।

LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
if(!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
    //Ask the user to enable GPS 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("Location Manager"); 
    builder.setMessage("Would you like to enable GPS?"); 
    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      //Launch settings, allowing user to make a change 
      Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      startActivity(i); 
     } 
    }); 
    builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      //No location service, no Activity 
      finish(); 
     } 
    }); 
    builder.create().show(); 
} 

मैं बाहर बात करने के लिए है कि आप उन्हें जीपीएस सक्षम है करने के लिए सीधे स्थान सेटिंग पृष्ठ पर उपयोगकर्ता ले जा सकते हैं AlertDialog के बारे में अतिरिक्त कहा:

मेरा मानना ​​है कि आप के लिए क्या देख रहे कुछ इस तरह है Settings.ACTION_LOCATION_SOURCE_SETTINGS इरादा कार्रवाई का उपयोग कर।

आशा है कि मदद करता है!

+0

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

+1

मैंने बहुत जल्द बात की। हैसिस्टमफेचर ("android.hardware.location.gps") जीपीएस और डिवाइस के बिना डिवाइस दोनों के लिए सच है। कितना निराशाजनक है कि इतना आसान साबित करना इतना कठिन साबित हो रहा है। isProviderEnabled (स्थान।GPS_PROVIDER) अभी भी सत्य लौट रहा है, भले ही डिवाइस में कोई जीपीएस न हो। –

+0

आपके द्वारा परीक्षण किए जा रहे दो डिवाइस क्या हैं? साथ ही, मैंने सोचा कि मैं यह इंगित कर सकता हूं कि 'LocationManager.getAllProviders()' में 'वापस स्थानांतरित नहीं किया जाएगा। GPS_PROVIDER' उसकी लौटाई गई सूची में यदि यह समर्थित नहीं है, तो यह जांचने का एक और तरीका होगा कि जीपीएस मौजूद है या नहीं। – Devunwired

2

मामले में डिवाइस जीपीएस हार्डवेयर निम्नलिखित नहीं है जब सत्य है:

locationManager.getProvider(LocationManager.GPS_PROVIDER) == null; 

कहाँ

LocationManager locationManager = (LocationManager) AppCore.context().getSystemService(Context.LOCATION_SERVICE); 

मेरे मामले में * hasSystemFeature (PackageManager.FEATURE_LOCATION_GPS) * सच है भले ही डिवाइस रिटर्न जीपीएस नहीं है। तो यह विश्वसनीय नहीं है।

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