2013-10-10 8 views
7

動作しません:Androidの共有画像は、私は、次のコードを使用してアプリケーションのスクリーンショットを共有しようとしています

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) 

問題: 私がしようGmailと共有するには、Gmailは強制的に閉鎖されています。 Facebookと共有しようとすると、Facebookは黙って投稿を拒否します。メッセージングは​​メッセンジャーを起動しますが、空です。共有は画像を追加することなく動作します。

答えて

17

最初に、ファイルパスを構築するために連結を使用しないでください。Uriの値は使用できません。

第2に、EXTRA_STREAMは、StringではなくUriを保持すると考えられます。

第3に、適切なMIMEタイプ(image/png)を知っているので、ワイルドカードの代わりに使用してください。

第4に、同じパスを2回構築しないでください。ここで正しい方法でFile imageを作成し、その値を無視します。だから、

String urlラインをダンプimage/pngimage/*を置き換え、および変更:

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

する:

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

は優れた、ありがとうございます。私は自分のソリューションを得るためにstackoverflowから複数のソリューションを組み合わせていた。入力いただきありがとうございます、今すぐ動作します。 – buczek

+0

Uri.fromFile(file)私は時間通り帰宅できます!ありがとう! –

+0

これは私の画像のリンクですhttp://tree.solucionatime.com/uploads/024c546c9ca7bd8dc7bb0651dbf726a7.jpg私はinstagram上で画像を共有したい –

1

、android.support.v4.content.FileProviderを使用することを検討してくださいクラスを使用して、ファイルURIではなくコンテンツURIを使用してファイルを共有します。より安全です。 reference documentation for FileProvider

1

少なくとも(Android 5.1以降では)常にコンテンツURIを渡す必要があります。ここではビットマップからコンテンツのパスを取得する方法は次のとおりです。

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...")); 
    } 
関連する問題