如果做过移动办公软件,或者掌上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, 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>