如何在 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 中使用 GraphQl?

如何在模块(Android Studio)中使用 com.android.databinding?

Android:如何在 Android 中使用 tensorflow lite 扩展图像的维度

如何在 Android Studio 中使用我自己的 Android.mk 文件

如何在 Android 中使用默认动画?