एंड्रॉइड मार्शमैलो में एक सेवा से अनुमति का अनुरोध कैसे करें


101

एंड्रॉइड मार्शमैलो में, जब कोई ऐप इंस्टॉल किया जाता है, तो एक बार में सभी के बजाय, आवश्यकता होने पर अनुमतियों का अनुरोध किया जाना चाहिए। हालाँकि, मैं केवल किसी गतिविधि से अनुमतियों का अनुरोध कर सकता हूं, जो एक समस्या है क्योंकि मेरे ऐप में केवल सेवाएँ हैं। (ऐसा क्यों है, आप पूछ सकते हैं? ऐप में एंड्रॉइड वियर वॉच फेस है, जो अंदर बंडल किया गया है, और वॉच भेजने के लिए आस-पास के सभी फ़ोन को फ़ोटो देखना है - कोई गतिविधि की आवश्यकता नहीं है। लेकिन इसके लिए स्थान अनुमतियों की आवश्यकता होती है।)

तो, क्या किसी सेवा से अनुमति का अनुरोध करने का कोई तरीका है? या किसी तरह अतीत के रूप में स्थापित समय पर दी जाने वाली अनुमतियों को मजबूर करें?


यह समस्या अनुप्रयोग वर्ग के अंदर भी है
itzhar

यह कोशिश करो यह काम हो सकता है stackoverflow.com/a/41221852/5488468
Bipin Bharti

किसी भी संदर्भ से आसानी से रनटाइम अनुमतियों को संभालने के लिए मेरी लाइब्रेरी और "फिर से मत पूछो" भी संभालती है। github.com/nabinbhandari/Android-Pokes
नबीन भंडारी

जवाबों:


47

requestPermission()केवल एक से बुलाया जा सकता है Activityऔर नहीं Service(इसके विपरीत checkPermission()केवल आवश्यकता होती है PackageManager)। तो आपको इसके लिए कुछ अतिरिक्त काम करने की आवश्यकता है; आपको Activityअपने ऐप में एक प्रदान करने की आवश्यकता है और उदाहरण के लिए, आप अपनी Serviceआवश्यकताओं की अनुमति के लिए जांच कर सकते हैं और यदि वे अभी तक प्रदान नहीं किए गए हैं, तो यह एक अधिसूचना बना सकता है और उपयोगकर्ता को एक वर्णनात्मक संक्षिप्त संदेश के साथ सूचित कर सकता है कि क्यों है एक अधिसूचना और क्या होने की जरूरत है जब वे अधिसूचना पर क्लिक करते हैं, आदि।


यह वह समाधान है जिसे बेंजामिन पॉइज़ ने प्रस्तावित किया था। आप इस पॉडकास्ट को 23:40
xiaomi

आप टुकड़े के अंदर requestPermission () भी कह सकते हैं।
मिसाघ इमामवर्दी

3
समय-समय पर स्थान अपडेट के लिए चल रही पृष्ठभूमि सेवा की जाँच के मामले में क्या समाधान है और मैं सेटिंग्स में स्थान की अनुमति को बंद कर देता हूं। चूंकि कोई गतिविधि नहीं है, यह मेरी सेवा को दुर्घटना का कारण बनता है जब मैं ऐप को फिर से खोल देता
हूं

1
@ stud91 बहुत कम से कम, जब भी आप स्थान अपडेट का अनुरोध करते हैं, सुरक्षा अपवाद या क्वेरी अनुमतियाँ पकड़ें। यह आपके ऐप को क्रैश होने से रोकेगा (हालाँकि अनुमति निरस्त होने पर आपको कोई स्थान नहीं मिलेगा)। इससे भी बेहतर: अनुमति के लिए जाँच करें, और यदि यह गायब है, तो एक अधिसूचना प्रदर्शित करें जो उपयोगकर्ता को एक गतिविधि में ले जाए जो अनुमतियों के संवाद के लिए सिर्फ एक प्लेसहोल्डर है।
user149408

8
यहां बताया गया है कि मैंने इसे कैसे हल किया है: github.com/mvglasow/satstat/blob/master/src/com/vonglasow/… इसे किसी से भी कॉल किया जा सकता है, जिसे Contextलागू भी किया जा सकता है OnRequestPermissionsResultCallback। कार्यक्षमता मानक के समान है requestPermission()
user149408

15

मैं मानता हूं, यह सेवाओं के लिए बहुत परेशानी की बात है, मुझे लगता है कि आपको इसके लिए एंड्रॉइड डेवलपर पूर्वावलोकन पृष्ठ पर एक समस्या की रिपोर्ट करनी चाहिए।

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


7

PermissionEverywhere लाइब्रेरी पर एक नज़र । यह आपको किसी भी संदर्भ से अनुमति का अनुरोध करने की अनुमति देता है।

यह एक अधिसूचना पर क्लिक करता है जिस पर यह एक गतिविधि के लिए अनुमति मांगता है।

पुस्तकालय के जीथूब पेज से नमूना कोड: -

@Override
  protected Boolean doInBackground(Void... params) {
      PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(), 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
              REQ_CODE,
              "Notification title", 
              "This app needs  a write permission", 
              R.mipmap.ic_launcher)
              .call();
      //waits..
      boolean isGranted = response.isGranted();

      if(isGranted){ //changed from isGrante to isGranted
      // Do stuff
      }
  }

1
मैं एक सेवा में async संस्करण की कोशिश की है और यह काम नहीं किया। onComplete को कभी भी कॉल नहीं किया जा रहा है
लियो डायरोडोडर

अच्छा विचार है, लेकिन यह भंडार में उपलब्ध नहीं है
naXa

2
इस पैकेज ने मेरे लिए काम किया, सुझाव के लिए धन्यवाद। मैं, हालांकि, मैं async संस्करण की कोशिश नहीं की, ध्यान देंगे। इसके अलावा, उन लोगों के लिए जिन्हें उपयोग करने में समस्या हो रही है PermissionEverywhere, सुनिश्चित करें कि आप अपने प्रकट में सहायक गतिविधि की घोषणा करते हैं और यह सुनिश्चित करते हैं कि जब आप इसे घोषित करते हैं, तो यह सही पैकेज से बंधा होता है (यदि आप PermissionEverywhereएक अलग पैकेज के रूप में उपयोग कर रहे हैं )। मुझे यह महसूस करने में बहुत समय लगा कि मैं वास्तव में PermissionEverywhereपैकेज को प्रकट में निर्दिष्ट नहीं कर रहा था ।
user3570982

मैंने PermissionEverywhereडेमो ऐप चलाया और यह काम नहीं किया।
Ixx

2

एक बहुत ही सरल पुस्तकालय है जो वास्तव में ऐसा करने की अनुमति देता है। आप कहीं से भी अनुमति प्राप्त कर सकते हैं (यहां तक ​​कि एक सेवा से), इस आधार पर कि ऐप अग्रभूमि या पृष्ठभूमि में है, यह या तो सामान्य संवाद दिखाता है या अनुमतियों के लिए पूछ रहा है एक अधिसूचना उत्पन्न करता है। कोड वास्तव में समझने में आसान है और इसका उपयोग करना वास्तव में आसान है।

इसे आजमाएँ: Android अनुमतियाँ


-2

आप ResultReceiverउपयोगकर्ताओं के उत्तर का एक रिसीवर बनाने के लिए उपयोग कर सकते हैं , फिर अधिसूचना के माध्यम से गतिविधि पर कॉलबैक के रूप में इसे पास कर सकते हैं PendingIntentसंदर्भ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.