2015-07-01 7 views
6

के लिए स्टोरेज एक्सेस फ्रेमवर्क के भीतर उपलब्ध स्थान निर्धारित करना मेरे पास एक ऐसा एप्लिकेशन है जो उपयोगकर्ता को OPEN_DOCUMENT_TREE का उपयोग करके SAF के माध्यम से अपने मीडिया गंतव्य का चयन करने की अनुमति देता है। चूंकि नई मीडिया फाइलें जोड़ दी गई हैं, इसलिए मैं यह सुनिश्चित करने के लिए जांच करना चाहता हूं कि इसे भरने के बजाय न्यूनतम मात्रा में स्थान हो। गंतव्य का आकार ज्ञात होने पर भी फ़ाइल कैश की मात्रा चुनने के लिए इसका उपयोग किया जा सकता है।5.0+ ओएस ver

AFAIK, DocumentFile, आदि, आपको कुछ भी नहीं देता है। तकनीकी रूप से, यदि आप OPEN_DOCUMENT_TREE के माध्यम से जाते हैं, तो वास्तविक गंतव्य ज्ञात नहीं है, जबकि यह एसडीकार्ड हो सकता है, यह क्लाउड गंतव्य भी हो सकता है।

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

मैं मानक getFilesDir या getMediaFilesDir का उपयोग करके उपलब्ध एसडीकार्ड की जगह प्राप्त कर सकता हूं और उपलब्ध स्थान प्राप्त करने के लिए फ़ाइल का उपयोग कर सकता हूं।

तो यदि आपके पास केवल दस्तावेज़फ़ाइल ऑब्जेक्ट है तो स्पेस कैसे ढूंढें?

+0

मैं इसकी जांच कर रहा हूं। जब आप OPEN_DOCUMENT_TREE के साथ अपना इरादा बनाते हैं तो आप किस श्रेणी और एमआईएम प्रकार का उपयोग करते हैं? मैं एक संयोजन खोजने में सक्षम नहीं हूं जो काम करता है। –

+0

अच्छा ... कोई नहीं, यह एक निर्देशिका है और फाइल नहीं है। तो बस इरादा (Intent.ACTION_OPEN_DOCUMENT_TREE) फिर परिणाम के साथ गतिविधि शुरू करें। मैं निर्देशिका प्राप्त करने और इसका उपयोग करने में सक्षम हूं, बस अभी उपलब्ध स्थान की आवश्यकता है। – Bruce

+0

@ ब्रूस क्या आपने यह काम किया? खुद को एक ही समस्या है। धन्यवाद। – brindy

उत्तर

3

ठीक है, मुझे किसी प्रकार का समाधान मिला है। यह एंड्रॉइड 5.1 सेट-टॉप-बॉक्स पर परीक्षण किया गया था। सबसे पहले, ACTION_OPEN_DOCUMENT_TREE से TreeUri प्राप्त करें। फिर निम्न कार्य करें:

Uri docTreeUri = DocumentsContract.buildDocumentUriUsingTree(
      treeUri, 
      DocumentsContract.getTreeDocumentId(treeUri) 
    ); 
    try { 
     ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(docTreeUri, "r"); 
     assert pfd != null; 
     StructStatVfs stats = Os.fstatvfs(pfd.getFileDescriptor()); 
     Log.i(LOG_TAG, "block_size=" + stats.f_bsize + ", num_of_blocks=" + stats.f_bavail); 
     Log.i(LOG_TAG, "free space in Megabytes:" + stats.f_bavail * stats.f_bsize/1024/1024); 
    } catch (FileNotFoundException | ErrnoException e) { 
     Log.e(LOG_TAG, Log.getStackTraceString(e)); 
    }