当前位置: 首页>編程日記>正文

android分享截屏到微信,Android截屏分享功能

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截屏分享功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对亿速云网站的支持!


https://www.fengoutiyan.com/post/13665.html

相关文章:

  • 微信667官方版本安卓
  • 安卓444微信
  • 安卓截屏工具
  • 安卓手机截屏方法
  • 微信人数截图
  • 安卓怎么截图
  • 微信网页版
  • 微信截图
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機