Android截屏分享

来源:互联网 发布:mac应用程序删不掉 编辑:程序博客网 时间:2024/05/16 06:44

    最近项目需要实现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, "您没有安装微博客户端");        }}
具体参考微信、QQ、微博的官方文档及分享SDK。

Android开发交流群:576500546
 





1 0