2013-10-10 5 views
7

मैं निम्नलिखित कोड का उपयोग कर आवेदन का एक स्क्रीनशॉट साझा करने के लिए कोशिश कर रहा हूँ काम नहीं करता:एंड्रॉयड बंटवारे छवि

View content = findViewById(R.id.layoutHome); 
content.setDrawingCacheEnabled(true); 
Bitmap bitmap = content.getDrawingCache(); 

File sdCardDirectory = Environment.getExternalStorageDirectory(); 
File image = new File(sdCardDirectory,"temp.png"); 

// Encode the file as a PNG image. 
FileOutputStream outStream; 
try { 
    outStream = new FileOutputStream(image); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
    outStream.flush(); 
    outStream.close(); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

String url = "file://" + sdCardDirectory.toString() + "Images/temp.png"; 

Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); 
sharingIntent.setType("image/*"); 
String shareBody = "Here is the share content body"; 
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Subject Here"); 
sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, url); 
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT,shareBody); 
startActivity(Intent.createChooser(sharingIntent, "Share via")); 

Logcat:

10-10 14:20:16.631: W/Bundle(16349): Key android.intent.extra.STREAM expected Parcelable but value was a java.lang.String. The default value <null> was returned. 
10-10 14:20:16.658: W/Bundle(16349): Attempt to cast generated internal exception: 
10-10 14:20:16.658: W/Bundle(16349): java.lang.ClassCastException: java.lang.String cannot be cast to android.os.Parcelable 
10-10 14:20:16.658: W/Bundle(16349): at android.os.Bundle.getParcelable(Bundle.java:1171) 
10-10 14:20:16.658: W/Bundle(16349): at android.content.Intent.getParcelableExtra(Intent.java:4140) 
10-10 14:20:16.658: W/Bundle(16349): at android.content.Intent.migrateExtraStreamToClipData(Intent.java:6665) 
10-10 14:20:16.658: W/Bundle(16349): at android.content.Intent.migrateExtraStreamToClipData(Intent.java:6650) 
10-10 14:20:16.658: W/Bundle(16349): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1410) 
10-10 14:20:16.658: W/Bundle(16349): at android.app.Activity.startActivityForResult(Activity.java:3351) 
10-10 14:20:16.658: W/Bundle(16349): at android.app.Activity.startActivityForResult(Activity.java:3312) 
10-10 14:20:16.658: W/Bundle(16349): at android.app.Activity.startActivity(Activity.java:3522) 
10-10 14:20:16.658: W/Bundle(16349): at android.app.Activity.startActivity(Activity.java:3490) 
10-10 14:20:16.658: W/Bundle(16349): at com.example.simplegraph.EconActivity$DrawerItemClickListener.onItemClick(EconActivity.java:182) 
10-10 14:20:16.658: W/Bundle(16349): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
10-10 14:20:16.658: W/Bundle(16349): at android.widget.AbsListView.performItemClick(AbsListView.java:1086) 
10-10 14:20:16.658: W/Bundle(16349): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2855) 
10-10 14:20:16.658: W/Bundle(16349): at android.widget.AbsListView$1.run(AbsListView.java:3529) 
10-10 14:20:16.658: W/Bundle(16349): at android.os.Handler.handleCallback(Handler.java:615) 
10-10 14:20:16.658: W/Bundle(16349): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-10 14:20:16.658: W/Bundle(16349): at android.os.Looper.loop(Looper.java:137) 
10-10 14:20:16.658: W/Bundle(16349): at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-10 14:20:16.658: W/Bundle(16349): at java.lang.reflect.Method.invokeNative(Native Method) 
10-10 14:20:16.658: W/Bundle(16349): at java.lang.reflect.Method.invoke(Method.java:511) 
10-10 14:20:16.658: W/Bundle(16349): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-10 14:20:16.658: W/Bundle(16349): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-10 14:20:16.658: W/Bundle(16349): at dalvik.system.NativeStart.main(Native Method) 

समस्या: जब मैं कोशिश जीमेल के साथ साझा करने के लिए, जीमेल बल बंद है। जब मैं फेसबुक के साथ साझा करने की कोशिश करता हूं, तो फेसबुक चुपचाप पोस्ट को खारिज कर देता है। संदेश संदेशवाहक लाता है, लेकिन खाली है। छवि में जोड़े बिना काम साझा करना।

उत्तर

17

सबसे पहले, फाइल पथ बनाने के लिए कभी भी कॉन्सटेनेशन का उपयोग न करें, अकेले Uri मान दें।

दूसरा, EXTRA_STREAMUri धारण करना चाहिए, String नहीं।

तीसरा, चूंकि आप सही MIME प्रकार (image/png) जानते हैं, वाइल्डकार्ड की बजाय इसका उपयोग करें।

चौथा, दो बार एक ही पथ का निर्माण न करें। यहां आप File image सही तरीके से बनाते हैं, फिर उस मान को अनदेखा करते हैं। इसके अलावा

sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.fromFile(file)); 
+0

बहुत बढ़िया, धन्यवाद। मैं अपने स्वयं के समाधान प्राप्त करने के लिए स्टैक ओवरफ्लो से कई समाधानों का संयोजन कर रहा था। इनपुट के लिए धन्यवाद, यह अब काम करता है। – buczek

+0

Uri.fromFile (फ़ाइल) मुझे समय पर घर जाने दो! धन्यवाद! –

+0

यह मेरा छवि लिंक है http://tree.solucionatime.com/uploads/024c546c9ca7bd8dc7bb0651dbf726a7.jpg मैं इंस्टाग्राम पर छवि साझा करना चाहता हूं –

1

, android.support.v4.content.FileProvider उपयोग करने पर विचार:

तो, डंप String url लाइन, image/png साथ image/* की जगह, और संशोधित:

sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, url); 

होने के लिए फ़ाइल यूआरआई के बजाय एक सामग्री यूआरआई का उपयोग कर अपनी फ़ाइल साझा करने के लिए कक्षा। यह अधिक सुरक्षित है। reference documentation for FileProvider

1

आपको सामग्री यूआरआई हर समय (कम से कम एंड्रॉइड 5.1+ में) पास करने की आवश्यकता है। यहाँ कैसे एक बिटमैप से सामग्री पथ कदम उठाएं:

Bitmap bitmap;//this should be your bitmap 
String MediaFilePath = Images.Media.insertImage(MainActivity.getContentResolver(), bitmap, FileName, null); 

और फिर साझा करने के लिए:

public static void ShareFile(String ContentPath, String Mime) 
    { 
     Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); 

     sharingIntent.setType(Mime); 

     Uri FileUri = Uri.parse(ContentPath); 


     sharingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     sharingIntent.putExtra(Intent.EXTRA_STREAM, FileUri); 

     MainActivity.startActivity(Intent.createChooser(sharingIntent, "Share to...")); 
    } 
संबंधित मुद्दे