2010-08-25 13 views
14

मेरे पास प्रोग्रामेटिक रूप से जेनरेट की गई छवि है जिसे मैं ACTION_SEND और EXTRA_STREAM विधि के माध्यम से अनुलग्नक के रूप में भेजना चाहता हूं।एंड्रॉइड: मैं एक अस्थायी, जेनरेट की गई छवि को ईमेल में कैसे संलग्न करूं?

लेकिन मैं यह कैसे कर सकता हूं?

मेरा पहला प्रयास (मेरे context.getCacheDir() आधारित फ़ाइल पथ पर लिखना) जीमेल पूर्वावलोकन में काम करने के लिए दिखाई दिया (कोई छवि पूर्वावलोकन नहीं, लेकिन संलग्न फ़ाइल नाम और आइकन दिखाई दे रहा था), लेकिन अटैचमेंट प्राप्तकर्ता पक्ष पर कभी नहीं पहुंचा। मुझे लगता है कि जेनरेट की गई फाइल पर अनुमतियों के साथ कुछ करना है, लेकिन इससे कैसे बचें? क्या मुझे इन जेनरेट की गई फ़ाइलों पर अधिक अनुमोदित सेटिंग्स सेट करने की आवश्यकता है (ताकि जीमेल गतिविधि तक पहुंच सकें)? क्या ऐप के कैश फ़ोल्डर के लिए भी यह संभव है?

क्या कोई और फ़ाइल स्थान है जो मेरी फाइलें लिखने के लिए अधिक उपयुक्त होगा? मैंने डाउनलोड फ़ोल्डर को माना, लेकिन लगता है कि यह किसी ऐसे चीज़ के लिए एक अजीब स्थान होगा जो ईमेल होने तक केवल अस्तित्व में रहने की आवश्यकता है।

मैंने अपनी छवि को data:image/png;base64,ABCD... शैली यूआरआई में पूरी तरह एन्कोड करने का भी प्रयास किया है। यह भी, जीमेल पूर्वावलोकन में दिखाया गया है (अनुलग्नक आइकन, लेकिन कोई फ़ाइल नाम नहीं), लेकिन परिणामस्वरूप प्राप्तकर्ता-पक्ष अनुलग्नक नहीं हुआ।

क्या कोई भी किसी भी माध्यम से ईमेल इरादे में एक-शॉट जेनरेट की गई छवि संलग्न करने में सक्षम है? मैंने किन विकल्पों को नजरअंदाज कर दिया है?

उत्तर

18

मेरे समस्या वास्तव में दो भागों में शामिल हैं:

  1. context.getCacheDir() अपने अनुप्रयोग लिए निजी है। आप वहां कुछ नहीं डाल सकते हैं और उम्मीद कर सकते हैं कि एक और ऐप इसे एक्सेस करने में सक्षम हो।
  2. मुझे गलत समझा गया कि एमआईएमई प्रकार का उपयोग करना चाहिए था। भले ही मैं ईमेल टेक्स्ट भेज रहा था, मुझे वास्तव में मेरे अनुलग्नक के लिए image/png निर्दिष्ट करने की आवश्यकता थी।

इसके अतिरिक्त, शोध से संकेत मिलता है कि प्राथमिक स्मृति पर (संभावित रूप से बड़ी) छवियां रखना एक अच्छा विचार नहीं था, भले ही आप इसे तुरंत साफ करने जा रहे हों।

एक बार मैंने इन चीजों को किया और एसडी कार्ड पर सार्वजनिक स्थान पर मेरी जेनरेट की गई छवियां लिखीं, यह ठीक काम करता था।

तो, सिंहावलोकन में: अपने प्रकट

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

सुनिश्चित करें कि एसडी कार्ड में

अनुरोध एसडी कार्ड का उपयोग उपलब्ध है

if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) 
{ 
    //Bail gracefully 
} 

पर एक निर्देशिका बनाएं एसडी कार्ड

File pngDir = new File(
    Environment.getExternalStorageDirectory(), 
    //Loose convention inferred from app examples 
    "Android/data/com.somedomain.someapp/flotsam"); 

if (!pngDir.exists()) 
    pngDir.mkdirs(); 

कि निर्देशिका में अपनी फ़ाइल लिखें और कब्जा उरी

File pngFile = new File(pngDir, "jetsam.png"); 
//Save file encoded as PNG 
Uri pngUri = Uri.fromFile(pngFile); 

बिल्ड एक ACTION_SEND आशय

Intent intent = new Intent(android.content.Intent.ACTION_SEND); 
intent.setType("image/png"); // 
intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Portable Network Graphics"); 
intent.putExtra(android.content.Intent.EXTRA_CC, new String[] { "[email protected]" }); 
intent.putExtra(Intent.EXTRA_TEXT, "Something textual"); 
intent.putExtra(Intent.EXTRA_STREAM, pngUri); 

और फिर गतिविधि शुरू

context.startActivity(Intent.createChooser(intent, "Something Pithy")); 

और फिर सुनिश्चित करें कि आप साफ सब कुछ बना ...

चेतावनी 1

वहाँ नहीं मेरी आवश्यक में और अधिक समर्थन ऐप्स-विशिष्ट एसडी कार्ड निर्देशिका के लिए आ रहा है हो सकता है, लेकिन अफसोस, प्रकट होता है एसडीके संस्करण।

चेतावनी 2

यह समाधान है कि अंततः मेरे लिए काम किया के एक सिंहावलोकन है। यह जरूरी नहीं है कि "सर्वोत्तम अभ्यास" दृष्टिकोण हो।

चेतावनी 3

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

+0

इस एक कस्टम 'ContentProvider' के साथ किया जा सकता है की है। इसे अतिरिक्त अनुमति की आवश्यकता नहीं होगी, और एसडी कार्ड पर निर्भरता भी हटा दी जाएगी। – HRJ

+0

@ एचआरजे क्या आप इस संभावना पर उत्तर के साथ विस्तार कर सकते हैं?मुझे यह देखने के लिए और अधिक जानकारी देखना अच्छा लगेगा कि यह कैसे किया जा सकता है ... – el2iot2

+0

यह समाधान मेरे लिए काम नहीं करता है। सबसे अजीब चीज यह है कि छवि फाइल एसडी कार्ड पर बनाई गई है! – Paschalis

4

मैंने अभी एक ही समस्या में भाग लिया है (मेरे मामले में एक टेक्स्ट फ़ाइल संलग्न करना चाहते हैं)। आप एंड्रॉयड लॉग में देखें, तो इसके लिए कारण है:

02-28 21:01:28.434: E/Gmail(19673): file:// attachment paths must point to file:///mnt/sdcard. Ignoring attachment file:///data/data/com.stephendnicholas.gmailattach/cache/Test.txt 

समाधान के लिए (के रूप में HRJ ने उल्लेख किया), तो आपको एक ContentProvider उपयोग कर सकते हैं अपने आवेदन के आंतरिक कैश में फ़ाइलों तक पहुँच प्रदान करने के लिए कर सकते हैं ताकि Gmail उन्हें संलग्न करें। मैंने अभी यह कैसे किया है इस पर blog post लिखा है।

उम्मीद है कि कि कुछ मदद :)

+0

ContentProvider वह समाधान था जिसके साथ मैं गया था। मैं नहीं चाहता था कि हर कोई एसडी कार्ड से मेरी फाइलें पढ़ने में सक्षम हो। – Carlos

0
tableLayout.buildDrawingCache(); 
     Bitmap test = Bitmap.createBitmap(tableLayout.getDrawingCache()); 
     tableLayout.destroyDrawingCache(); 

     Log.d("Image", test.toString()); 

     String path = Environment.getExternalStorageDirectory().toString(); 
     Log.d("Path", path); 
     File file = new File(path,"mail_image.png"); 
     Uri pngUri = Uri.fromFile(file); 
     Log.d("Real Image Path", pngUri.toString()); 

     Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
     emailIntent.setType("image/png"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, "email to"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Subject"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "From My App"); 
        emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, pngUri); 

     startActivity(Intent.createChooser(emailIntent, "Send mail..."));