Android截屏分享功能
最近項目需要實現(xiàn)Android截屏分享功能,包括Android截屏獲取圖片、將圖片保存到本地、通知系統(tǒng)相冊更新、通過微信、QQ、微博分享截屏圖片,本篇文章作為總結(jié)回顧。
一、Android截屏獲取圖片
通過對view進行繪制,得到bitmap,可以對Activity、Fragment進行繪制,也可以對其他的View進行繪制。
1 Activity截圖(帶空白的狀態(tài)欄)
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截圖(去掉狀態(tài)欄)
public Bitmap shotActivityNoBar(Activity activity) {
// 獲取windows中最頂層的view
View view = activity.getWindow().getDecorView();
view.buildDrawingCache();
// 獲取狀態(tài)欄高度
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);
// 去掉狀態(tài)欄
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的方式只適用于靜態(tài)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();
}
}
三、通知系統(tǒng)相冊更新
public void AlbumScan(String fileName) {
MediaScannerConnection.scanFile(mActivity.getApplicationContext(), new String[]{fileName}, new String[]{"image/jpeg"}, null);
}
四、通過微信、QQ、微博分享
通過微信、QQ、微博分享的sdk實現(xiàn),如下:
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");
//設(shè)置縮略圖
Bitmap thumbBmp = Bitmap.createScaledBitmap(mWXShareBitmap,50,80,true);
mediaMessage.thumbData = bmpToByteArray(thumbBmp,true);
Log.i(TAG,"設(shè)置縮略圖");
//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;
}
<pre name="code" class="java">private String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}</pre>
<h3><a name="t8"></a><br>
2、分享到微信好友</h3>
<pre></pre>
<pre name="code" class="java"> public void shareWexinFriend() {
if (iShareService.isWeixinInstalled()) {
mWXShareBitmap = mLatesBitmap;
WXImageObject imgObject = new WXImageObject(mWXShareBitmap);
WXMediaMessage mediaMessage = new WXMediaMessage();
mediaMessage.mediaObject = imgObject;
//設(shè)置縮略圖
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, "您沒有安裝微信客戶端");
}
}</pre>
<h3><a name="t9"></a>3、分享到QQ好友</h3>
<pre name="code" class="java"> 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() {//分享后的回調(diào)
@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客戶端");
}
}</pre>
<pre></pre>
<pre></pre>
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, "您沒有安裝微博客戶端");
}
}
總結(jié)
以上所述是小編給大家介紹的Android截屏分享功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Jetpack?Compose慣性衰減動畫AnimateDecay詳解
這篇文章主要為大家介紹了Jetpack?Compose慣性衰減動畫AnimateDecay詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
Android 接收推送消息跳轉(zhuǎn)到指定頁面的方法
這篇文章主要介紹了Android 接收推送消息跳轉(zhuǎn)到指定頁面的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
Android編程實現(xiàn)TextView字體顏色設(shè)置的方法小結(jié)
這篇文章主要介紹了Android編程實現(xiàn)TextView字體顏色設(shè)置的方法,結(jié)合實例形式總結(jié)分析了Android針對TextView字體顏色設(shè)置的相關(guān)步驟與注意事項,具有一定參考借鑒價值,需要的朋友可以參考下2015-12-12
Android DownloadMananger管理器實現(xiàn)下載圖片功能
Android DownloadMananger類似于下載隊列,管理所有當前正在下載或者等待下載的項目,他可以維持HTTP鏈接,并且在隊列中的下載項目一旦失敗,還能自動重新下載2023-01-01
Android實現(xiàn)手機聯(lián)系人分欄效果
這篇文章主要為大家詳細介紹了Android實現(xiàn)手機聯(lián)系人分欄效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
使用Android Studio實現(xiàn)為系統(tǒng)級的app簽名
這篇文章主要介紹了使用Android Studio實現(xiàn)為系統(tǒng)級的app簽名,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03

