2012-05-09 9 views
10

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

मैं एक फ़ाइल ऑब्जेक्ट बनाना चाहता हूं और वास्तविक भौतिक फ़ाइल से डेटा प्राप्त करने के बजाय मैं खुद को बफर प्रदान करना चाहता हूं।

फिर, मैं इस फ़ाइल का उपयोग करना चाहता हूं, जो वास्तव में एसडीकार्ड में या मेरे ऐप के बाहर कहीं भी मौजूद नहीं है, इसे एक नाम दें और इसे एक अनुलग्नक के रूप में ईमेल द्वारा भेजें (EXTRA_STREAM का उपयोग करके)।

मैं, कोड की निम्न बिट पाया Adriaan Koster (@adriaankoster), पोस्ट Write byte[] to File in Java

// convert byte[] to File 
ByteArrayInputStream bis = new ByteArrayInputStream(bytes); 
ObjectInputStream ois = new ObjectInputStream(bis); 
File fileFromBytes = (File) ois.readObject(); 
bis.close(); 
ois.close(); 

System.out.println(fileFromBytes); 

मैं इसे इस्तेमाल किया इस समारोह

private File fileFromBytes(byte[] buf) { 
    File f = null; 
    try { 
     ByteArrayInputStream bis = new ByteArrayInputStream(buf); 
     ObjectInputStream ois = new ObjectInputStream(bis); 
     f = (File) ois.readObject(); 
     bis.close(); 
     ois.close(); 
    } 
    catch (Exception e) {} 
    return f; 
} 

बनाने के लिए और यहाँ कर रहा है मैं कहाँ हूँ अटक, क्योंकि जब मैं इसे का उपयोग करें:

// When sent as body the mail is sent OK 
// emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, dump()); 

// When I try to attach the mail is empty 
emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, fileFromBytes(dump().getBytes())); 

मैं उदाहरण से पता मैंने देखा है से cond तर्क एक यूआरआई होना चाहिए, लेकिन: मैं अपनी फ़ाइल फिट करने के लिए आभासी यूआरआई कैसे बना सकता हूं?

संपादित करें: कुछ प्रकार के अनुप्रयोगों के लिए सीधे डेटा संलग्न करने का विकल्प महत्वपूर्ण है। अर्थात्, सुरक्षा & बैंकिंग अनुप्रयोग जो संवेदनशील डेटा को बहुत अधिक स्थानांतरित नहीं करना चाहते हैं। निश्चित रूप से यदि डेटा एसडीकार्ड तक नहीं पहुंचता है और सीधे मेल अटैचमेंट पर जाता है तो एप्लिकेशन मेमोरी के मुकाबले ज्यादा मुश्किल हो जाता है।
यह मेरा विशिष्ट मामला नहीं है, लेकिन मैं यह इंगित करना चाहता हूं कि यह क्षमता महत्वपूर्ण है।

+0

@adriaankoster, यदि आप वहां हैं, तो इस पोस्ट को पढ़ें। शायद आप मदद कर सकते हैं। – ilomambo

उत्तर

5

पहली बात जो आप करना चाहते हैं, मुझे कल्पना है, एक ContentProvider बना रहा है। आप एक उदाहरण दिया गया यहाँ

https://github.com/dskinner/AndroidWeb/blob/master/src/org/tsg/web/WebContentProvider.java

जहां ऊपर के लिंक के मामले में, आप अपने AndroidManifest को यह जोड़ना होगा देख सकते हैं।xml

<provider 
    android:name="org.tsg.web.WebContentProvider" 
    android:authorities="your.package.name" /> 

अब, आपके पास उपयोग के लिए उपलब्ध सामग्री uri होगी, content://your.package.name/

उपर्युक्त सामग्री का हिस्सा आपकी रुचि रखने वाले प्रदाता को फिर से कल्पना करें, openFile विधि है। ऐप्स पर इरादे से डेटा साझा करते समय, कुछ चीजों की अपेक्षा की जाती है। आपके मामले में, आप कुछ बाइट डेटा साझा करना चाहते हैं जो ईमेल से जुड़ा हुआ है।

तो यदि आप उचित इरादे झंडे के साथ content://your.package.name/foo जैसे ईमेल ऐप में सामग्री यूरी में पास करते हैं, तो openFile आपके ContentProvider पर कॉल किया जाएगा। इस मामले में, आप foo को अनुरोध करने के लिए यूरी सेगमेंट के अंत का निरीक्षण कर सकते हैं, और उचित रूप से वापस आ सकते हैं।

आपके द्वारा उठाए जाने वाले अगले अंक में फ़ाइल वास्तव में डिस्क पर नहीं है। जबकि मैं ऊपर उपयोग की गई विधि के लिए झुका नहीं सकता (हालांकि यह कोशेर दिखता है), आपको अपनी सामग्री प्रदाता से ParcelFileDescriptor पर लौटने की आवश्यकता है। यदि आप प्रदान किए गए लिंक को देखते हैं, तो संभवतः आप अपने File ऑब्जेक्ट (यहां मेरे ज्ञान छूट) से फ़ाइल डिस्क्रिप्टर प्राप्त करने के लिए नमूना के रूप में उपयोग करने का प्रयास कर सकते हैं, लेकिन मुझे लगता है कि डेटा उस बिंदु पर बस उपलब्ध नहीं होगा।

जो भी आप लाते हैं वह सुरक्षा है हालांकि। यह ध्यान रखना महत्वपूर्ण है कि आप डिस्क पर डेटा को निजी रूप से लिख सकते हैं, इसलिए केवल ऐप के पास डेटा तक पहुंच हो। मेरा मानना ​​है, लेकिन हो सकता है कि आप इस पर दोबारा जांच करना चाहें, यदि वह डेटा ऐप के लिए निजी है, तो आप इसे ContentProvider के माध्यम से बेनकाब कर सकते हैं और संभावित रूप से लॉक कर सकते हैं कि प्रदाता किस प्रकार और कैसे उपयोग करता है, इसे कौन कॉल कर सकता है आदि। आप शायद उस हिस्से के लिए एंड्रॉइड दस्तावेज़ों में खोदना चाहते हैं या कुछ अन्य SO प्रश्नों को देखना चाहते हैं।

वैसे भी, शुभकामनाएं।

+0

धन्यवाद, मैं सामग्री प्रदाताओं में देखूंगा। अभी मैं इसे पकड़ पर रखता हूं, क्योंकि समाधान अपेक्षा से अधिक जटिल लगता है। मैं आपको विश्वास की छलांग पर बक्षीस दूंगा। – ilomambo

0

मैं मेल में अनुलग्नक जोड़ने में व्यस्त था और मैं संलग्नक के साथ मेल भेज सकता हूं। यदि आप एक नज़र रखना चाहते हैं: can not send mail with attachment in Android

+0

धन्यवाद @yiddow, मैंने आपकी पोस्ट पर एक नज़र डाली, लेकिन मैं संलग्नक के लिए अपना इंटरफ़ेस बनाने की तलाश नहीं कर रहा हूं। मैं Intent.EXTRA_STREAM का उपयोग करना चाहता हूं और बाइट्स का एक बफर संलग्न कर सकता हूं जो पहले मुझे वास्तविक फ़ाइल बनाने के बिना स्मृति में है। – ilomambo

1

एप्लिकेशन की कैश निर्देशिका में फ़ाइल बनाएं। यह आंतरिक फाइल सिस्टम में बनाया जाएगा। कैश डीआईआर के पथ प्राप्त करने के लिए 'getCacheDir()' API का उपयोग करें। इस डीआईआर में डेटा लिखें और फिर Uri.fromFile (फ़ाइल फ़ाइल) 'का उपयोग कर फ़ाइल ऑब्जेक्ट से यूआरआई प्राप्त करें। जब आप फ़ाइल के साथ समाप्त कर लें, तो इसे हटा दें।

आपके एप्लिकेशन का कैश केवल आपके ऐप के लिए उपलब्ध है, इसलिए यह आपके उद्देश्य के लिए उपयोग करने के लिए सुरक्षित है।

यदि डेटा बहुत महत्वपूर्ण है तो आप कुछ एन्क्रिप्शन कर सकते हैं।

+0

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

+0

नोट: कभी-कभी सीपीयू चिप एक एसओसी (चिप पर सिस्टम) है और आंतरिक रैम इसका हिस्सा है, इसलिए राम की निगरानी करना/लिखना बहुत मुश्किल है क्योंकि कोई बाहरी बस नहीं है। दूसरी तरफ, sdcard परिभाषा के अनुसार बाहरी है। – ilomambo

+1

AFAIK हम रैम में ऑब्जेक्ट के लिए यूआरआई नहीं प्राप्त कर सकते हैं .. – Ronnie

1

मुझे ऐसा करने के लिए लगता है, आपको एक ContentProvider का पर्दाफाश करना होगा, जो आपको यूआरआई को संभालने की अनुमति देगा। ईमेल एप्लिकेशन को तब आपके यूआरआई पर इनपुटस्ट्रीम खोलना चाहिए, जिस बिंदु पर आप अपने इन-मेमोरी डेटा पर इनपुटस्ट्रीम वापस कर सकते हैं।

मैंने कोशिश नहीं की है, लेकिन सिद्धांत में यह काम करना चाहिए।

+0

मैं एंड्रॉइड में इतना अनुभवी नहीं हूं, क्या आप विशिष्ट कोड पोस्ट कर सकते हैं? :::: बीटीडब्लू, एक इनपुट स्ट्रीम बनाने में कोई समस्या नहीं है बाइटएरेइन इनपुटस्ट्रीम कक्षा में निर्मित है। समस्या यह है कि यूआरआई को इंगित करने के लिए कैसे प्राप्त करें। – ilomambo

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