2015-11-23 7 views
32

मैं बूट पर शुरू होने वाली सेवा का उपयोग कर रहा हूं और स्थान अपडेट की जांच करना शुरू कर देता हूं। एक बार जब मैं अनुमति पॉपअप पर स्थान पहुंच से इंकार कर देता हूं तो एंड्रॉइड एम के लिए धन्यवाद, फोन बूट होने के बाद मेरी सेवा दुर्घटनाग्रस्त हो जाती है।किसी सेवा से स्थान अनुमतियों का अनुरोध करें Android M

के बाद से मैं इस मामले में कोई गतिविधि है requestPermissions() करने के लिए कॉल एक ClassCastException मेरी सेवा Context के रूप में एक गतिविधि में ढाला नहीं जा सकते हैं देता है।

मेरे विधि कॉल:

ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION); 

कोई समाधान अब तक यह करने के लिए है या मैं करने के लिए नहीं इस तरह के एक राज्य में चलाने सेवा अधिकारों को रद्द करने की क्या ज़रूरत है।

+1

सेवा का उपयोग कर सकते हैं ** ContextCompat.checkSelfPermission() ** अनुमति उपलब्धता देखने के लिए: यदि आप सेवा पर permitions जाँच के बाद, आप permition अनुरोध करने के लिए गतिविधि की आवश्यकता होगी कुछ काम करने से पहले। –

+0

@ धवल पटेल हाँ समस्या एक सेवा के अंदर अनुरोध अनुमतियों में है। ऐसा लगता है कि ऐसा करने के लिए अभी तक कोई तरीका नहीं है – stud91

+3

उपयोगकर्ता को अनुमति देने के लिए कहने के लिए अधिसूचना को आग लग सकती है। –

उत्तर

40

आप किसी सेवा के माध्यम से अनुमति का अनुरोध नहीं कर सकते हैं, क्योंकि एक सेवा यूआई से बंधी नहीं है, इस तरह की समझ में आता है। चूंकि एक सेवा संदर्भ एक गतिविधि नहीं है क्योंकि आप जो अपवाद प्राप्त कर रहे हैं वह समझ में आता है।

आप जांच सकते हैं कि सेवा में अनुमति उपलब्ध है या किसी गतिविधि में अनुमति का अनुरोध करें (हाँ आपको एक गतिविधि की आवश्यकता है)।

एक सेवा में:

public static boolean checkPermission(final Context context) { 
return ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
     && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; 
} 

और एक गतिविधि में:

private void showPermissionDialog() { 
    if (!LocationController.checkPermission(this)) { 
     ActivityCompat.requestPermissions(
      this, 
      new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 
      PERMISSION_LOCATION_REQUEST_CODE); 
    } 
} 
+4

@VitaliyA सेवा अनुमति की जांच कर सकती है, लेकिन अनुरोध नहीं कर सकती है, क्योंकि इसमें कोई यूआई नहीं है। – geNia

+0

आप सही हैं, मेरा जवाब अनुपालन नहीं है। –

+2

यदि आप Manifest.permission.ACCESS_COARSE_LOCATION या ठीक स्थान का उपयोग एंड्रॉइड उपसर्ग को हल नहीं कर सकते हैं ... इस तरह: android.Manifest.permission.ACCESS_COARSE_LOCATION – Bartando

9

आप आवेदन संदर्भ का उपयोग करके गतिविधि के बिना अनुमति की जांच कर सकते हैं, लेकिन जब permitions का अनुरोध आप गतिविधि की आवश्यकता होगी। ऐप संदर्भ प्राप्त करने के लिए बस getApplicationContext() पर कॉल करें और अनुमतियों की जांच करने के लिए ContextCompat.checkSelfPermission() का उपयोग करें।

जांच करने के लिए यदि आप एक अनुमति है, फोन ContextCompat.checkSelfPermission() विधि:

भी अच्छी जानकारी correct way में क्रम अनुमतियों का उपयोग करने के लिए कैसे नहीं है। एप्लिकेशन की अनुमति है

// Assume thisActivity is the current activity 
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, 
     Manifest.permission.WRITE_CALENDAR); 

हैं, तो विधि रिटर्न PackageManager.PERMISSION_GRANTED, और एप्लिकेशन कार्रवाई को आगे बढ़ा सकते हैं: उदाहरण के लिए, इस स्निपेट अगर गतिविधि कैलेंडर के लिए लिखने की अनुमति है की जाँच करने के लिए कैसे पता चलता है । यदि ऐप की अनुमति नहीं है, तो विधि PERMISSION_DENIED लौटाती है, और ऐप को उपयोगकर्ता को अनुमति के लिए स्पष्ट रूप से पूछना होगा।

संपादित करें:

public static void requestPermissions (Activity activity, String[] permissions, int requestCode) 
+0

https://developer.android.com/training/permissions/requesting.html#java पर स्पष्टीकरण से पता चलता है कि अनुमतियों का अनुरोध कैसे करता है एक पर निर्भर करता है ReequestPermissionsResult हैंडलर आग लगाना। अनुमति अनुरोध के पूरा होने को रोकने के लिए आपको यही आवश्यकता है। – pollaris

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