How to share multilple images via email
<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>
