android开发实例03:屏幕截图并调用邮件发送

时间:2022-07-23 15:22:28
如果做过移动办公软件,或者掌上BI软件话,一般就会有一项功能,就是用户可以当前屏幕的显示的报表或者数据,截图并发送功能。     其中有一个开发时候的小技巧:    /* 
* 用email.setType("image/png");或者email.setType( 
* "application/octet-stream"); 都不会影响邮件的发送 
* 为什么email.setType("image/png" 
* );而不用email.setType("application/octet-stream"); ? 
* 因为在开发中发现setType("image/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("image/png");或者email.setType( 
        * "application/octet-stream"); 都不会影响邮件的发送 
        * 为什么email.setType("image/png" 
        * );而不用email.setType("application/octet-stream"); ? 
        * 因为在开发中发现setType("image/png"),系统会同时给你调用彩信,邮件,等..... 
        */
 

      File file = new File(path); 
      email.putExtra(android.content.Intent.EXTRA_STREAM, 
          Uri.fromFile(file)); 
      email.setType("image/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, nullnullnull, 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>