10

क्योंकि एंड्रॉइड एसडीके 23 उपयोगकर्ताओं को कुछ कार्यक्षमताओं तक पहुंचने से इनकार करने की संभावना देता है, मैं अनुमतियों का अनुरोध करने के लिए अपने ऐप्स में से एक को अपडेट करना चाहता हूं जैसा कि यहां वर्णित है: https://developer.android.com/preview/features/runtime-permissions.htmlअभिविन्यास परिवर्तन के बाद डुप्लिकेट अनुमति अनुरोध

गतिविधियों में से एक में मैं SupportMapFragment एम्बेड करता हूं। इसे काम करने के लिए आपको WRITE_EXTERNAL_STORAGE अनुमति की आवश्यकता है, इसलिए जब मैं गतिविधि शुरू करता हूं तो मैं अनुरोध करता हूं जिसके परिणामस्वरूप अनुमति अनुरोध संवाद का निर्माण होता है।

अब समस्या यह है कि जब संवाद अभी भी खुला रहता है और मैं डिवाइस को घुमाता हूं तो गतिविधि को पुनरारंभ किया जाएगा और पुराना एक अनुरोध होने पर एक नया अनुमति अनुरोध संवाद खोल देगा। परिणाम एक दूसरे के शीर्ष पर उन दो संवादों में से एक है और इसमें से केवल एक उपयोगी है।

क्या पहले शुरू किया गया संवाद से छुटकारा पाने का कोई तरीका है?

+4

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

+0

यूप, यह करता है। ऐसा नहीं लगता था कि यह एक विकल्प होगा क्योंकि "पुराना" संवाद केवल "पुरानी" गतिविधि से जुड़ा होगा, लेकिन मैंने अभी कोशिश की और परिणाम "नई" गतिविधि से प्राप्त हुआ। – Thorben

उत्तर

11

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

उदाहरण:

// true if dialog already open 
private boolean alreadyAskedForStoragePermission = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if(savedInstanceState != null) { 
     alreadyAskedForStoragePermission = savedInstanceState.getBoolean(STORAGE_PERMISSION_DIALOG_OPEN_KEY, false); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putBoolean(KEY, alreadyAskedForStoragePermission); 
} 

private void checkStoragePermission(){ 
    if(alreadyAskedForStoragePermission){ 
     // don't check again because the dialog is still open 
     return; 
    } 

    if(ActivityCompat.checkSelfPermission(this, STORAGE_PERMISSIONS[0]) != PackageManager.PERMISSION_GRANTED){ 
     // the dialog will be opened so we have to keep that in memory 
     alreadyAskedForStoragePermission = true; 
     ActivityCompat.requestPermissions(this, STORAGE_PERMISSIONS, STORAGE_PERMISSION_REQUEST_CODE); 
    } else { 
     onStoragePermissionGranted(); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode){ 
     case STORAGE_PERMISSION_REQUEST_CODE: 
      // the request returned a result so the dialog is closed 
      alreadyAskedForStoragePermission = false; 

      if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
       onStoragePermissionGranted(); 
      } 

      break; 
    } 
} 
+0

मेरा मानना ​​है कि बंडल में एक सिस्टम बूलियन मौजूद है इन्स्टेंसस्टेट एंड्रॉइड: हैकुरेंटप्रमिशन रिवेस्ट = सत्य अगर अनुमति संवाद दिखाया गया है, हालांकि दस्तावेज़ीकरण में कोई उल्लेख नहीं मिला है। – user1991776

0

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

8

@ user1991776 जैसा कि बताया जा वहाँ वास्तव में एक गैर-दस्तावेजी अतिरिक्त होता है या नहीं, इस समय एक अनुमति संवाद खुला है, in Activity है:

private static final String HAS_CURENT_PERMISSIONS_REQUEST_KEY = 
     "android:hasCurrentPermissionsRequest"; 

लेकिन वहाँ है एक बेहतर तरीका है। यदि आप एक अनुमति दूसरी बार संवाद (एक रोटेशन के कारण) अनुरोध करते हैं, Activity स्वचालित रूप से आपके onRequestPermissionResult()with empty arrays फोन करके पुराने संवाद रद्द:

public final void requestPermissions(@NonNull String[] permissions, int requestCode) { 
    if (mHasCurrentPermissionsRequest) { 
     Log.w(TAG, "Can reqeust only one set of permissions at a time"); 
     // Dispatch the callback with empty arrays which means a cancellation. 
     onRequestPermissionsResult(requestCode, new String[0], new int[0]); 
     return; 
    } 
    Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions); 
    startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null); 
    mHasCurrentPermissionsRequest = true; 
} 

या पाठ्यक्रम इस व्यवहार isn't documented है क्योंकि इस Android है, और जो दस्तावेज़ के लिए चाहता है जटिल व्यवहार?

वैसे भी आप हमेशा onCreate() में अनुमतियों का अनुरोध कर सकते हैं और फिर शून्य-लंबाई permissions सरणी के साथ onRequestPermissionsResult() पर कॉल को अनदेखा कर सकते हैं।

+0

+ एंड्रॉइड दस्तावेज के लिए =) –

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