您的位置:首页 > 移动开发 > Android开发

android截屏功能实现

2014-01-06 23:37 465 查看
这篇文章实现了截取当前Activity页面,并把截屏图片储存在SD卡指定路径下功能(亲测可用)。

首先要确保manifest有操作SD卡权限

<!-- 允许应用内置sd卡 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


下面方法是根据当前的activity截屏,生成bitmap对象

/**
* 获取指定Activity的截屏,保存到png文件
*
* @author Johnson
* **/
private static Bitmap takeScreenShot(Activity activity) {
// View是你需要截图的View
View view = activity.getWindow().getDecorView();
// 设置是否可以进行绘图缓存
view.setDrawingCacheEnabled(true);
// 如果绘图缓存无法,强制构建绘图缓存
view.buildDrawingCache();
// 返回这个缓存视图
Bitmap bitmap = view.getDrawingCache();
// 获取状态栏高度
Rect frame = new Rect();
// 测量屏幕宽和高
view.getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
Log.d("ViewDescActivity","状态栏的高度为: "+statusBarHeight);
// 获取屏幕长和高
int width = activity.getWindowManager().getDefaultDisplay().getWidth();
int height = activity.getWindowManager().getDefaultDisplay().getHeight();
// 去掉标题栏
// Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
bitmap = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width, height-statusBarHeight);
//view.destroyDrawingCache();
return bitmap;
}


然后我们应该查看SD卡是不是够用

/***
* Sd判断SD卡是否可用
*
* @author Johnson minSizeSDcard>50kb
* */
public static boolean getAvailableSDcard(Context context) {
long minSizeSDcard = 50;
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) {
return true;
} else {
Toast.makeText(context, "SD卡空间不足", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(context, "请插入SD卡", Toast.LENGTH_SHORT)
.show();
}
return false;
}


最后生成png图片保存到指定路径

/**
* 截图保存
*
* @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();
}
}


可以这样调用

Bitmap bitmap = takeScreenShot(ViewDescActivity.this);
String fileName = String.valueOf(System.currentTimeMillis());
if(getAvailableSDcard(ViewDescActivity.this)){
savePic(bitmap,Constant.SD_DIR_SCREEN_SHOT,fileName+".png");
localUrl =  Constant.SD_DIR_SCREEN_SHOT+ fileName+".PNG";
}


开始忘记加允许应用内置sd卡权限,系统报错:

01-06 23:32:40.203: ERROR/ActivityThread(1954): Failed to find provider info for com.qihoo360.daemon
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track delete
01-06 23:32:43.148: ERROR/AudioTrack(1632): stop 0x528b88
01-06 23:32:43.148: ERROR/AudioTrack(1632): Stop complete
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track exit start
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track exit done
01-06 23:32:43.335: ERROR/AudioTrack(1632): stop 0x545d70
01-06 23:32:43.335: ERROR/AudioTrack(1632): Stop complete

然后忘记在fileName后面加“.png” 后果就是生成非图片文件。

提醒自己以后不要这么粗心了。

参考博客:http://blog.csdn.net/developer_jiangqq/article/details/12164239
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: