如何在 android 中使用 ACTION_SEND 共享图像 + 文本?
Posted
技术标签:
【中文标题】如何在 android 中使用 ACTION_SEND 共享图像 + 文本?【英文标题】:How to Share Image + Text together using ACTION_SEND in android? 【发布时间】:2013-12-18 10:47:36 【问题描述】:我想在 android 中使用 ACTION_SEND 共享文本 + 图像,我使用下面的代码,我只能共享图像但我不能与它共享文本,
private Uri imageUri;
private Intent intent;
imageUri = Uri.parse("android.resource://" + getPackageName()+ "/drawable/" + "ic_launcher");
intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.putExtra(Intent.EXTRA_STREAM, imageUri);
intent.setType("image/*");
startActivity(intent);
对此有什么帮助吗?
【问题讨论】:
forum.xda-developers.com/showthread.php?t=2222703 'MMS' 是用于发送文本/图像消息的单独协议。不是很好,因为它有很多运营商施加的限制。您可能想检查一下。 您解决了这个问题吗?如果固定意味着分享你的想法。 【参考方案1】:您可以通过这些代码共享纯文本
String shareBody = "Here is the share content body";
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
startActivity(Intent.createChooser(sharingIntent, getResources().getString(R.string.share_using)));
所以你的完整代码(你的图片+文本)变成了
private Uri imageUri;
private Intent intent;
imageUri = Uri.parse("android.resource://" + getPackageName()
+ "/drawable/" + "ic_launcher");
intent = new Intent(Intent.ACTION_SEND);
//text
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
//image
intent.putExtra(Intent.EXTRA_STREAM, imageUri);
//type of things
intent.setType("*/*");
//sending
startActivity(intent);
我刚刚将image/*
替换为*/*
更新:
Uri imageUri = Uri.parse("android.resource://" + getPackageName()
+ "/drawable/" + "ic_launcher");
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_TEXT, "Hello");
shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
shareIntent.setType("image/jpeg");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(shareIntent, "send"));
【讨论】:
在第一次 putExtra 之前放置 setType 并重试。 嗯,尝试分享/发送到其他应用 我尝试了 gamil、whatsapp 和 viber,其中 gmail 和 viber 崩溃了 :( 它不工作,图像不分享到 fb,其他(twitter,gmail)它工作 因为fb需要自己的实现方式,需要使用它的sdk。【参考方案2】:请看一下这段代码,我可以一起分享文本和图像
Intent shareIntent;
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/Share.png";
OutputStream out = null;
File file=new File(path);
try
out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
catch (Exception e)
e.printStackTrace();
path=file.getPath();
Uri bmpUri = Uri.parse("file://"+path);
shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri);
shareIntent.putExtra(Intent.EXTRA_TEXT,"Hey please check this application " + "https://play.google.com/store/apps/details?id=" +getPackageName());
shareIntent.setType("image/png");
startActivity(Intent.createChooser(shareIntent,"Share with"));
别忘了给 WRITE_EXTERNAL_STORAGE 权限
同样在 facebook 中它只能分享图片,因为 facebook 不允许通过意图分享文本
【讨论】:
这是迄今为止最好的答案,唯一对我有用的答案,其他的都没有。 最佳答案。在这个页面中 Chooser 显示重复的应用程序,例如 FB messenger 和 FB messenger 'Your Story' 不幸的是,在 Viber 上它只分享图片,而不是文字。【参考方案3】:可能是因为分享应用(FB、推特等)可能没有权限读取图片。
谷歌的文件说:
接收应用程序需要访问 Uri 指向的数据的权限。推荐的方法是:
http://developer.android.com/training/sharing/send.html
我不确定共享应用程序是否有权读取我们应用程序包中的图像。但是我的文件保存在
Activity.getFilesDir()
无法被读取。正如上面链接中的建议,我们可以考虑将图像存储在 MediaStore 中,共享应用程序具有读取权限。
更新1: 以下是在 Android 4.4 中与文本共享图像的工作代码。
Bitmap bm = BitmapFactory.decodeFile(file.getPath());
intent.putExtra(Intent.EXTRA_TEXT, Constant.SHARE_MESSAGE
+ Constant.SHARE_URL);
String url= MediaStore.Images.Media.insertImage(this.getContentResolver(), bm, "title", "description");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(url));
intent.setType("image/*");
startActivity(Intent.createChooser(intent, "Share Image"));
副作用是我们在 MediaStore 中添加了一张图片。
【讨论】:
如果共享完成,您可以简单地从 MediaStore 中删除图像并且什么都没有发生;-) Chooser 显示重复的应用程序,例如 FB messenger 和 FB messenger 'Your Story'【参考方案4】:我一直在寻找这个问题的解决方案,发现这个问题正在运行,希望对您有所帮助。
private BitmapDrawable bitmapDrawable;
private Bitmap bitmap1;
//write this code in your share button or function
bitmapDrawable = (BitmapDrawable) mImageView.getDrawable();// get the from imageview or use your drawable from drawable folder
bitmap1 = bitmapDrawable.getBitmap();
String imgBitmapPath= MediaStore.Images.Media.insertImage(getContentResolver(),bitmap1,"title",null);
Uri imgBitmapUri=Uri.parse(imgBitmapPath);
String shareText="Share image and text";
Intent shareIntent=new Intent(Intent.ACTION_SEND);
shareIntent.setType("*/*");
shareIntent.putExtra(Intent.EXTRA_STREAM,imgBitmapUri);
shareIntent.putExtra(Intent.EXTRA_TEXT, shareText);
startActivity(Intent.createChooser(shareIntent,"Share Wallpaper using"));
【讨论】:
Chooser 显示重复的应用程序,例如 FB messenger 和 FB messenger 'Your Story'【参考方案5】: String bitmapPath = MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "title", null);
Uri bitmapUri = Uri.parse(bitmapPath);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/png");
intent.putExtra(Intent.EXTRA_STREAM, bitmapUri);
intent.putExtra(Intent.EXTRA_TEXT, "This is a playstore link to download.. " + "https://play.google.com/store/apps/details?id=" + getPackageName());
startActivity(Intent.createChooser(intent, "Share"));
【讨论】:
【参考方案6】:尝试使用此代码。我正在从 drawable 上传 ic_launcher。您可以使用图库或位图中的文件更改此代码。
void share()
Bitmap icon = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
icon.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + "temporary_file.jpg");
try
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
catch (IOException e)
e.printStackTrace();
share.putExtra(Intent.EXTRA_TEXT, "hello #test");
share.putExtra(Intent.EXTRA_STREAM,
Uri.parse("file:///sdcard/temporary_file.jpg"));
startActivity(Intent.createChooser(share, "Share Image"));
【讨论】:
Chooser 显示重复的应用程序,例如 FB messenger 和 FB messenger 'Your Story' @AmanVerma FB Story 和 FB Messenger 绝对是两个不同的东西。【参考方案7】:String text = "Look at my awesome picture";
Uri pictureUri = Uri.parse("file://my_picture");
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_TEXT, text);
shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
shareIntent.setType("image/*");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(shareIntent, "Share images..."));
【讨论】:
Chooser 显示重复的应用程序,例如 FB messenger 和 FB messenger 'Your Story'【参考方案8】:检查下面对我有用的代码
Picasso.with(getApplicationContext()).load("image url path").into(new Target()
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from)
Intent i = new Intent(Intent.ACTION_SEND);
i.putExtra(Intent.EXTRA_TEXT, "Let me recommend you this application" +
"\n"+ "your share url or text ");
i.setType("image/*");
i.putExtra(Intent.EXTRA_STREAM, getLocalBitmapUri(bitmap));
context.startActivity(Intent.createChooser(i, "Share using"));
@Override
public void onBitmapFailed(Drawable errorDrawable)
@Override
public void onPrepareLoad(Drawable placeHolderDrawable)
);
private Uri getLocalBitmapUri(Bitmap bmp)
Uri bmpUri = null;
try
File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "share_image_" + System.currentTimeMillis() + ".png");
FileOutputStream out = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.PNG, 50, out);
out.close();
bmpUri = Uri.fromFile(file);
catch (IOException e)
e.printStackTrace();
return bmpUri;
【讨论】:
【参考方案9】:private void shareImage()
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.Starlay_straightface_image);
File f = new File(getExternalCacheDir()+"/"+getResources().getString(R.string.app_name)+".png");
Intent shareIntent;
try
FileOutputStream outputStream = new FileOutputStream(f);
bitmap.compress(Bitmap.CompressFormat.PNG,100,outputStream);
outputStream.flush();
outputStream.close();
shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
shareIntent.putExtra(Intent.EXTRA_TEXT,"Hey please check this application " + "https://play.google.com/store/apps/details?id=" +getPackageName());
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
catch (Exception e)
throw new RuntimeException(e);
startActivity(Intent.createChooser(shareIntent,"Share Picture"));
【讨论】:
注意StrictMode.setVmPolicy,避免崩溃【参考方案10】:要共享可绘制图像,必须先将图像保存在设备的缓存或外部存储中。
我们检查“shareable_image.jpg”是否已经存在于缓存中,如果存在,则从现有文件中检索路径。
否则,可绘制图像保存在缓存中。
然后使用意图共享保存的图像。
private void share()
int sharableImage = R.drawable.person2;
Bitmap bitmap= BitmapFactory.decodeResource(getResources(), sharableImage);
String path = getExternalCacheDir()+"/sharable_image.jpg";
java.io.OutputStream out;
java.io.File file = new java.io.File(path);
if(!file.exists())
try
out = new java.io.FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
catch (Exception e)
e.printStackTrace();
path = file.getPath();
Uri bmpUri = Uri.parse("file://" + path);
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shareIntent.putExtra(Intent.EXTRA_TEXT, "This is a sample body with more detailed description");
shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent,"Share with"));
【讨论】:
【参考方案11】:我在 Android X 上尝试了this 解决方案,并且与 whatsapp、telegram 和 gmail 完美配合。 这是我的代码:
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_TEXT, "<<sharingText>>");
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("<<imageResource>>"));
shareIntent.setType("image/*");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (getView() != null && getView().getContext() != null &&
shareIntent.resolveActivity(getView().getContext().getPackageManager()) != null)
getView().getContext().startActivity(Intent.createChooser(shareIntent, null));
【讨论】:
【参考方案12】:偶然(文本消息部分,我已经放弃了),我注意到当我选择 Messages App 来处理请求时,Message App 会打开 Intent.EXTRA_SUBJECT 中的文本以及准备发送的图像,希望对你有帮助。
String[] recipient = "your_email_here";
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipient);
intent.putExtra(Intent.EXTRA_SUBJECT, "Hello, this is the subject line");
intent.putExtra(Intent.EXTRA_TEXT, messageEditText.getText().toString());
intent.putExtra(Intent.EXTRA_STREAM, imageUri);
intent.setType("image/*");
【讨论】:
【参考方案13】:您可以使用此代码
Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.refer_image);
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/*" + "text/*");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(this.getContentResolver(),
b, "Title", null);
Uri imageUri = Uri.parse(path);
share.putExtra(Intent.EXTRA_STREAM, imageUri);
share.putExtra(Intent.EXTRA_TEXT, "Hey I am Subhajit");
startActivity(Intent.createChooser(share, "Share via"));
【讨论】:
以上是关于如何在 android 中使用 ACTION_SEND 共享图像 + 文本?的主要内容,如果未能解决你的问题,请参考以下文章
Intent not found Gmail App for email... 请查看代码 - 我已经查看了其他答案... Xiaomi MI 8 API 27
如何在模块(Android Studio)中使用 com.android.databinding?
Android:如何在 Android 中使用 tensorflow lite 扩展图像的维度