2012-09-07 8 views
12

ठीक है, यह वास्तव में एक प्रश्न नहीं है, क्योंकि मैं वास्तव में अपने कोड पर "अटक गया" नहीं हूं, लेकिन मुझे बाहरी स्टोरेज और File.createTempFile() विधि तक पहुंचने के संबंध में एंड्रॉइड एपीआई के लिए कुछ अजीब व्यवहार मिला है, और मैं समझना चाहता हूं कि क्या हो रहा है ...Android पर अस्थायी फ़ाइलों को बनाने का सबसे अच्छा तरीका क्या है?

कृपया ध्यान दें कि मेरा मैनिफेस्ट <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"> शामिल नहीं है।


भाग 1:

मैं निम्नलिखित कोड जो एक आकर्षण के रूप में काम करता है:

File tempFile = new File(Environment.getExternalStorageDirectory(), 
         "my_temp_file.png"); 

यह मेरे लिए एक अस्थायी फ़ाइल बनाता है, और मैं datas लिख सकते हैं बिना किसी परेशानी के।

प्रश्न 1: यह क्यों काम करता है, क्योंकि मुझे अपने एसडीकार्ड पर लेखन अधिकार नहीं होना चाहिए?


भाग 2:

मैं createTempFile जो अस्थायी फ़ाइल बनाने के लिए सरकारी तरीका है का उपयोग करने के लिए अपने कोड बदलने की कोशिश की है। तो मैं कोशिश की है:

File tempFile = File.createTempFile("my_temp", "png", 
         Environment.getExternalStorageDirectory()); 

और मेरे Manifest.xml में WRITE_EXTERNAL_STORAGE गयी। अंदाज़ा लगाओ ? यह काम नहीं करता है, और मैं प्राप्त एक java.io.IOException:

09-07 14:07:29.061: E/_CLOG(19982): java.io.IOException: Permission denied 
09-07 14:07:29.061: E/_CLOG(19982):  at java.io.File.createNewFileImpl(Native Method) 
09-07 14:07:29.061: E/_CLOG(19982):  at java.io.File.createNewFile(File.java:1257) 
09-07 14:07:29.061: E/_CLOG(19982):  at java.io.File.createTempFile(File.java:1322) 
09-07 14:07:29.061: E/_CLOG(19982):  at com.(...).onClick(ProfileImageUpdater.java:58) 

प्रश्न 2: क्यों यह काम नहीं करता है, जबकि imho यह होना चाहिए?

+1

क्या आपने दो बार जांच की थी? –

+0

हाँ बिल्कुल :) दोनों मामलों –

+0

आप कौन से एंड्रॉइड एपीआई का उपयोग कर रहे हैं? मेरा मानना ​​है कि अगर कोई एपीआई स्तर 4 पर सेट करता है तो कुछ अनुमति – tomi

उत्तर

0

मुझे अंत में पता चला कि क्या हो रहा था ...

प्रश्न 1: वास्तव में, बनाई गई फ़ाइल का उपयोग सिस्टम एप्लिकेशन द्वारा उपयोगकर्ता की गैलरी से एक छवि को पुनर्प्राप्त करने और फसल करने के लिए किया जाना था। इसलिए मेरे ऐप को WRITE_EXTERNAL_STORAGE अनुमति का स्वामित्व नहीं होना था, क्योंकि फ़ाइल सिस्टम द्वारा ही लिखी गई थी।

प्रश्न 2: मुझे यकीन नहीं है। मुझे लगता है कि एंड्रॉइड एक अस्थायी फ़ाइल बनाने की अनुमति नहीं देता है जहां मैं कोशिश कर रहा था (क्योंकि यह इसके लिए सही जगह नहीं है)

4

आपको यह त्रुटि मिल रही है क्योंकि आप बाहरी स्टोरेज को लिखने के लिए manifest.xml अनुमति की घोषणा करते हैं। आपको यह अनुमति जोड़ने की जरूरत है।

भी, कभी भी कभी भी getExternalStorage() पर कभी भी कभी भी फाइलें (विशेष रूप से अस्थायी वाले) नहीं लिखते हैं।

यह सीधे एसडी कार्ड पर रखेगा और एक गड़बड़ करेगा। अस्थायी फ़ाइलों के लिए किया जाता है कि केवल अपने स्वयं के आवेदन के द्वारा देखा जा करने के लिए आप का उपयोग करना चाहिए:

getExternalStorage() + "/Android/data/<package_name>/cache/" 

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

संपादित करें:

कृपया ध्यान दें कि मेरे प्रकट

आप के लिए है शामिल नहीं है!

संपादित करें: भी, यदि आप अस्थायी मीडिया फ़ाइलों को बनाने (उदाहरण के लिए पीएनजी) एक खाली उस फ़ोल्डर पर .nomedia नामित फ़ाइल बनाने के लिए अच्छा अभ्यास है। इस तरह आप इसे स्कैन करने वाले मीडिया स्कैनर से बचते हैं और इसे गैलरी पर दिखाते हैं।

अंतिम संपादन:

और फ़ाइलों को बनाने से पहले आप फ़ोल्डर फ़ाइल वस्तु पर mkdirs() फोन करके बनाना होगा।

+0

मुझे लगता है कि आपका मतलब है 'नई फ़ाइल (पर्यावरण .getExternalStorageDirectory(), "/ एंड्रॉइड/डेटा//कैश/temp_crop_file.png ");'? –

+0

मैं केवल फ़ोल्डर को इंगित कर रहा था। फिर आप वहां मौजूद कोई भी फाइल बनाते हैं। =] और यह न भूलें कि आपको मेनिफेस्ट पर निर्णय लेना है या नहीं तो आपको हमेशा एक त्रुटि मिल जाएगी। – Budius

+0

निर्देशिका (अच्छी बिंदु) और .nomedia (बहुत अच्छी बात) के बारे में टिप के लिए धन्यवाद। हालांकि, जब आप कहते हैं कि "आपको करना है" तो आपने सावधानीपूर्वक मेरे प्रश्न को नहीं पढ़ा। मेरा पहला कोड काम करता है, लेकिन मैं पूछ रहा हूं: "यह क्यों काम करता है", नहीं, "इसे काम करने के लिए मुझे क्या करना है"। :) –

12

इस तरह की कोशिश ...

File outputDir = context.getCacheDir(); // context being the Activity pointer 
File outputFile = File.createTempFile("prefix", "extension", outputDir); 

संपादित करें: के लिए

प्रश्न 2

यह लिंक नीचे के रूप में मुद्दा हो सकता है ...

Environment.getExternalStorageDirectory does not return the path to the removable storage

+0

मैंने कोशिश की और आप सही हैं, यह काम करता है, और बाहरी डीआईआर की तुलना में अस्थायी फ़ाइलों के लिए यह एक बेहतर जगह है। हालांकि, यह मेरे सवालों का जवाब नहीं देता है ... कृपया, पुनः पढ़ें। –

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