2015-08-24 6 views
12

मैंने अभी एंड्रॉइड एम के साथ शुरुआत की है और मैं बाहरी संग्रहण तक पहुंचने में असमर्थ हूं।एंड्रॉइड एम उपयोगकर्ता अनुमति त्रुटि - पढ़ें और लिखें

compileSdkVersion 23 
buildToolsVersion "22.0.1" 

minSdkVersion 16 
targetSdkVersion 23 

पढ़ सकते हैं और से लिखने के लिए कैसे: मैं निम्न त्रुटि

Caused by: java.lang.SecurityException: Permission Denial: reading 
com.android.providers.media.MediaProvider uri 
content://media/external/images/media from pid=15355, uid=10053 requires 
android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 

मैं

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

और अपने बिल्ड फ़ाइल की तरह प्रकट में उपयोगकर्ता के अनुमति द्वारा जोड़ा जा रहा निम्न सेटिंग के साथ है मिल एंड्रॉइड एम में बाहरी भंडारण?

+1

वाह आप एक प्रश्न पूछा और तुरंत यह अपने आप को जवाब मिलीसेकंड के भीतर। आप एक असली प्रतिभाशाली हैं। –

+3

हाय @SharpEdge मुझे लगता है कि ऐसा करने के लिए यह एक अच्छा अभ्यास है। http://stackoverflow.com/help/self-answer मैंने समाधान खोजने में एक घंटे बिताए और उम्मीद है कि यह भविष्य में किसी और समय बचाएगा। :) –

+0

मुझे पता था कि नहीं था कि .. इस बयान से ही अस्तित्व में ** "आपसे एक सवाल है कि आप पहले से ही का जवाब जानने है, और आप लोगों के सामने है कि ज्ञान दस्तावेज़ ताकि दूसरों (आप सहित) इसे पा सकते हैं करना चाहते हैं बाद में "** व्यंग्यात्मक होने के लिए खेद है। –

उत्तर

20

documentation से पढ़ना। मुझे रनटाइम पर अनुमति के लिए उपयोगकर्ता से पूछना है। कोड उदाहरण: यदि उपयोगकर्ता पहले से ही अनुमति दी गई है

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

की जांच:

की तरह हम पहले करते थे प्रकट Android के लिए अनुमति जोड़ें। यदि हाँ, की अनुमति मांगी छोड़ सकते हैं और अपने काम के साथ जारी रखने और कुछ प्रवाह की अनुमति के लिए उपयोगकर्ता से पूछते हैं:

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case 2909: { 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Log.e("Permission", "Granted"); 
      } else { 
       Log.e("Permission", "Denied"); 
      } 
      return; 
     } 
    } 
} 
: यदि उपयोगकर्ता की अनुमति दे दी है या @Override OnRequestPermissionResult एक कॉलबैक प्राप्त करने के लिए इसका खंडन किया

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    if (!Settings.System.canWrite(this)) { 
     requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, 
      Manifest.permission.READ_EXTERNAL_STORAGE}, 2909); 
    } else { 
     // continue with your code 
    } 
} else { 
    // continue with your code 
} 

अब जाँच करने के लिए

मैं केवल WRITE अनुमति मांगकर बाह्य संग्रहण पढ़ने में सक्षम नहीं था, इसलिए मुझे Manifest.permission.READ_EXTERNAL_STORAGE के लिए भी अनुरोध करना पड़ा।


इसके अलावा, अगर आप api 23 से नीचे संस्करणों लक्षित करना चाहते हैं, IF बयान के साथ कार्यावधि में बिल्ड संस्करण की जाँच करें और अनुमतियां मांगेंगे केवल तभी संस्करण बराबर या Android M से ऊपर है।

+0

यह केवल वैध एपीआई स्तर 23 मान्य है? –

+0

हाय @ajit आप सही हैं, यह केवल न्यूनतम एपीआई 23 पर मान्य है! 'रनटाइम पर if' बयान से एक सरल संस्करण चेक के साथ हालांकि .. आप पिछले संस्करण के रूप में अच्छी तरह से समर्थन कर सकते हैं .. मैं जैसे ही मैं अपने कंप्यूटर पर वापस पाने के पूर्व एम समर्थन के साथ ans संपादित करेंगे .. –

+0

आज मैं एक प्रश्न पोस्ट लेकिन उचित समाधान ढूँढने के लिए सोच आप मदद कर सकते हैं मुझे –

6

यदि आप किसी भी एंड्रॉइड संस्करण में हैंडल करने के लिए एक तरीका ढूंढ रहे हैं (आप एम के लिए संकलित कर रहे हैं, लेकिन कुछ डिवाइस अन्य संस्करणों का उपयोग कर रहे हैं) तो एक संगतता संस्करण है।

if (ContextCompat.checkSelfPermission(CreatePlayerActivity.this, 
      Manifest.permission.READ_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(CreatePlayerActivity.this, 
       Manifest.permission.READ_EXTERNAL_STORAGE)) { 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

     } else { 

      // No explanation needed, we can request the permission. 

      ActivityCompat.requestPermissions(CreatePlayerActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
        MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

      // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 
    } 
1

मैं WRITE_EXTERNAL_STORAGE अनुमति के साथ संघर्ष कर रहा था: के बाद मैं यह अनुरोध किया, संवाद ने प्रतिसाद नहीं दिया और तुरंत DENIED लौट आए।

समस्या शामिल पुस्तकालयों में से एक में थी। इसमें AndroidManifest.xml में एक ही अनुमति घोषणा थी, लेकिन maxSdkVersion="22" के साथ। एप्लिकेशन की मैनिफेस्ट फ़ाइल में घोषणा लाइब्रेरी द्वारा ओवरराइड की गई थी।

पुस्तकालय मैं निम्नलिखित प्रयोग किया जाता से अनुमति ओवरराइड करने के लिए:

<uses-permission 
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
    tools:node="remove" 
    tools:selector="com.example.lib" /> 

मुझे आशा है कि यह उपयोगी हो सकता है।

2

चयनित जवाब के बारे में:

Settings.System.canWrite(this) और WRITE_EXTERNAL_STORAGE दो बहुत अलग बातें कर रहे हैं! होना चाहिए:

boolean needsRead = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED; 

    boolean needsWrite = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED; 

    if (needsRead || needsWrite) 
     requestStoragePermission() 
-1

मैंने इस उपयोगिता का उपयोग जिथब पर किया था। यह दोनों एपीआई 22 और 23. क्रम अनुमतियों को जोड़ने के साथ साथ काम करता है कठिन है, लेकिन अपने कोड अलग और चारों ओर कॉलबैक पर कब्जा करने के तरीकों स्थानांतरित करने के लिए नहीं है एक छोटे से दर्द है। यह लाइब्रेरी रनटाइम अनुमतियों का समर्थन करने के लिए आपको जो कुछ करने की ज़रूरत है, उसे करने के लिए एक जंजीर एपीआई प्रदान करता है।

https://github.com/kayvannj/PermissionUtil

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