Android截屏分享功能

发布时间:2020-08-23 03:48:10

来源:脚本之家

阅读:81

作者:奔跑的佩恩

最近项目需要实现Android截屏分享功能,包括Android截屏获取图片、将图片保存到本地、通知系统相册更新、通过微信、QQ、微博分享截屏图片,本篇文章作为总结回顾。

一、Android截屏获取图片

通过对view进行绘制,得到bitmap,可以对Activity、Fragment进行绘制,也可以对其他的View进行绘制。

1 Activity截图(带空白的状态栏)

public Bitmap shotScreen(Activity activity) {

View view = activity.getWindow().getDecorView();

view.setDrawingCacheEnabled(true);

view.buildDrawingCache();

Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache(), 0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

view.setDrawingCacheEnabled(false);

view.destroyDrawingCache();

return bitmap;

}

2 Activity截图(去掉状态栏)

public Bitmap shotActivityNoBar(Activity activity) {

// 获取windows中最顶层的view

View view = activity.getWindow().getDecorView();

view.buildDrawingCache();

// 获取状态栏高度

Rect rect = new Rect();

view.getWindowVisibleDisplayFrame(rect);

int statusBarHeights = rect.top;

Display display = activity.getWindowManager().getDefaultDisplay();

// 获取屏幕宽和高

int widths = display.getWidth();

int heights = display.getHeight();

// 允许当前窗口保存缓存信息

view.setDrawingCacheEnabled(true);

// 去掉状态栏

Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0,

statusBarHeights, widths, heights - statusBarHeights);

// 销毁缓存信息

view.destroyDrawingCache();

return bmp;

}

3 Fragment截图

public Bitmap getFragmentBitmap(Fragment fragment) {

View v = fragment.getView();

v.buildDrawingCache(false);

return v.getDrawingCache();

}

绘制View的方式只适用于静态View,SurfaceView、IjkVideoView等播放视频的View,不能截取到;此外,某些动画类View也不能截取到。针对上述情况,可获取SurfaceView的一帧生成bitmap,将bitmap进行合并,同理动画类View也可以合并。例如,最底层播放视频、中间层播放动画、最上层是普通的view,可将bitmap合并,如下:

public Bitmap combineBitmapInCenter(Bitmap background, Bitmap midBitmap, Bitmap foreground) {

if (!background.isMutable()) {

background = background.copy(Bitmap.Config.ARGB_8888, true);

}

Paint paint = new Paint();

Canvas canvas = new Canvas(background);

int bw = background.getWidth();

int bh = background.getHeight();

int mw = midBitmap.getWidth();

int mh = midBitmap.getHeight();

int mx = (mw - bw) / 2;

int my = (mh - bh) / 2;

canvas.drawBitmap(midBitmap, mx, my, paint);

int fw = foreground.getWidth();

int fh = foreground.getHeight();

int fx = (fw - bw) / 2;

int fy = (fh - bh) / 2;

canvas.drawBitmap(foreground, fx, fy, paint);

canvas.save(Canvas.ALL_SAVE_FLAG);

canvas.restore();

return background;

}

需要注意:view的绘制必须在UI线程完成,否则会crash;bitmap的合并会较耗时,需在子线程完成。

二 、将bitmap保存在本地

public void saveBitmapToFile(String fileName, Bitmap bitmap) {

if (TextUtils.isEmpty(fileName) || bitmap == null) return;

try {

File f = new File(fileName);

f.createNewFile();

FileOutputStream fOut = new FileOutputStream(f);

bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fOut);

fOut.flush();

fOut.close();

} catch (FileNotFoundException e) {

Log.i("ScreenShotUtil", "保存失败");

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

三、通知系统相册更新

public void AlbumScan(String fileName) {

MediaScannerConnection.scanFile(mActivity.getApplicationContext(), new String[]{fileName}, new String[]{"image/jpeg"}, null);

}

四、通过微信、QQ、微博分享

通过微信、QQ、微博分享的sdk实现,如下:

1 分享到微信朋友圈

public void shareToWexinCircle() {

if (iShareService.isWeixinInstalled()) {//判断微信是否安装

Bitmap mWXShareBitmap = mLatesBitmap;//将截屏得到的bitmap赋值

WXImageObject imgObject = new WXImageObject(mWXShareBitmap);

WXMediaMessage mediaMessage = new WXMediaMessage();

mediaMessage.mediaObject = imgObject;

Log.i(TAG,"mediaMessage.mediaObject = imgObject");

//设置缩略图

Bitmap thumbBmp = Bitmap.createScaledBitmap(mWXShareBitmap,50,80,true);

mediaMessage.thumbData = bmpToByteArray(thumbBmp,true);

Log.i(TAG,"设置缩略图");

//request to wx

SendMessageToWX.Req req = new SendMessageToWX.Req();

req.transaction = buildTransaction("img");//分享类型是图片

req.message = mediaMessage;

req.scene = SendMessageToWX.Req.WXSceneTimeline;//分享到朋友圈

Log.i(TAG,"request to wx");

IWXAPI api = WXAPIFactory.createWXAPI(mActivity,"微信分享id",true);

api.registerApp("微信分享id");

boolean result = api.sendReq(req);

Log.i(TAG,"share to circle:"+result);

} else {

ToastUtils.show(mActivity, "您没有安装微信客户端");

}

}

public byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {

ByteArrayOutputStream output = new ByteArrayOutputStream();

bmp.compress(Bitmap.CompressFormat.PNG, 100, output);

if (needRecycle) {

bmp.recycle();

}

byte[] result = output.toByteArray();

try {

output.close();

} catch (Exception e) {

e.printStackTrace();

}

return result;

}

private String buildTransaction(final String type) {

return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();

}

2、分享到微信好友

 public void shareWexinFriend() {

if (iShareService.isWeixinInstalled()) {

mWXShareBitmap = mLatesBitmap;

WXImageObject imgObject = new WXImageObject(mWXShareBitmap);

WXMediaMessage mediaMessage = new WXMediaMessage();

mediaMessage.mediaObject = imgObject;

//设置缩略图

Bitmap thumbBmp = Bitmap.createScaledBitmap(mWXShareBitmap,50,80,true);

mediaMessage.thumbData = bmpToByteArray(thumbBmp,true);

//request to wx

SendMessageToWX.Req req = new SendMessageToWX.Req();

req.transaction =buildTransaction("img");

req.message = mediaMessage;

req.scene = SendMessageToWX.Req.WXSceneSession;

IWXAPI api = WXAPIFactory.createWXAPI(mActivity,"微信分享id",true);

api.registerApp("微信分享id");

boolean result = api.sendReq(req);

Log.i(TAG,"share to weixin:"+result );

} else {

ToastUtils.show(mActivity, "您没有安装微信客户端");

}

}

3、分享到QQ好友

 public void shareToQQFriend() {

if (iShareService.isQQInstalled()) {//判断QQ是否安装

Tencent tencent = Tencent.createInstance("qq id", mActivity);

Bundle params = new Bundle();

params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, mLatestImagePath);//QQ分享只能分享本地图片,传入本地图片路径

params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);

tencent.shareToQQ(mActivity, params, new IUiListener() {//分享后的回调

@Override

public void onComplete(Object o) {

ToastUtils.show(mActivity,"分享成功!");

}

@Override

public void onError(UiError uiError) {

ToastUtils.show(mActivity,"分享失败,稍后重试!");

Log.i(TAG,"shareToQQ onError");

}

@Override

public void onCancel() {

Log.i(TAG,"shareToQQ onCancel");

}

});

} else {

ToastUtils.show(mActivity, "您没有安装QQ客户端");

}

}

4 QQ空间分享

public void shareToQQZone() {

if (iShareService.isQQInstalled()) {

Tencent tencent = Tencent.createInstance("QQ id", mActivity);

Bundle params = new Bundle();

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, new IUiListener() {

@Override

public void onComplete(Object o) {

ToastUtils.show(mActivity,"分享成功!");

}

@Override

public void onError(UiError uiError) {

ToastUtils.show(mActivity,"分享失败,请稍后重试!");

Log.i(TAG,"shareToQQ onError,error code:"+uiError.errorCode);

}

@Override

public void onCancel() {

Log.i(TAG,"shareToQQ onCancel");

}

});

} else {

ToastUtils.show(mActivity, "您没有安装QQ客户端");

}

5 微博分享

public void shareToWeibo() {

if (iShareService.isWeiboInstalled()) {

Log.i(TAG,"iShareService.isWeiboInstalled()");

IWeiboShareAPI api = WeiboShareSDK.createWeiboAPI(mActivity, "微博id");

if(api.isWeiboAppInstalled()) {

api.registerApp();

}

WeiboMultiMessage weiboMultiMessage = new WeiboMultiMessage();

Bitmap bitmap = mLatesBitmap;//截图bitmap

ImageObject imageObject = new ImageObject();

imageObject.setImageObject(bitmap);

weiboMultiMessage.imageObject = imageObject;

SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();

request.transaction = String.valueOf(System.currentTimeMillis());

request.multiMessage = weiboMultiMessage;

boolean requestWeibo = api.sendRequest(request);

Log.i(TAG,"share to weibo:"+requestWeibo );

} else {

ToastUtils.show(mActivity, "您没有安装微博客户端");

}

}

总结

以上所述是小编给大家介绍的Android截屏分享功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对亿速云网站的支持!

android分享截屏到微信,Android截屏分享功能相关推荐

  1. android sdk引入 微信分享_android 调用本地微信自定义多图分享朋友圈,可放在share sdk中一起使用...

    最终的效果图,右下角微信多图为自定义调用系统分享,分享到微信. 在你能正常调用share sdk的时候想在原本的基础上加自定义的分享非常的简单. 它的官网已经给出了代码,但是给的不是很清楚. lz毕竟 ...

  2. android视频播放处理,安卓版微信视频播放全屏处理

    问题 在安卓版微信里,video在播放的时候,如果在没有做任何处理的情况下,微信会全屏播放你的视频,会严重影响一些例如直播之类的边看视频边交互的H5应用(注:在iOS里可以通过playsinline( ...

  3. android指南针小程序,使用微信小程序实现指南针功能

    使用微信小程序实现指南针功能 发布时间:2020-10-26 15:18:16 来源:亿速云 阅读:79 作者:Leah 本篇文章为大家展示了使用微信小程序实现指南针功能,内容简明扼要并且容易理解,绝 ...

  4. android分享截屏到微信,Android 微信分享长图 ScrollView 生成长截图 View变bitmap

    这个不太难,绘制本页布局为图片 这样的功能 1.截屏 这个对于我这个CV战士来说,一见面我就觉得不可取了, ①.截屏 如果有三方库的话 最好了,没有 只能调 手机自带的,然而自带就意味着权限 ②.去除 ...

  5. android 分享小程序到微信,Android 分享微信小程序之图片优化

    小菜上周接入了微信分享小程序的入口,基本功能实现都没问题,有需要的朋友可以了解一下 Android 分享微信小程序失败二三事,虽然功能都正常,但整体测试发现图片展示效果不佳.于是小菜整理了一个简单的小 ...

  6. android开发利用传感器实现微信的摇一摇功能

    现在的不少应用都用到了摇动手机改变内容的功能,比如微信中的"摇一摇"功能.前两天要实现这个功能,稍微看了一下关于传感器Sensor的内容. 传感器有几种类型:        方向传 ...

  7. manjaro deepin 闪屏_微信聊天“闪屏”特效,整蛊效果100分!

    ❐ 今天技能君给大家分享一个微信聊天的玩法,让消息变成闪瞎眼的闪屏特效表情包,魔性十足,绝对能让你眼前一亮!哈哈哈哈哈! 分割线 微信闪屏消息 支持苹果和安卓手机使用 在「运了个营」公众号回复&quo ...

  8. web移动端开发-将网站分享朋友圈、微信空间、朋友圈功能

    我们知道现在我们无法直接通过js直接跳转到微信和QQ等软件进行分享,但是现在像UC浏览器和QQ浏览器这样的主流浏览器自带一个分享工具,而他们也有自己定义的js接口.我们通过调用浏览器的接口去调用浏览器 ...

  9. 微信Android终端SDK新手使用指南

    http://open.weixin.qq.com/document/gettingstart/android/ 注:本文为微信Android终端开发工具的新手使用教程,只涉及教授SDK的使用方法,默 ...

  10. Android开发-UI界面--类微信页面设计

    Android开发-UI界面–类微信页面设计 一.功能说明 设计一个类似微信的主页面框架,UI布局为上中下结构,包含了四个tag页面 二.开发技术 ​ 本次用到了layout.xml.控件.监听.fr ...

最新文章

  1. 滴滴魅族手机人脸识别没有反应_魅族Note9发布,亮点不足,价格却很有诚意
  2. python在审计中的应用-基于python的自动化代码审计
  3. 手机python3_python3 简单手机验证码的实现
  4. Eclipse-Java代码规范和质量检查插件-FindBugs
  5. linqtoxml读写xml
  6. 系统架构设计师 - 面向服务架构 SOA
  7. MySQL的INSERT INTO··· ON DUPLICATE KEY UPDATE使用的几种情况
  8. JAVA中基本类型Boolean占几个字节
  9. 未来机器人哆拉A梦身上的高科技程序应用
  10. Android ActionBarSherlock使用教程
  11. 职业高中计算机专业目标,职业高中计算机专业开设的必要性
  12. conda安装包出现conda info (package)...的解决方法
  13. 网易云部分 解析歌词
  14. Bioedit 使用
  15. idea中svn颜色代表的文件状态
  16. 四面体体积公式 hdu 1411
  17. 图片批量加边框,详细操作步骤
  18. java后台实现HTTPS协议方法
  19. 【文末下载PPT】李中文:软件成分安全分析(SCA)能力的建设与演进
  20. GOOGLE搜索技巧

热门文章

  1. 环形电流计算公式_辨析!环形差模电感饱和电流的计算公式是什么?
  2. 人脸识别测试点整理思维导图方式
  3. 《C++ Primer 5th》知识点总结练习题解
  4. cai鸟驿站管理系统
  5. 值得收藏的几千T超多学习资源合集分享
  6. linux硬盘对拷ghost教程,用dd实现linux硬盘备份 GHOST
  7. 功率半导体器件的研究意义
  8. 倾斜摄影测量知识基础
  9. 我的区块链著作《区块链的数学原理》,今天正式出版和发行
  10. caxa发生文件读写异常_CAXA电子图板出错解决方法