2012-12-13 41 views
13

From here मुझे एक फ़ाइल लिखने और अन्य ऐप और अन्य मंशा के लिए सुलभ होने का तरीका पता है, लेकिन अब Context.MODE_WORLD_READABLE को बहिष्कृत किया गया है, मैं इसे सुरक्षित रूप से कैसे पूरा कर सकता हूं?एंड्रॉइड: बहिष्कृत संदर्भ के लिए वैकल्पिक। MODE_WORLD_READABLE?

FileOutputStream out = myActivity.openFileOutput(fileTo, Context.MODE_WORLD_READABLE); 

ठीक है और अधिक जानकारी:

मैं इस का उपयोग कर रहा:

intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri, "video/*"); 

और URI एक है कि मैं एक sdcard स्थान पर लिखेंगे हो जाएगा। और वीडियो एप्लिकेशन से आएगा, इसलिए समस्या यह है कि अगर अब इसकी अनुमति नहीं है, तो मैं फ़ाइल कैसे लिख सकता हूं और इसे देख सकता हूं।

उत्तर

11

और URI एक है कि मैं एक sdcard स्थान पर लिखेंगे हो जाएगा।

यह डिफ़ॉल्ट रूप से MODE_WORLD_WRITABLE है। यह भी ध्यान रखें कि आपके द्वारा सूचीबद्ध कोड (openFileOutput()) बाहरी संग्रहण (जिसे आपने गलत तरीके से "sdcard" कहा है) पर लिखें। openFileOutput() आंतरिक भंडारण के लिए है।

और वीडियो एप्लिकेशन से आएगा, इसलिए समस्या यह है कि अगर अब इसकी अनुमति नहीं है, तो मैं फ़ाइल कैसे लिख सकता हूं और इसे देख सकता हूं।

यदि आप वास्तव में बाहरी संग्रहण में फ़ाइल लिख रहे हैं, तो बस उस फ़ाइल को इंगित करने के लिए Uri का उपयोग करें।

यदि आप आंतरिक संग्रहण में फ़ाइल लिख रहे हैं, तो उस फ़ाइल को सेवा देने के लिए ContentProvider बनाएं और ContentProvider पर इंगित Uri का उपयोग करें। Here is a sample applicationContentProvider के साथ जो पहले चलाने पर assets/ से पीडीएफ फ़ाइल निकालता है, फिर उस फ़ाइल को openFile() के माध्यम से प्रस्तुत करता है ताकि इसे पीडीएफ व्यूअर द्वारा देखा जा सके।

+0

धन्यवाद। वह जगह हिट करता है। : डी – Marl

+1

यदि एक वीडियो फ़ाइल को आंतरिक भंडारण में फ़ाइल के रूप में सहेजा गया है ('getCacheDir' द्वारा दिए गए स्थान का उपयोग करके), क्या आप कह रहे हैं कि ContentProvider किसी भी तरह एक वीडियो व्यू में यूआरआई की सेवा कर सकता है जो तब बजाने योग्य है? चूंकि आंतरिक रूप से सहेजे गए वीडियो के लिए प्रत्यक्ष यूआरआई काम नहीं करता है (मुझे लगता है कि एक वीडियो फ़ाइल द्वारा चलाने के लिए एक वीडियो फ़ाइल को दुनिया को पढ़ने योग्य होना आवश्यक है, लेकिन अगर एप्लिकेशन के निजी आंतरिक कैश में दुनिया को पठनीय नहीं किया जाता है)। –

+0

@ डैनियलस्मिथ: "क्या आप कह रहे हैं कि ContentProvider किसी भी तरह एक वीडियो व्यू के लिए यूआरआई की सेवा कर सकता है जो तब बजाने योग्य है?" - वीडियो मुश्किल है, क्योंकि आमतौर पर खिलाड़ी को एक तलाशने योग्य धारा (आगे और पीछे की ओर ले जाया जा सकता है), और एक धारा 'ContentProvider' द्वारा प्रकाशित किया जा सकता है। मुझे किसी भी वीडियो प्रारूप से अवगत नहीं है जिसे केवल एकमात्र स्ट्रीम के साथ खेला जा सकता है, हालांकि मैंने उस बिंदु पर शोध नहीं किया है। – CommonsWare

3

ऐसा लगता है कि दस्तावेज़ इसके बारे में स्पष्ट हैं।

यह लगातार एपीआई स्तर 17.

में पदावनत किया गया था दुनिया पठनीय फ़ाइलें बनाकर बहुत ही खतरनाक है, और अनुप्रयोगों में सुरक्षा छिद्र कारण होने की संभावना है। यह दृढ़ता से निराश है; इसके बजाय, अनुप्रयोगों को सामग्री प्रदाता, ब्रॉडकास्ट रिसीवर और सेवा जैसे इंटरैक्शन के लिए अधिक औपचारिक तंत्र का उपयोग करना चाहिए। गारंटी नहीं है कि यह एक्सेस मोड फ़ाइल पर रहेगा, जैसे यह बैकअप के माध्यम से जाता है और पुनर्स्थापित करता है। फ़ाइल निर्माण मोड: बनाई गई फ़ाइल तक पहुंच पढ़ने के लिए सभी अन्य एप्लिकेशन को अनुमति दें।

+0

मेरे प्रश्न के लिए और विवरण जोड़ा गया .. – Marl

7

का उपयोग कर अपने आंतरिक स्मृति में अपने वीडियो को बचाओ:

openFileOutput("test.mp4", "MODE_PRIVATE"); 

तो ऐसा करते हैं:

String path = context.getFilesDir().getAbsolutePath() + "/test.mp4"; // path to the root of internal memory. 
File f = new File(path); 
f.setReadable(true, false); 
Intent playIntent .... 
playIntent.setType("video/*"); 
playIntent.setData(Uri.fromFile(f)); 

गुड लक।

+0

धन्यवाद, यह मेरी मदद करता है, एक temp फ़ाइल के लिए sdcard का उपयोग नहीं करना चाहता था, ध्यान दें कि यह एपीआई 9 या उच्चतर है, इसलिए अपी 8 के लिए mode_world_readable का उपयोग करके समाप्त हो गया है, और यह 9 और उच्चतर के लिए है। –

+0

बेशक सबसे अच्छा विकल्प ContentProvider है, कुछ मामलों में यह काम नहीं करेगा। उदाहरण के लिए, खिलाड़ी वीडियो फ़ाइल के उसी स्थान पर सहेजी गई srt फ़ाइलों तक नहीं पहुंच सकते हैं और उसी नाम का उपयोग करते हैं, भले ही हम srt फ़ाइलों के लिए रीडबल सेट करते हैं। – hasan83

+0

@ hasan83 अगर मैं फ़ाइल/डेटा/कॉम पर फ़ाइलऑटपुटस्ट्रीम का उपयोग कर फ़ाइल लिखता हूं। ****। ***/myfolder, यह मुझे किसी भी कारण से फ़ाइल को पढ़ने की इजाजत नहीं देता है? – NitZRobotKoder