android分享截屏到微信,Android截屏分享功能
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截屏分享功能相关推荐
- android sdk引入 微信分享_android 调用本地微信自定义多图分享朋友圈,可放在share sdk中一起使用...
最终的效果图,右下角微信多图为自定义调用系统分享,分享到微信. 在你能正常调用share sdk的时候想在原本的基础上加自定义的分享非常的简单. 它的官网已经给出了代码,但是给的不是很清楚. lz毕竟 ...
- android视频播放处理,安卓版微信视频播放全屏处理
问题 在安卓版微信里,video在播放的时候,如果在没有做任何处理的情况下,微信会全屏播放你的视频,会严重影响一些例如直播之类的边看视频边交互的H5应用(注:在iOS里可以通过playsinline( ...
- android指南针小程序,使用微信小程序实现指南针功能
使用微信小程序实现指南针功能 发布时间:2020-10-26 15:18:16 来源:亿速云 阅读:79 作者:Leah 本篇文章为大家展示了使用微信小程序实现指南针功能,内容简明扼要并且容易理解,绝 ...
- android分享截屏到微信,Android 微信分享长图 ScrollView 生成长截图 View变bitmap
这个不太难,绘制本页布局为图片 这样的功能 1.截屏 这个对于我这个CV战士来说,一见面我就觉得不可取了, ①.截屏 如果有三方库的话 最好了,没有 只能调 手机自带的,然而自带就意味着权限 ②.去除 ...
- android 分享小程序到微信,Android 分享微信小程序之图片优化
小菜上周接入了微信分享小程序的入口,基本功能实现都没问题,有需要的朋友可以了解一下 Android 分享微信小程序失败二三事,虽然功能都正常,但整体测试发现图片展示效果不佳.于是小菜整理了一个简单的小 ...
- android开发利用传感器实现微信的摇一摇功能
现在的不少应用都用到了摇动手机改变内容的功能,比如微信中的"摇一摇"功能.前两天要实现这个功能,稍微看了一下关于传感器Sensor的内容. 传感器有几种类型: 方向传 ...
- manjaro deepin 闪屏_微信聊天“闪屏”特效,整蛊效果100分!
❐ 今天技能君给大家分享一个微信聊天的玩法,让消息变成闪瞎眼的闪屏特效表情包,魔性十足,绝对能让你眼前一亮!哈哈哈哈哈! 分割线 微信闪屏消息 支持苹果和安卓手机使用 在「运了个营」公众号回复&quo ...
- web移动端开发-将网站分享朋友圈、微信空间、朋友圈功能
我们知道现在我们无法直接通过js直接跳转到微信和QQ等软件进行分享,但是现在像UC浏览器和QQ浏览器这样的主流浏览器自带一个分享工具,而他们也有自己定义的js接口.我们通过调用浏览器的接口去调用浏览器 ...
- 微信Android终端SDK新手使用指南
http://open.weixin.qq.com/document/gettingstart/android/ 注:本文为微信Android终端开发工具的新手使用教程,只涉及教授SDK的使用方法,默 ...
- Android开发-UI界面--类微信页面设计
Android开发-UI界面–类微信页面设计 一.功能说明 设计一个类似微信的主页面框架,UI布局为上中下结构,包含了四个tag页面 二.开发技术 本次用到了layout.xml.控件.监听.fr ...
最新文章
- 滴滴魅族手机人脸识别没有反应_魅族Note9发布,亮点不足,价格却很有诚意
- python在审计中的应用-基于python的自动化代码审计
- 手机python3_python3 简单手机验证码的实现
- Eclipse-Java代码规范和质量检查插件-FindBugs
- linqtoxml读写xml
- 系统架构设计师 - 面向服务架构 SOA
- MySQL的INSERT INTO··· ON DUPLICATE KEY UPDATE使用的几种情况
- JAVA中基本类型Boolean占几个字节
- 未来机器人哆拉A梦身上的高科技程序应用
- Android ActionBarSherlock使用教程
- 职业高中计算机专业目标,职业高中计算机专业开设的必要性
- conda安装包出现conda info (package)...的解决方法
- 网易云部分 解析歌词
- Bioedit 使用
- idea中svn颜色代表的文件状态
- 四面体体积公式 hdu 1411
- 图片批量加边框,详细操作步骤
- java后台实现HTTPS协议方法
- 【文末下载PPT】李中文:软件成分安全分析(SCA)能力的建设与演进
- GOOGLE搜索技巧