How to use “Share image using” sharing Intent to s

2019-01-01 03:53发布

问题:

I have image galley app in that app I placed all the images into the drawable-hdpi folder. and i called images in my activity like this :

private Integer[] imageIDs = {
        R.drawable.wall1, R.drawable.wall2,
        R.drawable.wall3, R.drawable.wall4,
        R.drawable.wall5, R.drawable.wall6,
        R.drawable.wall7, R.drawable.wall8,
        R.drawable.wall9, R.drawable.wall10
};

So now i want know how do i share this images using sharing Intent i putted sharing code like this :

     Button shareButton = (Button) findViewById(R.id.share_button);
     shareButton.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {

        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        Uri screenshotUri = Uri.parse(Images.Media.EXTERNAL_CONTENT_URI + \"/\" + imageIDs);

        sharingIntent.setType(\"image/jpeg\");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
        startActivity(Intent.createChooser(sharingIntent, \"Share image using\"));  

         }
    });

And i have sharing button also when i click on share button Sharing box is opening But when i cliked any service mostly its crashing or some services say : unable to open image So how i can fix this or is there any othere format code to share images ????

Edit :

I tried using the code below. But its not working.

Button shareButton = (Button) findViewById(R.id.share_button);
     shareButton.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {

        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        Uri screenshotUri = Uri.parse(\"android.resource://com.android.test/*\");
        try {
            InputStream stream = getContentResolver().openInputStream(screenshotUri);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        sharingIntent.setType(\"image/jpeg\");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
        startActivity(Intent.createChooser(sharingIntent, \"Share image using\"));  

         }
    });

If don\'t mind somebody plz correct my above code OR give me a proper example plz How do i Share my images from drawable-hdpi folder

回答1:

Bitmap icon = mBitmap;
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_STREAM, Uri.parse(\"file:///sdcard/temporary_file.jpg\"));
startActivity(Intent.createChooser(share, \"Share Image\"));


回答2:

The solution proposed from superM worked for me for a long time, but lately I tested it on 4.2 (HTC One) and it stopped working there. I am aware that this is a workaround, but it was the only one which worked for me with all devices and versions.

According to the documentation, developers are asked to \"use the system MediaStore\" to send binary content. This, however, has the (dis-)advantage, that the media content will be saved permanently on the device.

If this is an option for you, you might want to grant permission WRITE_EXTERNAL_STORAGE and use the system-wide MediaStore.

Bitmap icon = mBitmap;
Intent share = new Intent(Intent.ACTION_SEND);
share.setType(\"image/jpeg\");

ContentValues values = new ContentValues();
values.put(Images.Media.TITLE, \"title\");
values.put(Images.Media.MIME_TYPE, \"image/jpeg\");
Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI,
        values);


OutputStream outstream;
try {
    outstream = getContentResolver().openOutputStream(uri);
    icon.compress(Bitmap.CompressFormat.JPEG, 100, outstream);
    outstream.close();
} catch (Exception e) {
    System.err.println(e.toString());
}

share.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(share, \"Share Image\"));


回答3:

First add permission

<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>

use Bitmap from res

Bitmap b =BitmapFactory.decodeResource(getResources(),R.drawable.userimage);
            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType(\"image/jpeg\");
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            b.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            String path = MediaStore.Images.Media.insertImage(getContentResolver(),
                    b, \"Title\", null);
            Uri imageUri =  Uri.parse(path);
            share.putExtra(Intent.EXTRA_STREAM, imageUri);
            startActivity(Intent.createChooser(share, \"Select\"));

Tested via bluetooth and other messengers

Works like a Charm.



回答4:

I found the easiest way to do this is by using the MediaStore to temporarily store the image that you want to share:

Drawable mDrawable = mImageView.getDrawable();
Bitmap mBitmap = ((BitmapDrawable) mDrawable).getBitmap();

String path = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, \"Image Description\", null);
Uri uri = Uri.parse(path);

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType(\"image/jpeg\");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(intent, \"Share Image\"));

From: Sharing Content With Intents



回答5:

How to share image in android progamatically , Sometimes you wants to take a snapshot of your view and then like to share it so follow these steps: 1.Add permission to mainfest file

<uses-permission    
   android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>

2.Very First take a screenshot of your view , for example it is Imageview, Textview, Framelayout,LinearLayout etc

For example you have an image view to take screenshot call this method in oncreate()

 ImageView image= (ImageView)findViewById(R.id.iv_answer_circle);
     ///take a creenshot
    screenShot(image);

after taking screenshot call share image method either on button
click or where you wants

shareBitmap(screenShot(image),\"myimage\");

After on create method define these two method ##

    public Bitmap screenShot(View view) {
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
            view.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

//////// this method share your image
private void shareBitmap (Bitmap bitmap,String fileName) {
    try {
        File file = new File(getContext().getCacheDir(), fileName + \".png\");
        FileOutputStream fOut = new FileOutputStream(file);
        bitmap.compress(CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        file.setReadable(true, false);
        final Intent intent = new Intent(     android.content.Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        intent.setType(\"image/png\");
        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }

}


回答6:

Here is a solution that worked for me. One gotcha is you need to store the images in a shared or non app private location (http://developer.android.com/guide/topics/data/data-storage.html#InternalCache)

Many suggestions say to store in the Apps \"private\" cache location but this of course is not accessable via other external applications, including the generic Share File intent which is being utilised. When you try this, it will run but for example dropbox will tell you the file is no longer available.

/* STEP 1 - Save bitmap file locally using file save function below. */

localAbsoluteFilePath = saveImageLocally(bitmapImage);

/* STEP 2 - Share the non private Absolute file path to the share file intent */

if (localAbsoluteFilePath!=null && localAbsoluteFilePath!=\"\") {

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    Uri phototUri = Uri.parse(localAbsoluteFilePath);

    File file = new File(phototUri.getPath());

    Log.d(TAG, \"file path: \" +file.getPath());

    if(file.exists()) {
        // file create success

    } else {
        // file create fail
    }
    shareIntent.setData(phototUri);
    shareIntent.setType(\"image/png\");
    shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri);
    activity.startActivityForResult(Intent.createChooser(shareIntent, \"Share Via\"), Navigator.REQUEST_SHARE_ACTION);
}   

/* SAVE IMAGE FUNCTION */

    private String saveImageLocally(Bitmap _bitmap) {

        File outputDir = Utils.getAlbumStorageDir(Environment.DIRECTORY_DOWNLOADS);
        File outputFile = null;
        try {
            outputFile = File.createTempFile(\"tmp\", \".png\", outputDir);
        } catch (IOException e1) {
            // handle exception
        }

        try {
            FileOutputStream out = new FileOutputStream(outputFile);
            _bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.close();

        } catch (Exception e) {
            // handle exception
        }

        return outputFile.getAbsolutePath();
    }

/* STEP 3 - Handle Share File Intent result. Need to remote temporary file etc. */

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

            // deal with this with whatever constant you use. i have a navigator object to handle my navigation so it also holds all mys constants for intents
        if (requestCode== Navigator.REQUEST_SHARE_ACTION) {
            // delete temp file
            File file = new File (localAbsoluteFilePath);
            file.delete();

            Toaster toast = new Toaster(activity);
            toast.popBurntToast(\"Successfully shared\");
        }


    }   

I hope that helps someone.



回答7:

Simple and Easiest code you can use it to share image from gallery.

 String image_path;
            File file = new File(image_path);
            Uri uri = Uri.fromFile(file);
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent .setType(\"image/*\");
            intent .putExtra(Intent.EXTRA_STREAM, uri);
            context.startActivity(intent );


回答8:

I was tired in Searching different options for sharing view or image from my application to other application . And finally i got the solution.

Step 1 : Share Intent handling Block. This will Pop Up your window with list of Applications in you phone

public void share_bitMap_to_Apps() {

    Intent i = new Intent(Intent.ACTION_SEND);

    i.setType(\"image/*\");
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    /*compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] bytes = stream.toByteArray();*/


    i.putExtra(Intent.EXTRA_STREAM, getImageUri(mContext, getBitmapFromView(relative_me_other)));
    try {
        startActivity(Intent.createChooser(i, \"My Profile ...\"));
    } catch (android.content.ActivityNotFoundException ex) {

        ex.printStackTrace();
    }


}

Step 2 : Converting your view to BItmap

public static Bitmap getBitmapFromView(View view) {
    //Define a bitmap with the same size as the view
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(),      view.getHeight(), Bitmap.Config.ARGB_8888);
    //Bind a canvas to it
    Canvas canvas = new Canvas(returnedBitmap);
    //Get the view\'s background
    Drawable bgDrawable = view.getBackground();
    if (bgDrawable != null)
        //has background drawable, then draw it on the canvas
        bgDrawable.draw(canvas);
    else
        //does not have background drawable, then draw white background on the canvas
        canvas.drawColor(Color.WHITE);
    // draw the view on the canvas
    view.draw(canvas);
    //return the bitmap
    return returnedBitmap;
}

Step 3 :

To get The URI from Bitmap Image

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, \"Title\", null);
    return Uri.parse(path);
}


回答9:

I just had the same problem.
Here is an answer that doesn\'t use any explicit file writing in your main code (letting the api taking care of it for you).

Drawable mDrawable = myImageView1.getDrawable();
Bitmap mBitmap = ((BitmapDrawable)mDrawable).getBitmap();
String path = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, \"Image I want to share\", null);
Uri uri = Uri.parse(path);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType(\"image/*\");
startActivity(Intent.createChooser(shareIntent, \"Share Image\"));

This is the path... you just need to add your image IDs in a Drawable object. In my case (code above), the drawable was extracted from an ImageView.



回答10:

ref :- http://developer.android.com/training/sharing/send.html#send-multiple-content

ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType(\"image/*\");
startActivity(Intent.createChooser(shareIntent, \"Share images to..\"));


回答11:

SuperM answer worked for me but with Uri.fromFile() instead of Uri.parse().

With Uri.parse(), it worked only with Whatsapp.

This is my code:

sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(mFile));

Output of Uri.parse():
/storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg

Output of Uri.fromFile:
file:///storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg



回答12:

try this,

Uri imageUri = Uri.parse(\"android.resource://your.package/drawable/fileName\");
      Intent intent = new Intent(Intent.ACTION_SEND);
      intent.setType(\"image/png\");

      intent.putExtra(Intent.EXTRA_STREAM, imageUri);
      startActivity(Intent.createChooser(intent , \"Share\"));


回答13:

A perfect solution for share text and Image via Intent is :

On your share button click :

Bitmap image;
shareimagebutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            URL url = null;
            try {
                url = new URL(\"https://firebasestorage.googleapis.com/v0/b/fir-notificationdemo-dbefb.appspot.com/o/abc_text_select_handle_middle_mtrl_light.png?alt=media&token=c624ab1b-f840-479e-9e0d-6fe8142478e8\");
                image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            shareBitmap(image);
        }
    });

Then Create shareBitmap(image) method.

private void shareBitmap(Bitmap bitmap) {

    final String shareText = getString(R.string.share_text) + \" \"
            + getString(R.string.app_name) + \" developed by \"
            + \"https://play.google.com/store/apps/details?id=\" + getPackageName() + \": \\n\\n\";

    try {
        File file = new File(this.getExternalCacheDir(), \"share.png\");
        FileOutputStream fOut = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        file.setReadable(true, false);
        final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(Intent.EXTRA_TEXT, shareText);
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        intent.setType(\"image/png\");
        startActivity(Intent.createChooser(intent, \"Share image via\"));

    } catch (Exception e) {
        e.printStackTrace();
    }

}

And then just test It..!!



回答14:

Strring temp=\"facebook\",temp=\"whatsapp\",temp=\"instagram\",temp=\"googleplus\",temp=\"share\";

    if(temp.equals(\"facebook\"))
    {
        Intent intent = getPackageManager().getLaunchIntentForPackage(\"com.facebook.katana\");
        if (intent != null) {

            Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
            shareIntent.setType(\"image/png\");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(\"file://\" + \"/sdcard/folder name/abc.png\"));
            shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            shareIntent.setPackage(\"com.facebook.katana\");
            startActivity(shareIntent);

        }
        else
        {
            Toast.makeText(MainActivity.this, \"Facebook require..!!\", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals(\"whatsapp\"))
    {

        try {
            File filePath = new File(\"/sdcard/folder name/abc.png\");
            final ComponentName name = new ComponentName(\"com.whatsapp\", \"com.whatsapp.ContactPicker\");
            Intent oShareIntent = new Intent();
            oShareIntent.setComponent(name);
            oShareIntent.setType(\"text/plain\");
            oShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, \"Website : www.google.com\");
            oShareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(filePath));
            oShareIntent.setType(\"image/jpeg\");
            oShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            MainActivity.this.startActivity(oShareIntent);


        } catch (Exception e) {
            Toast.makeText(MainActivity.this, \"WhatsApp require..!!\", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals(\"instagram\"))
    {
        Intent intent = getPackageManager().getLaunchIntentForPackage(\"com.instagram.android\");
        if (intent != null)
        {
            File filePath =new File(\"/sdcard/folder name/\"abc.png\");
            Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
            shareIntent.setType(\"image\");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(\"file://\" + \"/sdcard/Chitranagari/abc.png\"));
            shareIntent.setPackage(\"com.instagram.android\");
            startActivity(shareIntent);

        }
        else
        {
            Toast.makeText(MainActivity.this, \"Instagram require..!!\", Toast.LENGTH_SHORT).show();

        }
    }
    if(temp.equals(\"googleplus\"))
    {

        try
        {

            Calendar c = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat(\"dd-MM-yyyy hh:mm:ss\");
            String strDate = sdf.format(c.getTime());
            Intent shareIntent = ShareCompat.IntentBuilder.from(MainActivity.this).getIntent();
            shareIntent.setType(\"text/plain\");
            shareIntent.putExtra(Intent.EXTRA_TEXT, \"Website : www.google.com\");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(\"file://\" + \"/sdcard/folder name/abc.png\"));
            shareIntent.setPackage(\"com.google.android.apps.plus\");
            shareIntent.setAction(Intent.ACTION_SEND);
            startActivity(shareIntent);
        }catch (Exception e)
        {
            e.printStackTrace();
            Toast.makeText(MainActivity.this, \"Googleplus require..!!\", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals(\"share\")) {

        File filePath =new File(\"/sdcard/folder name/abc.png\");  //optional //internal storage
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, \"Website : www.google.com\");
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(filePath));  //optional//use this when you want to send an image
        shareIntent.setType(\"image/jpeg\");
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(Intent.createChooser(shareIntent, \"send\"));

    }