2012-11-15 24 views
1

我使用图像下载器将来自互联网的一些图像显示到我的列表视图中。图像使用散列码存储在SD卡中。我可以如何通过电子邮件共享这些图像。默认的Gmail客户端显示我附上了images.But在实际主要我看不到任何attachment.Only电子邮件正文是可用的。下面是使用代码IM如何通过电子邮件分享多个图像

活动

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>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<Uri> uris = new ArrayList<Uri>(); 

       String mailText = ""; 


      for(int i=0;i<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); 
    } 


} 

ImgAdapter

public class ImgAdapter extends ArrayAdapter<String> { 

    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; 

    } 

} 

ImageDownloader

public class ImageDownloader { 

    Map<String,Bitmap> imageCache; 

    public ImageDownloader(){ 
     imageCache = new HashMap<String, Bitmap>(); 

    } 

    //download function 
    public void download(String url, ImageView imageView) { 
     if (cancelPotentialDownload(url, imageView)&&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<String, Void, Bitmap> { 
     private String url; 
     private final WeakReference<ImageView> imageViewReference; 

     public BitmapDownloaderTask(ImageView imageView) { 
      imageViewReference = new WeakReference<ImageView>(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<BitmapDownloaderTask> bitmapDownloaderTaskReference; 

     public DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask) { 
      super(Color.BLACK); 
      bitmapDownloaderTaskReference = 
       new WeakReference<BitmapDownloaderTask>(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; 
    } 
} 

activity_main

<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" > 

    <Button 
     android:id="@+id/btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Email Share" /> 

    <ListView 
     android:id="@+id/lv" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" > 
    </ListView> 

</LinearLayout> 

lvrow

<?xml version="1.0" encoding="utf-8"?> 
<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" 
    > 
    <ImageView 
     android:id="@+id/img" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:background="@drawable/ic_launcher" 
     /> 

</LinearLayout> 

清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.multipleemailattachment" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 

    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 


    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

我失去了什么?

回答