目錄
需求
需求分析
一、截圖控件生成圖片
二、將圖片保存至本地
2.1 權限
2.2 保存圖片
2.3 調用
三、分享
四、通過測試機型
需求
截圖當前頁面某個控件的內容,并且保存在本地,可分享。
需求分析
-
1.截圖控件生成圖片
-
2.保存至本地(需考慮版本兼容以及權限問題)
-
3.分享(a.調用系統分享,b.自己集成三方SDK)
分析完事,咱們根據分析來一步步實現
一、截圖控件生成圖片
????private?Runnable?toastRunnable?=?new?Runnable()?{public?void?run()?{Bitmap?bm?=?Bitmap.createBitmap(ll_dialog.getWidth(),?ll_dialog.getHeight(),Bitmap.Config.ARGB_8888);//創建畫布Canvas?canvas?=?new?Canvas(bm);//View渲染到的畫布。ll_dialog.draw(canvas);MLog.e("保存圖片");}};
-
1.圖片要在頁面中加載出來,需要獲取該控件的寬高。
-
2.根據空寂那的寬高設置Bitmap的
-
3.View渲染到的畫布,這個時候bm就生成成功了。
二、將圖片保存至本地
保存圖片的方式根據「版本和權限」分為兩種:
-
Android Q(Android 10) 以上
-
1、保存到應用的內部存儲空間 (內部存儲)
-
2、保存到 Android 系統設置的共享存儲空間(外部儲存)
-
-
Android Q(Android 10) 以下
-
獲取外部存儲目錄(本文用的是這個)
-
函數使用:getExternalStorageDirectory()
-
-
獲取外部存儲公共目錄
-
函數使用:getExternalStoragePublicDirectory()
-
-
圖片(包括照片和屏幕截圖),存儲在 DCIM/ 或 Pictures/ 目錄。
2.1 權限
「Android Q不再需要申請文件讀寫權限」,默認可以讀寫自己沙盒文件和公共媒體文件。所以Q以上不需要再動態申請文件讀寫權限。
所以我們只需要兼容10以下的權限申請即可。
public?class?PerUtils?{public?static?int?REQUEST_CODE_WRITE?=?1001;//校驗權限public?static?boolean?checkPerWRITE(Activity?activity)?{if?(Build.VERSION.SDK_INT?>=?Build.VERSION_CODES.R)?{return?true;}?else?{String[]?permissions?=?{Manifest.permission.READ_EXTERNAL_STORAGE,?Manifest.permission.WRITE_EXTERNAL_STORAGE};for?(String?str?:?permissions)?{if?(activity.checkSelfPermission(str)?!=?PackageManager.PERMISSION_GRANTED)?{activity.requestPermissions(permissions,?REQUEST_CODE_WRITE);return?false;}}}return?true;}/***?檢測請求結果碼判定是否授權**?@param?grantResults*?@return*/public?static?boolean?checkPermissionResult(int[]?grantResults)?{if?(grantResults?!=?null)?{for?(int?result?:?grantResults)?{if?(result?!=?PackageManager.PERMISSION_GRANTED)?{return?false;}}}return?true;}
}
Activity.class調用
????if?(PerUtils.checkPerWRITE(Activity.this)){saveBitmap();}@Overridepublic?void?onRequestPermissionsResult(int?requestCode,?@NonNull?String[]?permissions,?@NonNull?int[]?grantResults)?{super.onRequestPermissionsResult(requestCode,?permissions,?grantResults);try?{if?(requestCode?==?PerUtils.REQUEST_CODE_WRITE)?{if?(PerUtils.checkPermissionResult(grantResults))?{//授權成功saveBitmap();}else{//授權失敗}}}?catch?(Exception?e)?{}}
2.2 保存圖片
import?android.content.ContentResolver;
import?android.content.ContentValues;
import?android.content.Context;
import?android.content.Intent;
import?android.database.Cursor;
import?android.graphics.Bitmap;
import?android.net.Uri;
import?android.os.Build;
import?android.os.Environment;
import?android.provider.MediaStore;
import?android.util.Log;import?androidx.annotation.RequiresApi;import?java.io.File;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.io.OutputStream;public?class?ShareImageUtils?{//?Android?Q?以上@RequiresApi(api?=?Build.VERSION_CODES.Q)public?static?String?saveQUp(Bitmap?image,?Context?context,?String?fileName,?int?quality)?{//?文件夾路徑String?imageSaveFilePath?=?Environment.DIRECTORY_DCIM?+?File.separator;MLog.e("TAG",?"文件夾目錄?>>>?"?+?imageSaveFilePath);File?filePath?=?new?File(imageSaveFilePath);if?(!filePath.exists())?{filePath.mkdirs();}//?文件名字MLog.e("TAG",?"文件名字?>>>?"?+?fileName);ContentValues?contentValues?=?new?ContentValues();contentValues.put(MediaStore.MediaColumns.TITLE,?fileName);contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME,?fileName);contentValues.put(MediaStore.MediaColumns.MIME_TYPE,?"image/jpeg");contentValues.put(MediaStore.MediaColumns.DATE_TAKEN,?fileName);//該媒體項在存儲設備中的相對路徑,該媒體項將在其中保留contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH,?imageSaveFilePath);Uri?uri?=?null;OutputStream?outputStream?=?null;ContentResolver?localContentResolver?=?context.getContentResolver();try?{uri?=?localContentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,?contentValues);outputStream?=?localContentResolver.openOutputStream(uri);//?Bitmap圖片保存image.compress(Bitmap.CompressFormat.JPEG,?quality,?outputStream);outputStream.flush();outputStream.close();return?getRealPathFromURI(uri);}?catch?(Exception?e)?{e.printStackTrace();if?(uri?!=?null)?{localContentResolver.delete(uri,?null,?null);}return?"";}?finally?{image.recycle();try?{if?(outputStream?!=?null)?{outputStream.close();}}?catch?(IOException?e)?{e.printStackTrace();}}}//根據Uri獲取路徑private?static?String?getRealPathFromURI(Uri?contentURI)?{String?result;Cursor?cursor?=?MyApp.getAppContext().getContentResolver().query(contentURI,?null,?null,?null,?null);if?(cursor?==?null)?{?//?Source?is?Dropbox?or?other?similar?local?file?pathresult?=?contentURI.getPath();}?else?{cursor.moveToFirst();int?idx?=?cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);result?=?cursor.getString(idx);cursor.close();}return?result;}//?Android?Q?以下public?static?String?saveQNext(Bitmap?image,?Context?context,?String?fileName,?int?quality)?{String?path?=?Environment.getExternalStorageDirectory().getAbsolutePath()?+?File.separator;Log.i("TAG",?"saveQNext:?>>>?"?+?path);File?filePath?=?new?File(path);if?(!filePath.exists())?{filePath.mkdirs();}//?文件名稱Log.i("TAG",?"saveQNext:?"?+?fileName);File?file?=?new?File(path,?fileName);try?{FileOutputStream?fos?=?new?FileOutputStream(file);//?通過io流的方式來壓縮保存圖片image.compress(Bitmap.CompressFormat.JPEG,?quality,?fos);fos.flush();fos.close();//?保存圖片后發送廣播通知更新數據庫,不更新數據庫不會立即顯示Uri?uri?=?Uri.fromFile(file);context.sendBroadcast(new?Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,?uri));return?getRealPathFromURI(uri);}?catch?(IOException?e)?{e.printStackTrace();return?"";}}
}???????????
如此便將生成的Bitmap保存在本地了。
2.3 調用
????????????String?fileName?=?System.currentTimeMillis()?+?".jpg";String?path?=?"";//根據版本使用不同的方法if?(Build.VERSION.SDK_INT?>=?Build.VERSION_CODES.Q)?{path?=?ShareImageUtils.saveQUp(bm,?mContext,?fileName,?100);}?else?{path?=?ShareImageUtils.saveQNext(bm,?mContext,?fileName,?100);}if?(!MStringUtils.isNullOrEmpty(path))?{//保存成功}?else?{//保存失敗}
三、分享
調用系統圖片進行分享
????????//由文件得到uriUri?imageUri?=?Uri.fromFile(new?File(path));MLog.e("share",?"uri:"?+?path);Intent?shareIntent?=?new?Intent();shareIntent.setAction(Intent.ACTION_SEND);shareIntent.putExtra(Intent.EXTRA_STREAM,?imageUri);shareIntent.setType("image/*");mContext.startActivity(Intent.createChooser(shareIntent,?"Share"));
四、通過測試機型
-
1.Android 13 三星
-
2.Android 12 小米 K40
-
3.Android 7.1 模擬器
-
4.鴻蒙2.0系統 華為Play