最近项目需要实现Android截屏分享功能,包括Android截屏获取图片,将图片保存到本地,通知系统相册更新,通过微信,QQ,微博分享截屏图片,本篇文章作为总结回顾。
,,,通过对视图进行绘制,得到的位图,可以对活动片段进行绘制,也可以对其他的观点进行绘制。
, <>强,,1截活动图(带空白的状态栏)强>
公共位图shotScreen(活动活动){ .getDecorView视图视图=activity.getWindow () (); view.setDrawingCacheEnabled(真正的); view.buildDrawingCache (); 位图的位图=Bitmap.createBitmap (view.getDrawingCache (), 0, 0, view.getMeasuredWidth (), view.getMeasuredHeight ()); view.setDrawingCacheEnabled(假); view.destroyDrawingCache (); 返回位图; }
,, <强>,2活动截图(去掉状态栏)强>
公共位图shotActivityNoBar(活动活动){//获取窗口中最顶层的观点 .getDecorView视图视图=activity.getWindow () (); view.buildDrawingCache ();//获取状态栏高度 矩形矩形=new矩形(); view.getWindowVisibleDisplayFrame(矩形); int statusBarHeights=rect.top; 显示器显示=activity.getWindowManager () .getDefaultDisplay ();//获取屏幕宽和高 int宽度=display.getWidth (); int高度=display.getHeight ();//允许当前窗口保存缓存信息 view.setDrawingCacheEnabled(真正的);//去掉状态栏 位图bmp=Bitmap.createBitmap (view.getDrawingCache (), 0, statusBarHeights,宽度,高度,statusBarHeights);//销毁缓存信息 view.destroyDrawingCache (); 返回bmp; }
<强> 3片段截图强>
公共位图getFragmentBitmap(片段片段){ 视图v=fragment.getView (); v.buildDrawingCache(假); 返回v.getDrawingCache (); }
,,,绘制视图的方式只适用于静态来看,SurfaceView, IjkVideoView等播放视频的观点,不能截取到,此外,某些动画类视图也不能截取到。针对上述情况,可获取SurfaceView的一帧生成位图,将位图进行合,并同理动画类视图也可以合并,例如,最底层播放视频,中间层播放动画,最上层是普通的视图中,可将位图合并,如下:
公共位图combineBitmapInCenter(背景位图,位图midBitmap,位图前景){ 如果(! background.isMutable ()) { 背景=background.copy (Bitmap.Config。ARGB_8888,真正的); } 涂漆=new (); 帆布画布=新画布(背景); int bw=background.getWidth (); int bh=background.getHeight (); int mw=midBitmap.getWidth (); int mh=midBitmap.getHeight (); int mx=(mw - bw)/2; int=(mh - bh)/2; 画布。drawBitmap (midBitmap mx,我、油漆); int fw=foreground.getWidth (); int fh=foreground.getHeight (); int fx=(fw - bw)/2; int财政年度=(fh - bh)/2; 画布。drawBitmap(前景、外汇、财政年度、油漆); canvas.save (Canvas.ALL_SAVE_FLAG); canvas.restore (); 返回背景; }
,,,需要注意:视图的绘制必须在UI线程完成,否则会崩溃,位图的合并会较耗时,需在子线程完成。
公共空间saveBitmapToFile (String文件名,位图的位图){ 如果(TextUtils.isEmpty(文件名)| |位图==null)返回; 尝试{ 文件f=新文件(文件名); f.createNewFile (); FileOutputStream输出信号=new FileOutputStream (f); bitmap.compress(80年Bitmap.CompressFormat.JPEG,输出端); fOut.flush (); fOut.close (); }捕捉(FileNotFoundException e) { 日志。我(“ScreenShotUtil”、“保存失败”); e.printStackTrace (); }捕捉(IOException e) { e.printStackTrace (); } }
公共空间AlbumScan(字符串文件名){ MediaScannerConnection.scanFile (mActivity.getApplicationContext()、新String[]{文件名},新String[]{“图像/jpeg”}, null); }
,,,QQ,通过微信微博分享的sdk实现,如下:
, <>强,,1分享到微信朋友圈强>
公共空间shareToWexinCircle () { 如果(iShareService.isWeixinInstalled()){//判断微信是否安装 位图mWXShareBitmap=mLatesBitmap;//将截屏得到的位图赋值 WXImageObject imgObject=new WXImageObject (mWXShareBitmap); WXMediaMessage mediaMessage=new WXMediaMessage (); mediaMessage。mediaObject=imgObject; mediaMessage Log.i(标签。”mediaObject=imgObject ");//设置缩略图 位图thumbBmp=Bitmap.createScaledBitmap (mWXShareBitmap、50、80,真); mediaMessage。thumbData=https://www.yisu.com/zixun/bmpToByteArray (thumbBmp,真实); Log.i(标签,“设置缩略图”);//请求wx SendMessageToWX。点播点播=new SendMessageToWX.Req (); 要求的事情。事务=buildTransaction (img ");//分享类型是图片 要求的事情。消息=mediaMessage; 要求的事情。现?SendMessageToWX.Req.WXSceneTimeline;//分享到朋友圈 日志。我(标签,“天气请求”); IWXAPI api=WXAPIFactory.createWXAPI (mActivity,“微信分享id”,真正的); api.registerApp(“微信分享id”); 布尔结果=api.sendReq(要求的); 日志。我(标签,“分享圈:“+结果); 其他}{ ToastUtils。显示(mActivity,“您没有安装微信客户端”); } } 公共byte [] bmpToByteArray(最后一个位图bmp,最终布尔needRecycle) { ByteArrayOutputStream输出=new ByteArrayOutputStream (); bmp.compress (Bitmap.CompressFormat.PNG、100、输出); 如果(needRecycle) { bmp.recycle (); } 结果byte []=output.toByteArray (); 尝试{ output.close (); }捕捉(异常e) { e.printStackTrace (); } 返回结果; } & lt;以前的名字=按搿眂lass=癹ava”在私人字符串buildTransaction(最终字符串类型){ 返回(类型==null) & # 63;String.valueOf (System.currentTimeMillis()):类型+ System.currentTimeMillis (); }& lt;/pre> & lt; h4> & lt; name=" t8祝辞& lt;/a> & lt; br>安卓系统截屏分享功能