title: How to share multilple images via email
body: <p>Im showing some images from internet to my listview using an image dowloader.The images are stored in sd card using hashcode.How can i share those images from via email.In the default Gmail client shows i have attached the images.But in actual main i could not see any attachment.Only email body is availble . Here is the code im using </p>
  
  <p>Activity</p>
  
  <pre><code>public class MainActivity extends Activity {
      public static final String arrGroupelements[] = { "http://api.androidhive.info/music/images/adele.png",
          "http://api.androidhive.info/music/images/eminem.png", "http://api.androidhive.info/music/images/mj.png"
  
  };
      ListView lv;
      Button btn;
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          Intializeviews();
          ImgAdapter adapter = new ImgAdapter(MainActivity.this, arrGroupelements);
          lv.setAdapter(adapter);
  
          setListenersForViews();
      }
  
      private void setListenersForViews() {
      btn.setOnClickListener(new OnClickListener() {
  
          @Override
          public void onClick(View v) {
  
              if(arrGroupelements.length&gt;0)
              {
  
                  Intent mailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
  
                  mailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,new String[]{""});
                  mailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Hows the pic");
                  ArrayList&lt;Uri&gt; uris = new ArrayList&lt;Uri&gt;();
  
                  String mailText =  "";
  
  
              for(int i=0;i&lt;arrGroupelements.length;i++)
              {
  
                  String ImagePath = arrGroupelements[i].toString();
  
                  StringBuilder builder = new StringBuilder();
  
                  String sampleFile= Download(ImagePath);
  
                  mailText = mailText+"i shared "+ImagePath;  
                  try
                  {
                       ContentValues values = new ContentValues(7);
                       values.put(Images.Media.TITLE, sampleFile);
                       values.put(Images.Media.DISPLAY_NAME, ImagePath);
                       values.put(Images.Media.DATE_TAKEN, new Date().getTime());
                       values.put(Images.Media.MIME_TYPE, "image/jpeg");
                       values.put(Images.ImageColumns.BUCKET_ID, sampleFile.hashCode());
                       values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, sampleFile);
                       values.put("_data", sampleFile);
                       ContentResolver contentResolver = getApplicationContext().getContentResolver();
                       Uri uri = contentResolver.insert(Images.Media.EXTERNAL_CONTENT_URI, values);
                       uris.add(uri);
                  }
                  catch (Exception e) 
                  {
  
                  }
  
              }
              Bundle bundle = new Bundle();
              mailIntent.putExtra(Intent.EXTRA_TEXT, mailText);
  
              mailIntent.putParcelableArrayListExtra(android.content.Intent.EXTRA_STREAM, uris);
              mailIntent.setType("multipart/mixed");
  
                  startActivityForResult(Intent.createChooser(mailIntent, "Choose client"),500);
              }
  
          }
  
          private String Download(String url) {
  
              String filename = String.valueOf(url.hashCode());
  
              File f = new File(android.os.Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator +"data/test/images/", filename+".png");
              if(f.isFile())
              {
              return android.os.Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator +"data/test/images/"+File.separator+ filename+".png";
              }
              return "";
  
          }
  
  
      });
  
  
      }
  
      private void Intializeviews() {
           lv=(ListView)findViewById(R.id.lv);
           btn=(Button)findViewById(R.id.btn);
      }
  
  
  }
  </code></pre>
  
  <p>ImgAdapter</p>
  
  <pre><code>public class ImgAdapter extends ArrayAdapter&lt;String&gt; {
  
      private final Activity context;
      private final String[] names;
      ImageDownloader downloader;
  
      public ImgAdapter(Activity context, String[] names) {
  
          super(context, R.layout.lvrow, names);
          this.context = context;
          this.names = names;
          Log.e("size of names is ", String.valueOf(names.length));
      }
  
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
  
          LayoutInflater inflater = context.getLayoutInflater();
          View rowView = inflater.inflate(R.layout.lvrow, null, true);
          ImageView img = (ImageView) rowView.findViewById(R.id.img);
  
          String url = names[position].toString();
  
          downloader = new ImageDownloader();
  
          downloader.download(url, img);
  
          return rowView;
  
      }
  
  }
  </code></pre>
  
  <p>ImageDownloader</p>
  
  <pre><code>public class ImageDownloader {
  
      Map&lt;String,Bitmap&gt; imageCache;
  
      public ImageDownloader(){
          imageCache = new HashMap&lt;String, Bitmap&gt;();
  
      }
  
      //download function
      public void download(String url, ImageView imageView) {
           if (cancelPotentialDownload(url, imageView)&amp;&amp;url!=null) {
  
               //Caching code right here
               String filename = String.valueOf(url.hashCode());
               File f = new File(getCacheDirectory(imageView.getContext()), filename);
  
                // Is the bitmap in our memory cache?
               Bitmap bitmap = null;
  
                bitmap = (Bitmap)imageCache.get(f.getPath());
                  BitmapFactory.Options bfOptions=new BitmapFactory.Options();
                  bfOptions.inDither=false;                     //Disable Dithering mode
                  bfOptions.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
                  bfOptions.inInputShareable=true;              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
                  bfOptions.inTempStorage=new byte[32 * 1024]; 
                  FileInputStream fs=null;
  
                if(bitmap == null){
  
                    //bitmap = BitmapFactory.decodeFile(f.getPath(),options);
                    try {
                        fs = new FileInputStream(f);
                          if(fs!=null) bitmap=BitmapFactory.decodeFileDescriptor(fs.getFD(), null, bfOptions);
                      } catch (IOException e) {
                          //TODO do something intelligent
                          e.printStackTrace();
                      } finally{ 
                          if(fs!=null) {
                              try {
                                  fs.close();
                              } catch (IOException e) {
                                  // TODO Auto-generated catch block
                                  e.printStackTrace();
                              }
                          }
                      }
  
                    if(bitmap != null){
                        imageCache.put(f.getPath(), bitmap);
                    }
  
                }
                //No? download it
                if(bitmap == null){
                    BitmapDownloaderTask task = new BitmapDownloaderTask(imageView);
                    DownloadedDrawable downloadedDrawable = new DownloadedDrawable(task);
                    imageView.setImageDrawable(downloadedDrawable);
                    task.execute(url);
                }else{
                    //Yes? set the image
                    imageView.setImageBitmap(bitmap);
                }
           }
      }
  
      //cancel a download (internal only)
      private static boolean cancelPotentialDownload(String url, ImageView imageView) {
          BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);
  
          if (bitmapDownloaderTask != null) {
              String bitmapUrl = bitmapDownloaderTask.url;
              if ((bitmapUrl == null) || (!bitmapUrl.equals(url))) {
                  bitmapDownloaderTask.cancel(true);
              } else {
                  // The same URL is already being downloaded.
                  return false;
              }
          }
          return true;
      }
  
      //gets an existing download if one exists for the imageview
      private static BitmapDownloaderTask getBitmapDownloaderTask(ImageView imageView) {
          if (imageView != null) {
              Drawable drawable = imageView.getDrawable();
              if (drawable instanceof DownloadedDrawable) {
                  DownloadedDrawable downloadedDrawable = (DownloadedDrawable)drawable;
                  return downloadedDrawable.getBitmapDownloaderTask();
              }
          }
          return null;
      }
  
      //our caching functions
      // Find the dir to save cached images
      public static File getCacheDirectory(Context context){
          String sdState = android.os.Environment.getExternalStorageState();
          File cacheDir;
  
          if (sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {
              File sdDir = android.os.Environment.getExternalStorageDirectory();  
  
              //TODO : Change your diretcory here
              cacheDir = new File(sdDir,"data/test/images");
          }
          else
              cacheDir = context.getCacheDir();
  
          if(!cacheDir.exists())
              cacheDir.mkdirs();
              return cacheDir;
      }
  
      private void writeFile(Bitmap bmp, File f) {
            FileOutputStream out = null;
  
            try {
              out = new FileOutputStream(f);
              bmp.compress(Bitmap.CompressFormat.PNG, 80, out);
            } catch (Exception e) {
              e.printStackTrace();
            }
            finally { 
              try { if (out != null ) out.close(); }
              catch(Exception ex) {} 
            }
      }
      ///////////////////////
  
      //download asynctask
      public class BitmapDownloaderTask extends AsyncTask&lt;String, Void, Bitmap&gt; {
          private String url;
          private final WeakReference&lt;ImageView&gt; imageViewReference;
  
          public BitmapDownloaderTask(ImageView imageView) {
              imageViewReference = new WeakReference&lt;ImageView&gt;(imageView);
          }
  
          @Override
          // Actual download method, run in the task thread
          protected Bitmap doInBackground(String... params) {
               // params comes from the execute() call: params[0] is the url.
               url = (String)params[0];
               return downloadBitmap(params[0]);
          }
  
          @Override
          // Once the image is downloaded, associates it to the imageView
          protected void onPostExecute(Bitmap bitmap) {
              if (isCancelled()) {
                  bitmap = null;
              }
  
              if (imageViewReference != null) {
                  ImageView imageView = imageViewReference.get();
                  BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);
                  // Change bitmap only if this process is still associated with it
                  if (this == bitmapDownloaderTask) {
                      imageView.setImageBitmap(bitmap);
  
                      //cache the image
  
  
                      String filename = String.valueOf(url.hashCode());
                      File f = new File(getCacheDirectory(imageView.getContext()), filename);
  
                      imageCache.put(f.getPath(), bitmap);
  
                      writeFile(bitmap, f);
                  }
              }
          }
  
  
      }
  
      static class DownloadedDrawable extends ColorDrawable {
          private final WeakReference&lt;BitmapDownloaderTask&gt; bitmapDownloaderTaskReference;
  
          public DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask) {
              super(Color.BLACK);
              bitmapDownloaderTaskReference =
                  new WeakReference&lt;BitmapDownloaderTask&gt;(bitmapDownloaderTask);
          }
  
          public BitmapDownloaderTask getBitmapDownloaderTask() {
              return bitmapDownloaderTaskReference.get();
          }
      }
  
      //the actual download code
      static Bitmap downloadBitmap(String url) {
          HttpParams params = new BasicHttpParams();
          params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
          HttpClient client = new DefaultHttpClient(params);
          final HttpGet getRequest = new HttpGet(url);
  
          try {
              HttpResponse response = client.execute(getRequest);
              final int statusCode = response.getStatusLine().getStatusCode();
              if (statusCode != HttpStatus.SC_OK) { 
                  Log.w("ImageDownloader", "Error " + statusCode + " while retrieving bitmap from " + url); 
                  return null;
              }
  
              final HttpEntity entity = response.getEntity();
              if (entity != null) {
                  InputStream inputStream = null;
                  try {
                      inputStream = entity.getContent(); 
                      final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                      return bitmap;
                  } finally {
                      if (inputStream != null) {
                          inputStream.close();  
                      }
                      entity.consumeContent();
                  }
              }
          } catch (Exception e) {
              // Could provide a more explicit error message for IOException or IllegalStateException
              getRequest.abort();
              Log.w("ImageDownloader", "Error while retrieving bitmap from " + url + e.toString());
          } finally {
              if (client != null) {
                  //client.close();
              }
          }
          return null;
      }
  }
  </code></pre>
  
  <p>activity_main</p>
  
  <pre><code>&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:orientation="vertical" &gt;
  
      &lt;Button
          android:id="@+id/btn"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Email Share" /&gt;
  
      &lt;ListView
          android:id="@+id/lv"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent" &gt;
      &lt;/ListView&gt;
  
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>lvrow</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:orientation="vertical"
      android:background="@android:color/darker_gray"
       &gt;
      &lt;ImageView 
          android:id="@+id/img"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:background="@drawable/ic_launcher"
          /&gt;
  
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>Manifest</p>
  
  <pre><code>&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.multipleemailattachment"
      android:versionCode="1"
      android:versionName="1.0" &gt;
  
      &lt;uses-sdk
          android:minSdkVersion="8"
          android:targetSdkVersion="15" /&gt;
  
      &lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;
      &lt;uses-permission android:name="android.permission.VIBRATE" /&gt;
      &lt;uses-permission android:name="android.permission.INTERNET" /&gt;
      &lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;
      &lt;uses-permission android:name="android.permission.WRITE_SETTINGS" /&gt;
      &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;
  
  
      &lt;application
          android:icon="@drawable/ic_launcher"
          android:label="@string/app_name"
          android:theme="@style/AppTheme" &gt;
          &lt;activity
              android:name=".MainActivity"
              android:label="@string/title_activity_main" &gt;
              &lt;intent-filter&gt;
                  &lt;action android:name="android.intent.action.MAIN" /&gt;
  
                  &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
              &lt;/intent-filter&gt;
          &lt;/activity&gt;
      &lt;/application&gt;
  
  &lt;/manifest&gt;
  </code></pre>
  
  <p>Am i missing anything?</p>