2015-09-14 7 views
7

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

तो Storage Access Framework documentation के अनुसार मैं निरंतर अनुमतियों का उपयोग करता हूं जो उपयोगकर्ता को आपके ऐप के माध्यम से फ़ाइलों तक लगातार पहुंच प्रदान करता है, भले ही डिवाइस को पुनरारंभ किया गया हो।

हालांकि, कुछ समय बाद मैंने देखा कि कुछ उपयोगकर्ताओं के लिए अनुमतियों को निरस्त कर दिया गया था। क्योंकि जब मैं लिखने के लिए एसएएफ का उपयोग करने की कोशिश कर रहा हूं, तो मुझे उस अपवाद के बाद android.system.ErrnoException: open failed: EACCES (Permission denied) मिल गया है, मैं जांचता हूं कि mContext.getContentResolver().getPersistedUriPermissions() का उपयोग करके मुझे कौन सी अनुमतियां मिलती हैं, हालांकि यह खाली सूची लौटाती है। मुझे यकीन है कि उपयोगकर्ता मुझे सही अनुमति प्रदान करता है और वर्तमान में स्थापित एसडी कार्ड के लिए अनुमतियां हैं, क्योंकि मैं डेटाबेस में इस क्रिया को ट्रैक करता हूं।

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

अनुमतियों को रद्द करने का कारण क्या हो सकता है? और मैं इस निरसन को कैसे रोक सकता हूं?

मैंने अपने सभी उपकरणों पर फोन के कई रीबूट, समय बदलने, एसडी कार्ड डालने को हटाने का परीक्षण किया है, लेकिन किसी भी सुरक्षित अनुमति को खोने में सक्षम नहीं था।

private void openDocumentTree() { 
     Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
     intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     startActivityForResult(intent, REQUEST_CODE); 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) { 
      Uri treeUri = data.getData(); 
      final int takeFlags = data.getFlags() & ( 
        Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
      mContext.getContentResolver().takePersistableUriPermission(treeUri, 
        takeFlags); 

        //this is my internal class for saving and restoring tree uri permissions. 
        final Permission permission = Permission.from(treeUri); 
        mPermissionDao.save(permission); 
     } 
    } 
+1

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

+0

मैं ऐप के विशिष्ट कारणों से केवल एसडी कार्ड पर फ़ाइलों के साथ काम करने के लिए सुरक्षित उपयोग कर रहा हूं, बाहरी भंडारण प्रदाता के साथ काम करने का एकमात्र कारण है। मैं जांचता हूं कि पेड़ उरी बाहरी भंडारण के प्रारूप में है। –

+0

शायद उपयोगकर्ता ने प्रदाता से फ़ाइल को हटा दिया - यह संभव नहीं है, क्योंकि, मुझे पेड़ उरी मिली है जो बाह्य भंडारण के रूट पथ का प्रतिनिधित्व करती है। इसे हटाने का कोई तरीका नहीं है। साथ ही, जैसा कि मैंने उल्लेख किया है, मैं नई फाइलें बनाने में सक्षम नहीं था (यह 'android.system.ErrnoException' फेंक रहा था) और 'getContentResolver()। GetPersistedUriPermissions()' खाली सूची लौटा दी गई। तो उपयोगकर्ता किसी भी तरह से अनुमतियों को निरस्त कर दिया। –

उत्तर

1

आप जब ACTION_OPEN_DOCUMENT_TREE का अनुरोध अतिरिक्त झंडे की जरूरत है:

मैं अनुमतियाँ प्राप्त करने के लिए अगले कोड है।

openDocumentTreeFLAG_GRANT_PERSISTABLE_URI_PERMISSION के लिए

private void openDocumentTree() { 
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
    intent.addFlags(
     Intent.FLAG_GRANT_READ_URI_PERMISSION 
     | Intent.FLAG_GRANT_WRITE_URI_PERMISSION 
     | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION 
     | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); 
    startActivityForResult(intent, REQUEST_CODE); 
} 

समीक्षा डॉक्स और FLAG_GRANT_PREFIX_URI_PERMISSION

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