如果做过移动办公软件,或者掌上BI软件话,一般就会有一项功能,就是用户可以当前屏幕的显示的报表或者数据,截图并发送功能。
 
 
其中有一个开发时候的小技巧:
 
 /*
* 用email.setType("p_w_picpath/png");或者email.setType(
* "application/octet-stream"); 都不会影响邮件的发送
* 为什么email.setType("p_w_picpath/png"
* );而不用email.setType("application/octet-stream"); ?
* 因为在开发中发现setType("p_w_picpath/png"),系统会同时给你调用彩信,邮件,等.....
*/
 
 
下面和大家分享下实现~~
 
package com.johnson.Screenshot;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Environment;
import android.os.StatFs;
import android.view.View;
import android.widget.Toast;

public class ScreenshotTools {

  /***
    * @author Johnson
    *    
    * */


  public static long minSizeSDcard = 50;
  public static String filePath = Environment.getExternalStorageDirectory()
      + "/FJBICache";
  public static String fileName = "chart.png";
  public static String detailPath = filePath + File.separator + fileName;
  public static final int SEND_EMAIL = 1;

  // public static String detailPath="/sdcard/FjbiCache/chart.png";

  /**
    * 调用系统程序发送邮件
    *    
    * @author Johnson
    *    
    * */


  private static void sendEmail(Context context, String[] to, String subject,
      String body, String path) {

    Intent email = new Intent(android.content.Intent.ACTION_SEND);

    if (to != null) {
      email.putExtra(android.content.Intent.EXTRA_EMAIL, to);
    }
    if (subject != null) {
      email.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
    }
    if (body != null) {
      email.putExtra(android.content.Intent.EXTRA_TEXT, body);
    }
    if (path != null) {

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


      File file = new File(path);
      email.putExtra(android.content.Intent.EXTRA_STREAM,
          Uri.fromFile(file));
      email.setType("p_w_picpath/png");
    }
    context.startActivity(Intent.createChooser(email, "请选择发送软件"));

  }

  /**
    * 获取指定Activity的截屏,保存到png文件
    *    
    * @author Johnson
    * **/


  private static Bitmap takeScreenShot(Activity activity) {
    // View是你需要截图的View
    View view = activity.getWindow().getDecorView();
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();
    Bitmap b1 = view.getDrawingCache();

    // 获取状态栏高度
    Rect frame = new Rect();
    activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
    int statusBarHeight = frame.top;
    System.out.println(statusBarHeight);

    // 获取屏幕长和高
    int width = activity.getWindowManager().getDefaultDisplay().getWidth();
    int height = activity.getWindowManager().getDefaultDisplay()
        .getHeight();
    // 去掉标题栏
    // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
    Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height
        - statusBarHeight);
    view.destroyDrawingCache();
    return b;
  }

  /**
    * 截图保存
    *    
    * @author Johnson
    * **/

  private static void savePic(Bitmap b, String filePath, String fileName) {

    File f = new File(filePath);

    if (!f.exists()) {
      f.mkdir();
    }
    FileOutputStream fos = null;
    try {
      fos = new FileOutputStream(filePath + File.separator + fileName);
      if (null != fos) {
        b.compress(Bitmap.CompressFormat.PNG, 90, fos);
        fos.flush();
        fos.close();
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  /**
    *    
    * 截屏并发送邮件
    *    
    * @author Johnson
    * **/

  public static void takeScreenShotToEmail(Context context, Activity a) {

    if (getAvailableSDcard(context)) {
      savePic(takeScreenShot(a), filePath, fileName);

      // selectDialog(context);
      sendEmail(context, null, null, null, detailPath);
    }

  }

  /***
    * Sd判断SD卡是否可用
    *    
    * @author Johnson minSizeSDcard>50kb
    * */


  public static boolean getAvailableSDcard(Context context) {

    boolean sdCardExist = Environment.getExternalStorageState().equals(
        android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在

    System.out.println("+++" + sdCardExist);
    if (sdCardExist) {
      File path = Environment.getExternalStorageDirectory();
      StatFs stat = new StatFs(path.getPath());
      long blockSize = stat.getBlockSize();
      long availableBlocks = stat.getAvailableBlocks();
      long sdCardSize = (availableBlocks * blockSize) / 1024;// KB值

      if (sdCardSize > minSizeSDcard) {
        System.out.println("SDcardSize:::" + minSizeSDcard + "KB");
        return true;
      } else {
        Toast.makeText(context, "SD卡空间不足", Toast.LENGTH_SHORT).show();
      }

    } else {
      Toast.makeText(context, "请在使用转发功能之前插入SD卡", Toast.LENGTH_SHORT)
          .show();

    }
    return false;
  }

}
 
 

 
package com.johnson.Screenshot;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ScreenshotActivity extends Activity {
        /** Called when the activity is first created. */
    
  Button bt;
  Context mContext;
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                bt=(Button)findViewById(R.id.button1);
                mContext=this;
                bt.setOnClickListener(new OnClickListener() {
        
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        ScreenshotTools.takeScreenShotToEmail(mContext, ScreenshotActivity.this);
      }
    });
                
                
                
        }
}
 
 

 
<?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="fill_parent"
        android:orientation="vertical" >



        <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/button_text" />

</LinearLayout>