2016-10-07 3 views
5

एंड्रॉइड एप्लिकेशन की मुख्य गतिविधि में मैं अनुमतियों की जांच करता हूं (Manifest.permission.MANAGE_DOCUMENTS), पता लगाएं कि मेरे पास नहीं है, और requestPermisions पर कॉल करें। फिर onRequestPermissionResult में मुझे लगभग एक संवाद के बिना तुरंत अस्वीकार कर दिया जाता है।एंड्रॉइड अनुमति स्वचालित रूप से अनुरोध पर अस्वीकार कर दी गई मुख्यधारा से

मैं पहले से ही (जो काम करता है requestPermissions फिर से के माध्यम से,) एक ही एप्लिकेशन के किसी अन्य गतिविधि में एक ही अनुमति की पुष्टि की, इसलिए मैं उम्मीद यह निर्णय संग्रहीत करने के लिए किया जा (सत्र के लिए, या जो कुछ भी), और मैं कभी नहीं का चयन किया है अनुमति से इनकार करने के लिए। किसी भी तरह से, अनुमति संवाद प्रदर्शित नहीं होता है और अनुमति स्वचालित रूप से अस्वीकार कर दी जाती है।

अब तक मैंने एंड्रॉइड 7 और 6 (एपीआई 24 और 23) के अनुकरणकर्ताओं पर इसका परीक्षण किया है।

मैं कोशिश की है:

  • एप्लिकेशन के डेटा संग्रह को साफ़ करके और वाइप, तो यह इस onRequestPermissionsResult returns immediately with denied permission देखने के बाद निश्चित रूप से
  • नहीं इस Getting permission denied on Android M
  • ट्रिपल जाँच की वर्तनी ताजा है और मैं बोल रहा हूँ सुपर विधि
  • ढेर अतिप्रवाह पर अन्य सुझावों का एक समूह
private fun askForPermissionOrSendRequest(view: View, permission: String) { 
    if (checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) { 
     if (shouldShowRequestPermissionRationale(permission)) { 
      cachedView = view 
      val explanationDialog = AlertDialog.Builder(this).setMessage("We need permissions to read your storage in order to show your profile image.").setOnDismissListener { 
       requestPermissions(
         arrayOf(permission), 
         BSMainActivity.permissionRequestSendProfilePic 
       ) 
      }.create() 
      explanationDialog.show() 

     } else { 
      cachedView = view 
      // this branch is always hit - the permission seems to be missing every time 
      requestPermissions(
        arrayOf(permission), 
        BSMainActivity.permissionRequestSendProfilePic 
      ) 
     } 
    } else { 
     sendRequest(view) 
    } 
} 

मैं तुरंत मुझे अनुमतियों के लिए पूछने के लिए दिख रहा एक संवाद के बिना परिणाम हैंडलर के लिए मिलता है:मैं बहुत स्टंप्डया हूँ ...

यहाँ अनुमति अनुरोध (कोड में टिप्पणी देखें) । मैं एक ही ऐप की दूसरी (बच्चे) गतिविधि में एक ही अनुमति की पुष्टि कर सकता हूं या नहीं (ऐसा कोई फर्क नहीं पड़ता)।

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="me.monomon.bs"> 

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/> 

उत्तर

4

केवल dangerous permissions रनटाइम पर अनुरोध किया जा सकता है और MANAGE_DOCUMENTS एक खतरनाक अनुमति नहीं है:

override fun onRequestPermissionsResult(requestCode: Int, 
             permissions: Array<String>, 
             grantResults: IntArray 
) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults) 

    when (requestCode) { 
     BSMainActivity.permissionRequestSendProfilePic -> { 
      // This gets hit, MANAGE_DOCUMENTS was denied 
      if (permissions.contains(Manifest.permission.MANAGE_DOCUMENTS) && grantResults[permissions.indexOf(Manifest.permission.MANAGE_DOCUMENTS)] == PackageManager.PERMISSION_DENIED) { 
       Log.w(logName, "Permission to open image was denied while sending a tag request: %s %s".format(
         permissions.joinToString(",", "[", "]"), 
         grantResults.joinToString(",", "[", "]") 
       )) 
      } 

      // send request regardless of the result for now 
      sendRequest(cachedView) 
     } 
    } 
} 

मेरी प्रकट में मैं निम्नलिखित है।

MANAGE_DOCUMENTS documentation के अनुसार:

यह अनुमति केवल मंच दस्तावेज़ प्रबंधन एप्लिकेशन द्वारा अनुरोध किया जाना चाहिए। यह अनुमति तीसरे पक्ष के ऐप्स को नहीं दी जा सकती है।

+0

लेकिन फिर कैसे हो 'intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION)' – RecencyEffect

+1

यह एक पूरी तरह से अलग सवाल होगा के रूप में एक इरादे से चयनित फ़ाइलों को पढ़ने के लिए चाहिए क्षुधा। अगर आपको यूआरआई अनुमति पढ़ी जाती है, तो आप एक्सेस करने के लिए [openInputStream] (https://developer.android.com/reference/android/content/ContentResolver.html#openInputStream (android.net.Uri)) को कॉल कर सकते हैं चुनी हुई फाइल की सामग्री। – ianhanniballake

+0

मुझे इंटरनेट अनुमति के साथ एक ही समस्या का सामना करना पड़ रहा है ... मैं इसे कैसे संभाल सकता हूं? @ianhanniballake –

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

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