2012-12-20 13 views
9

में सहेजे बिना ImageView में एंड्रॉइड शेयर छवि मैं छवि दृश्य में छवि साझा करना चाहता हूं। लेकिन मैं एसडीकार्ड में सहेजना नहीं चाहता हूं। लेकिन मैं sdcardएसडी कार्ड

में कोड

Intent share = new Intent(Intent.ACTION_SEND); 
       share.setType("image/jpeg"); 
       share.putExtra(Intent.EXTRA_STREAM,Uri.parse(path)); 
       startActivity(Intent.createChooser(share, "Share Image")); 
यहाँ

छवि का मार्ग निर्दिष्ट स्थान के लिए इस्तेमाल किया, लेकिन मैं छवि को बचाने नहीं चाहता ... साझा करने के लिए जब मैं आशय का उपयोग वहाँ संभव है ..

+0

यह क्यू एंड ए पढ़ने लायक है http://stackoverflow.com/questions/9049143/android-share-intent-for-a-bitmap-is-it-possible-not-to- save-it-pre-sharing – Suragch

उत्तर

1

आप इसे मीडिया गैलरी सामग्री प्रदाता यूआरआई के रूप में भी साझा कर सकते हैं (यदि छवि पहले से ही फोन पर है, या यदि यह वेब से आई है तो आप यूआरएल साझा कर सकते हैं (हालांकि यह एक ही प्रभाव नहीं है)।

लेकिन अगर आया वेब से और आप सीधे डीकोड किया बिटमैप और अब इसे एक उचित छवि के रूप में साझा करना चाहते हैं, हाँ, आपको वास्तव में फ़ाइल की आवश्यकता है!

+2

मुझे विश्वास नहीं है कि छवि को फ़ाइल में सहेजने के साथ ऐसा करने का कोई तरीका नहीं है! – Charlires

+0

एसडीकार्ड को सहेजे बिना यह संभव है, –

5

मैं यह करने में सक्षम था:

File file = new File(getCacheDir(), "screenshot.png"); 
... 
file.setReadable(true, false); 
Uri uri = Uri.fromFile(file); 
... 
intent.putExtra(Intent.EXTRA_STREAM, uri); 

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

इसके अलावा, यदि उपयोगकर्ता मेरे ऐप को हटा देता है तो यह स्वचालित रूप से हटा दिया जाता है, लेकिन मैंने फ़ाइल को हटाने के लिए startActivityForResult/onActivityResult का भी उपयोग किया और शेयर समाप्त होने पर अपने फ़ोल्डर को निजी पर सेट कर दिया।

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

[संपादित करें: मैं इस करता 'की खोज की टी 2.3.6 पर काम करता है जहां फाइल फ़ाइल पर होनी चाहिए: /// mnt/sdcard।]

+0

क्या आप छवि को जीमेल के साथ साझा करने में सक्षम हैं? जब मैंने कोशिश की तो मुझे कुछ त्रुटि संदेश मिला। –

+0

[इस टिप्पणी] के रूप में (http://stackoverflow.com/questions/9049143/android-share-intent-for-a-bitmap-is-it-possible-not-to-save-it-prior-sharing/9049212 ? noredirect = 1 # comment48438032_9049212) आपके उत्तर के बारे में कहता है, "आपके ऐप के आंतरिक संग्रहण पर विश्व-पठनीय फ़ाइलों को बनाना एक अच्छा विचार नहीं है।" इसे अधिक सुरक्षित रूप से करने के लिए [FileProvider] (http://stackoverflow.com/a/30172247/3681880) का उपयोग करें। – Suragch

+0

हाय टॉम, आपका जवाब बहुत अच्छा है! क्या आप जानते हैं कि काम करने के लिए न्यूनतम आवश्यक एपीआई संस्करण क्या है, यानी यह एंड्रॉइड 3.0+ के तहत काम करेगा? धन्यवाद। – middlehut

16

अन्य ऐप्स के साथ फ़ाइलों को साझा करने के लिए अनुशंसित विधि ContentProviderFileProvider कहलाती है। दस्तावेज़ीकरण बहुत अच्छा है, लेकिन कुछ हिस्सों में थोड़ा मुश्किल है। यहां सारांश है।

प्रकट

<manifest> 
    ... 
    <application> 
     ... 
     <provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="com.example.myapp.fileprovider" 
      android:grantUriPermissions="true" 
      android:exported="false"> 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/filepaths" /> 
     </provider> 
     ... 
    </application> 
</manifest> 

में FileProvider सेट अप अपने ऐप का पैकेज नाम के साथ com.example.myapp बदलें।

रेस/xml/filepaths.xml बनाएं

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <cache-path name="shared_images" path="images/"/> 
</paths> 

यह जहां (इस मामले में कैश निर्देशिका का उपयोग) साझा करने के लिए फ़ाइलें प्राप्त करने FileProvider बताता है।

सहेजें आंतरिक भंडारण

// save bitmap to cache directory 
try { 

    File cachePath = new File(context.getCacheDir(), "images"); 
    cachePath.mkdirs(); // don't forget to make the directory 
    FileOutputStream stream = new FileOutputStream(cachePath + "/image.png"); // overwrites this image every time 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
    stream.close(); 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

के चित्र को साझा करें छवि

File imagePath = new File(context.getCacheDir(), "images"); 
File newFile = new File(imagePath, "image.png"); 
Uri contentUri = FileProvider.getUriForFile(context, "com.example.app.fileprovider", newFile); 

if (contentUri != null) { 

    Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND); 
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file 
    shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri)); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); 
    startActivity(Intent.createChooser(shareIntent, "Choose an app")); 

} 

आगे पढ़ने

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