Android截屏分享功能
最近项目需要实现Android截屏分享功能,包括Android截屏获取图片、将图片保存到本地、通知系统相册更新、通过微信、QQ、微博分享截屏图片,本篇文章作为总结回顾。
一、Android截屏获取图片
通过对view进行绘制,得到bitmap,可以对Activity、Fragment进行绘制,也可以对其他的View进行绘制。
1Activity截图(带空白的状态栏)
publicBitmapshotScreen(Activityactivity){
Viewview=activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmapbitmap=Bitmap.createBitmap(view.getDrawingCache(),0,0,view.getMeasuredWidth(),view.getMeasuredHeight());
view.setDrawingCacheEnabled(false);
view.destroyDrawingCache();
returnbitmap;
}
2Activity截图(去掉状态栏)
publicBitmapshotActivityNoBar(Activityactivity){
//获取windows中最顶层的view
Viewview=activity.getWindow().getDecorView();
view.buildDrawingCache();
//获取状态栏高度
Rectrect=newRect();
view.getWindowVisibleDisplayFrame(rect);
intstatusBarHeights=rect.top;
Displaydisplay=activity.getWindowManager().getDefaultDisplay();
//获取屏幕宽和高
intwidths=display.getWidth();
intheights=display.getHeight();
//允许当前窗口保存缓存信息
view.setDrawingCacheEnabled(true);
//去掉状态栏
Bitmapbmp=Bitmap.createBitmap(view.getDrawingCache(),0,
statusBarHeights,widths,heights-statusBarHeights);
//销毁缓存信息
view.destroyDrawingCache();
returnbmp;
}
3Fragment截图
publicBitmapgetFragmentBitmap(Fragmentfragment){
Viewv=fragment.getView();
v.buildDrawingCache(false);
returnv.getDrawingCache();
}
绘制View的方式只适用于静态View,SurfaceView、IjkVideoView等播放视频的View,不能截取到;此外,某些动画类View也不能截取到。针对上述情况,可获取SurfaceView的一帧生成bitmap,将bitmap进行合并,同理动画类View也可以合并。例如,最底层播放视频、中间层播放动画、最上层是普通的view,可将bitmap合并,如下:
publicBitmapcombineBitmapInCenter(Bitmapbackground,BitmapmidBitmap,Bitmapforeground){
if(!background.isMutable()){
background=background.copy(Bitmap.Config.ARGB_8888,true);
}
Paintpaint=newPaint();
Canvascanvas=newCanvas(background);
intbw=background.getWidth();
intbh=background.getHeight();
intmw=midBitmap.getWidth();
intmh=midBitmap.getHeight();
intmx=(mw-bw)/2;
intmy=(mh-bh)/2;
canvas.drawBitmap(midBitmap,mx,my,paint);
intfw=foreground.getWidth();
intfh=foreground.getHeight();
intfx=(fw-bw)/2;
intfy=(fh-bh)/2;
canvas.drawBitmap(foreground,fx,fy,paint);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
returnbackground;
}
需要注意:view的绘制必须在UI线程完成,否则会crash;bitmap的合并会较耗时,需在子线程完成。
二、将bitmap保存在本地
publicvoidsaveBitmapToFile(StringfileName,Bitmapbitmap){
if(TextUtils.isEmpty(fileName)||bitmap==null)return;
try{
Filef=newFile(fileName);
f.createNewFile();
FileOutputStreamfOut=newFileOutputStream(f);
bitmap.compress(Bitmap.CompressFormat.JPEG,80,fOut);
fOut.flush();
fOut.close();
}catch(FileNotFoundExceptione){
Log.i("ScreenShotUtil","保存失败");
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
三、通知系统相册更新
publicvoidAlbumScan(StringfileName){
MediaScannerConnection.scanFile(mActivity.getApplicationContext(),newString[]{fileName},newString[]{"image/jpeg"},null);
}
四、通过微信、QQ、微博分享
通过微信、QQ、微博分享的sdk实现,如下:
1分享到微信朋友圈
publicvoidshareToWexinCircle(){
if(iShareService.isWeixinInstalled()){//判断微信是否安装
BitmapmWXShareBitmap=mLatesBitmap;//将截屏得到的bitmap赋值
WXImageObjectimgObject=newWXImageObject(mWXShareBitmap);
WXMediaMessagemediaMessage=newWXMediaMessage();
mediaMessage.mediaObject=imgObject;
Log.i(TAG,"mediaMessage.mediaObject=imgObject");
//设置缩略图
BitmapthumbBmp=Bitmap.createScaledBitmap(mWXShareBitmap,50,80,true);
mediaMessage.thumbData=bmpToByteArray(thumbBmp,true);
Log.i(TAG,"设置缩略图");
//requesttowx
SendMessageToWX.Reqreq=newSendMessageToWX.Req();
req.transaction=buildTransaction("img");//分享类型是图片
req.message=mediaMessage;
req.scene=SendMessageToWX.Req.WXSceneTimeline;//分享到朋友圈
Log.i(TAG,"requesttowx");
IWXAPIapi=WXAPIFactory.createWXAPI(mActivity,"微信分享id",true);
api.registerApp("微信分享id");
booleanresult=api.sendReq(req);
Log.i(TAG,"sharetocircle:"+result);
}else{
ToastUtils.show(mActivity,"您没有安装微信客户端");
}
}
publicbyte[]bmpToByteArray(finalBitmapbmp,finalbooleanneedRecycle){
ByteArrayOutputStreamoutput=newByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG,100,output);
if(needRecycle){
bmp.recycle();
}
byte[]result=output.toByteArray();
try{
output.close();
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
privateStringbuildTransaction(finalStringtype){
return(type==null)?String.valueOf(System.currentTimeMillis()):type+System.currentTimeMillis();
}
2、分享到微信好友
2、分享到微信好友
publicvoidshareWexinFriend(){ if(iShareService.isWeixinInstalled()){ mWXShareBitmap=mLatesBitmap; WXImageObjectimgObject=newWXImageObject(mWXShareBitmap); WXMediaMessagemediaMessage=newWXMediaMessage(); mediaMessage.mediaObject=imgObject; //设置缩略图 BitmapthumbBmp=Bitmap.createScaledBitmap(mWXShareBitmap,50,80,true); mediaMessage.thumbData=bmpToByteArray(thumbBmp,true); //requesttowx SendMessageToWX.Reqreq=newSendMessageToWX.Req(); req.transaction=buildTransaction("img"); req.message=mediaMessage; req.scene=SendMessageToWX.Req.WXSceneSession; IWXAPIapi=WXAPIFactory.createWXAPI(mActivity,"微信分享id",true); api.registerApp("微信分享id"); booleanresult=api.sendReq(req); Log.i(TAG,"sharetoweixin:"+result); }else{ ToastUtils.show(mActivity,"您没有安装微信客户端"); } }
3、分享到QQ好友
4QQ空间分享
publicvoidshareToQQZone(){
if(iShareService.isQQInstalled()){
Tencenttencent=Tencent.createInstance("QQid",mActivity);
Bundleparams=newBundle();
params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL,mLatestImagePath);
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE,QQShare.SHARE_TO_QQ_TYPE_IMAGE);
params.putInt(QQShare.SHARE_TO_QQ_EXT_INT,QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
tencent.shareToQQ(mActivity,params,newIUiListener(){
@Override
publicvoidonComplete(Objecto){
ToastUtils.show(mActivity,"分享成功!");
}
@Override
publicvoidonError(UiErroruiError){
ToastUtils.show(mActivity,"分享失败,请稍后重试!");
Log.i(TAG,"shareToQQonError,errorcode:"+uiError.errorCode);
}
@Override
publicvoidonCancel(){
Log.i(TAG,"shareToQQonCancel");
}
});
}else{
ToastUtils.show(mActivity,"您没有安装QQ客户端");
}
5微博分享
publicvoidshareToWeibo(){
if(iShareService.isWeiboInstalled()){
Log.i(TAG,"iShareService.isWeiboInstalled()");
IWeiboShareAPIapi=WeiboShareSDK.createWeiboAPI(mActivity,"微博id");
if(api.isWeiboAppInstalled()){
api.registerApp();
}
WeiboMultiMessageweiboMultiMessage=newWeiboMultiMessage();
Bitmapbitmap=mLatesBitmap;//截图bitmap
ImageObjectimageObject=newImageObject();
imageObject.setImageObject(bitmap);
weiboMultiMessage.imageObject=imageObject;
SendMultiMessageToWeiboRequestrequest=newSendMultiMessageToWeiboRequest();
request.transaction=String.valueOf(System.currentTimeMillis());
request.multiMessage=weiboMultiMessage;
booleanrequestWeibo=api.sendRequest(request);
Log.i(TAG,"sharetoweibo:"+requestWeibo);
}else{
ToastUtils.show(mActivity,"您没有安装微博客户端");
}
}
总结
以上所述是小编给大家介绍的Android截屏分享功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!