做掌上BT软件或者移动办公软件 ,一般都会有这样一个功能,用户可以对屏幕当前显示的数据或报表进行截图,并通过邮件发送。本文的开发实例就是要实现此功能。

       其中有一个开发时候的小技巧:

       用email.setType("image/png");或者email.setType("application/octet-stream"); 都不会影响邮件的发送。为什么email.setType("image/png");而不用email.setType("application/octet-stream"); ? 因为在开发中发现setType("image/png"),系统会同时给你调用彩信,邮件,等.....

       下面将实现方法跟大家分享一下:

Java代码
  1. package com.johnson.Screenshot;    
  2.   
  3. import java.io.File;    
  4. import java.io.FileNotFoundException;    
  5. import java.io.FileOutputStream;    
  6. import java.io.IOException;    
  7. import android.app.Activity;    
  8. import android.content.Context;    
  9. import android.content.Intent;    
  10. import android.graphics.Bitmap;    
  11. import android.graphics.Rect;    
  12. import android.net.Uri;    
  13. import android.os.Environment;    
  14. import android.os.StatFs;    
  15. import android.view.View;    
  16. import android.widget.Toast;    
  17.   
  18. public class ScreenshotTools {    
  19.   
  20.   /***   
  21.     * @author Johnson   
  22.     *      
  23.     * */    
  24.   
  25.   public static long minSizeSDcard = 50;    
  26.   public static String filePath = Environment.getExternalStorageDirectory()    
  27.       + "/FJBICache";    
  28.   public static String fileName = "chart.png";    
  29.   public static String detailPath = filePath + File.separator + fileName;    
  30.   public static final int SEND_EMAIL = 1;    
  31.   
  32.   // public static String detailPath="/sdcard/FjbiCache/chart.png";    
  33.   
  34.   /**   
  35.     * 调用系统程序发送邮件   
  36.     *      
  37.     * @author Johnson   
  38.     *      
  39.     * */    
  40.   
  41.   private static void sendEmail(Context context, String[] to, String subject,    
  42.       String body, String path) {    
  43.   
  44.     Intent email = new Intent(android.content.Intent.ACTION_SEND);    
  45.   
  46.     if (to != null) {    
  47.       email.putExtra(android.content.Intent.EXTRA_EMAIL, to);    
  48.     }    
  49.     if (subject != null) {    
  50.       email.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);    
  51.     }    
  52.     if (body != null) {    
  53.       email.putExtra(android.content.Intent.EXTRA_TEXT, body);    
  54.     }    
  55.     if (path != null) {    
  56.   
  57.       /*   
  58.         * 用email.setType("image/png");或者email.setType(   
  59.         * "application/octet-stream"); 都不会影响邮件的发送   
  60.         * 为什么email.setType("image/png"   
  61.         * );而不用email.setType("application/octet-stream"); ?   
  62.         * 因为在开发中发现setType("image/png"),系统会同时给你调用彩信,邮件,等.....   
  63.         */    
  64.   
  65.       File file = new File(path);    
  66.       email.putExtra(android.content.Intent.EXTRA_STREAM,    
  67.           Uri.fromFile(file));    
  68.       email.setType("image/png");    
  69.     }    
  70.     context.startActivity(Intent.createChooser(email, "请选择发送软件"));    
  71.   
  72.   }    
  73.   
  74.   /**   
  75.     * 获取指定Activity的截屏,保存到png文件   
  76.     *      
  77.     * @author Johnson   
  78.     * **/    
  79.   
  80.   private static Bitmap takeScreenShot(Activity activity) {    
  81.     // View是你需要截图的View    
  82.     View view = activity.getWindow().getDecorView();    
  83.     view.setDrawingCacheEnabled(true);    
  84.     view.buildDrawingCache();    
  85.     Bitmap b1 = view.getDrawingCache();    
  86.   
  87.     // 获取状态栏高度    
  88.     Rect frame = new Rect();    
  89.     activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);    
  90.     int statusBarHeight = frame.top;    
  91.     System.out.println(statusBarHeight);    
  92.   
  93.     // 获取屏幕长和高    
  94.     int width = activity.getWindowManager().getDefaultDisplay().getWidth();    
  95.     int height = activity.getWindowManager().getDefaultDisplay()    
  96.         .getHeight();    
  97.     // 去掉标题栏    
  98.     // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);    
  99.     Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height    
  100.         - statusBarHeight);    
  101.     view.destroyDrawingCache();    
  102.     return b;    
  103.   }    
  104.   
  105.   /**   
  106.     * 截图保存   
  107.     *      
  108.     * @author Johnson   
  109.     * **/    
  110.   private static void savePic(Bitmap b, String filePath, String fileName) {    
  111.   
  112.     File f = new File(filePath);    
  113.   
  114.     if (!f.exists()) {    
  115.       f.mkdir();    
  116.     }    
  117.     FileOutputStream fos = null;    
  118.     try {    
  119.       fos = new FileOutputStream(filePath + File.separator + fileName);    
  120.       if (null != fos) {    
  121.         b.compress(Bitmap.CompressFormat.PNG, 90, fos);    
  122.         fos.flush();    
  123.         fos.close();    
  124.       }    
  125.     } catch (FileNotFoundException e) {    
  126.       e.printStackTrace();    
  127.     } catch (IOException e) {    
  128.       e.printStackTrace();    
  129.     }    
  130.   }    
  131.   
  132.   /**   
  133.     *      
  134.     * 截屏并发送邮件   
  135.     *      
  136.     * @author Johnson   
  137.     * **/    
  138.   public static void takeScreenShotToEmail(Context context, Activity a) {    
  139.   
  140.     if (getAvailableSDcard(context)) {    
  141.       savePic(takeScreenShot(a), filePath, fileName);    
  142.   
  143.       // selectDialog(context);    
  144.       sendEmail(context, nullnullnull, detailPath);    
  145.     }    
  146.   
  147.   }    
  148.   
  149.   /***   
  150.     * Sd判断SD卡是否可用   
  151.     *      
  152.     * @author Johnson minSizeSDcard>50kb   
  153.     * */    
  154.   
  155.   public static boolean getAvailableSDcard(Context context) {    
  156.   
  157.     boolean sdCardExist = Environment.getExternalStorageState().equals(    
  158.         android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在    
  159.   
  160.     System.out.println("+++" + sdCardExist);    
  161.     if (sdCardExist) {    
  162.       File path = Environment.getExternalStorageDirectory();    
  163.       StatFs stat = new StatFs(path.getPath());    
  164.       long blockSize = stat.getBlockSize();    
  165.       long availableBlocks = stat.getAvailableBlocks();    
  166.       long sdCardSize = (availableBlocks * blockSize) / 1024;// KB值    
  167.   
  168.       if (sdCardSize > minSizeSDcard) {    
  169.         System.out.println("SDcardSize:::" + minSizeSDcard + "KB");    
  170.         return true;    
  171.       } else {    
  172.         Toast.makeText(context, "SD卡空间不足", Toast.LENGTH_SHORT).show();    
  173.       }    
  174.   
  175.     } else {    
  176.       Toast.makeText(context, "请在使用转发功能之前插入SD卡", Toast.LENGTH_SHORT)    
  177.           .show();    
  178.   
  179.     }    
  180.     return false;    
  181.   }    
  182.   
  183. }      
  184.   
  185.   
  186. package com.johnson.Screenshot;    
  187.   
  188. import android.app.Activity;    
  189. import android.content.Context;    
  190. import android.os.Bundle;    
  191. import android.view.View;    
  192. import android.view.View.OnClickListener;    
  193. import android.widget.Button;    
  194.   
  195. public class ScreenshotActivity extends Activity {    
  196.         /** Called when the activity is first created. */    
  197.        
  198.   Button bt;    
  199.   Context mContext;    
  200.         @Override    
  201.         public void onCreate(Bundle savedInstanceState) {    
  202.                 super.onCreate(savedInstanceState);    
  203.                 setContentView(R.layout.main);    
  204.                 bt=(Button)findViewById(R.id.button1);    
  205.                 mContext=this;    
  206.                 bt.setOnClickListener(new OnClickListener() {    
  207.            
  208.       @Override    
  209.       public void onClick(View v) {    
  210.         // TODO Auto-generated method stub    
  211.         ScreenshotTools.takeScreenShotToEmail(mContext, ScreenshotActivity.this);    
  212.       }    
  213.     });    
  214.                     
  215.                     
  216.                    
  217.         }    
  218. }  
XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.         android:layout_width="fill_parent"    
  4.         android:layout_height="fill_parent"    
  5.         android:orientation="vertical" >    
  6.         <Button    
  7.                 android:id="@+id/button1"    
  8.                 android:layout_width="wrap_content"    
  9.                 android:layout_height="wrap_content"    
  10.                 android:text="@string/button_text" />    
  11.   
  12. </LinearLayout>  
本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/example/56.html
2012年5月30日
发布:鸡啄米 分类:Android开发实例 浏览: 评论:0