2015-09-01 7 views
5

के लिए एंड्रॉइड फ़ाइलप्रोवाइडर उदाहरण के लिए गैलरी के संपर्क में आने के लिए मैं अपनी आंतरिक फ़ाइलों के लिए फ़ाइलप्रोवाइडर का उपयोग कर रहा हूं। इसे और अधिक वर्दी बनाने के लिए, मैंने अपनी बाहरी फाइलें प्रदाता (बाहरी पथ के माध्यम से) में भी डाल दीं लेकिन हटाने योग्य एसडी कार्ड में फ़ाइलों के लिए यह काम नहीं करता है। उस फ़ोल्डर की तरह कुछ कहना अधिकृत नहीं है।ext sdcard

किसी भी मदद की सराहना की जाएगी।

Thx

उत्तर

1

एंड्रॉयड 4.4 से शुरू, सामान्य एप्लिकेशन के अपने पैकेज-विशिष्ट निर्देशिका में छोड़कर माध्यमिक बाहरी मेमोरी डिवाइस है, यानी एसडी कार्ड, का उपयोग करने की अनुमति नहीं है, भले ही आप WRITE_EXTERNAL_STORAGE अनुमति का अनुरोध किया है।

WRITE_EXTERNAL_STORAGE अनुमति केवल डिवाइस पर प्राथमिक बाहरी संग्रहण पर पहुंच पहुंच प्रदान करनी होगी। ऐप्स को को संकुल-विशिष्ट निर्देशिकाओं को संश्लेषित अनुमतियों के अनुसार अनुमति देने के अलावा, माध्यमिक बाहरी स्टोरेज डिवाइस पर लिखने की अनुमति नहीं दी जानी चाहिए। इस तरह से लिखने पर प्रतिबंध सुनिश्चित करता है कि सिस्टम अनइंस्टॉल किए जाने पर सिस्टम फ़ाइलों को साफ़ कर सकता है।

https://source.android.com/devices/storage/

+0

धन्यवाद! लेकिन मुझे लगता है कि हालांकि मुझे थोड़ा सा झटका लगता है। देखें, दस्तावेज़ों में यह कहा गया है कि बाहरी संग्रहण को सतह पर रखा जाना चाहिए यदि यह बैटरी डिब्बे में एसडी कार्ड स्लॉट की तरह अर्ध-स्थायी है। लेकिन आप कह रहे हैं कि एसडी कार्ड एक माध्यमिक एक्स्टर्नल स्टोरेज है जो मुझे लगता है और 4.4 के रूप में यह स्टोरेज एपीआई के माध्यम से सामने नहीं आया है। – zgulser

+0

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

+1

इस मामले को और भी भ्रमित करने के लिए, यह 'आंतरिक भंडारण' आता है, सच यह है कि सभी फोन में 'आंतरिक स्मृति' होना चाहिए, केवल बड़ा या नहीं। उसी उदाहरण का प्रयोग करें, Defy की आंतरिक स्मृति छोटी है, और केवल 'आंतरिक भंडारण' के रूप में उपयोग की जाती है, जबकि नए मॉडल में आमतौर पर बड़ी आंतरिक मेमोरी होती है, इसलिए इसका केवल एक हिस्सा 'आंतरिक संग्रहण' –

5

के FileProvider कोड पर एक नज़र डालें:

private static PathStrategy parsePathStrategy(Context context, String authority) 
     ... 
     int type; 
     while ((type = in.next()) != END_DOCUMENT) { 
      if (type == START_TAG) { 
       final String tag = in.getName(); 
       final String name = in.getAttributeValue(null, ATTR_NAME); 
       String path = in.getAttributeValue(null, ATTR_PATH); 
       File target = null; 
       if (TAG_ROOT_PATH.equals(tag)) { 
        target = buildPath(DEVICE_ROOT, path); 
       } else if (TAG_FILES_PATH.equals(tag)) { 
        target = buildPath(context.getFilesDir(), path); 
       } else if (TAG_CACHE_PATH.equals(tag)) { 
        target = buildPath(context.getCacheDir(), path); 
       } else if (TAG_EXTERNAL.equals(tag)) { 
        target = buildPath(Environment.getExternalStorageDirectory(), path); 
       } 
       if (target != null) { 
        strat.addRoot(name, target); 
       } 
      } 
     } 
     return strat; 
    } 

FileProvider टैग root-path (DEVICE_ROOT निरंतर) की मदद से निर्देशिका का निरपेक्ष pathes स्वीकार कर लिया। तो बस नीचे की तरह माध्यमिक बाहरी डिस्क में अपनी फ़ाइलें फ़ोल्डर में निरपेक्ष पथ जोड़ें:

<root-path path="/storage/extSdCard/Android/data/com.edufii/files/image/" name="image-ext2" /> 
<root-path path="/storage/extSdCard/Android/data/com.edufii/files/video/" name="video-ext2" /> 
<root-path path="/storage/extSdCard/Android/data/com.edufii/files/datafile/" name="datafile-ext2" /> 
<root-path path="/storage/extSdCard/Android/data/com.edufii/files/audio/" name="audio-ext2" /> 

नोट official documentation<root-path> के बारे में कुछ नहीं कहा, तो यह एक भविष्य में बदल सकता है।

0

FileProvider द्वितीयक बाह्य भंडारण (जैसे हटाने योग्य एसडी कार्ड) का समर्थन नहीं करता है। एंड्रॉइड 7 और उससे ऊपर में यह एक और मुद्दा है - क्योंकि आप अब file:// यूरी का उपयोग नहीं कर सकते हैं।

मैंने पहले से ही एक बग रिपोर्ट here जारी की है।

+2

मेरी AVD एसडी कार्ड भंडारण एक्सएमएल पथ फ़ाइल पर यह कोशिश की है और यह काम <एक्सएमएल संस्करण = "1.0" एन्कोडिंग = "utf-8"?> <रास्तों xmlns: एंड्रॉयड = "http://schemas.android .com/apk/res/android "> <बाहरी-पथ नाम =" बाहरी_फाइल "पथ ="। "/> <रूट-पथ नाम =" बाहरी_फाइल "पथ ="/भंडारण/"/> – Gubatron

3

मैंने अपने रूट में @ गुबेट्रॉन द्वारा सुझाए गए रूट रूट को जोड़ा और यह काम करता है।

<?xml version="1.0" encoding="utf-8"?> 
<paths> 
    <external-path name="external_files" path="."/> 
    <root-path name="external_files" path="/storage/" /> 
</paths> 
+0

दूसरी पंक्ति, मेरे दिन बचाया ... –

0

मुझे पूरी तरह से यकीन नहीं है कि क्यों, लेकिन root-path मेरे लिए काम नहीं किया। इसके अलावा, यह दस्तावेज नहीं है, इसलिए एक मौका हो सकता है कि यह अचानक कुछ बिंदु पर गायब हो जाएगा। तो मैं निम्नलिखित का उपयोग कर समाप्त हो गया।

<external-files-path name="external_files_path" path="/"/> 

File file = new File(getActivity().getExternalFilesDir(null), "hello.txt"); 

फ़ाइल /storage/emulated/0/Android/data/MY_APP/files/hello.txt में संग्रहीत किया जाता है, जो एसडी कार्ड में मेरे ऐप की खुद भंडारण स्थान है।

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