当前位置:   article > 正文

Android 控件截图保存本地并分享_android 截屏 压缩转图片

android 截屏 压缩转图片

目录

需求

需求分析

一、截图控件生成图片

二、将图片保存至本地

2.1 权限

2.2 保存图片

2.3 调用

三、分享

四、通过测试机型


需求

截图当前页面某个控件的内容,并且保存在本地,可分享。

需求分析

  • 1.截图控件生成图片

  • 2.保存至本地(需考虑版本兼容以及权限问题)

  • 3.分享(a.调用系统分享,b.自己集成三方SDK)

分析完事,咱们根据分析来一步步实现

一、截图控件生成图片

  1.     private Runnable toastRunnable = new Runnable() {
  2.         public void run() {
  3.             Bitmap bm = Bitmap.createBitmap(ll_dialog.getWidth(), ll_dialog.getHeight(),
  4.                     Bitmap.Config.ARGB_8888);
  5.             //创建画布
  6.             Canvas canvas = new Canvas(bm);
  7.             //View渲染到的画布。
  8.             ll_dialog.draw(canvas);
  9.             MLog.e("保存图片");
  10.         }
  11.     };
  • 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以下的权限申请即可。

  1. public class PerUtils {
  2.     public static int REQUEST_CODE_WRITE = 1001;
  3.     //校验权限
  4.     public static boolean checkPerWRITE(Activity activity) {
  5.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
  6.             return true;
  7.         } else {
  8.             String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
  9.             for (String str : permissions) {
  10.                 if (activity.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
  11.                     activity.requestPermissions(permissions, REQUEST_CODE_WRITE);
  12.                     return false;
  13.                 }
  14.             }
  15.         }
  16.         return true;
  17.     }
  18.     /**
  19.      * 检测请求结果码判定是否授权
  20.      *
  21.      * @param grantResults
  22.      * @return
  23.      */
  24.     public static boolean checkPermissionResult(int[] grantResults) {
  25.         if (grantResults != null) {
  26.             for (int result : grantResults) {
  27.                 if (result != PackageManager.PERMISSION_GRANTED) {
  28.                     return false;
  29.                 }
  30.             }
  31.         }
  32.         return true;
  33.     }
  34. }
  35.         

Activity.class调用

  1.     if (PerUtils.checkPerWRITE(Activity.this)){
  2.         saveBitmap();
  3.     }
  4.     @Override
  5.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  6.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  7.         try {
  8.             if (requestCode == PerUtils.REQUEST_CODE_WRITE) {
  9.                 if (PerUtils.checkPermissionResult(grantResults)) {
  10.                     //授权成功
  11.                     saveBitmap();
  12.                 }else{
  13.                     //授权失败
  14.                 }
  15.             }
  16.         } catch (Exception e) {
  17.         }
  18.     }

2.2 保存图片

  1. import android.content.ContentResolver;
  2. import android.content.ContentValues;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.database.Cursor;
  6. import android.graphics.Bitmap;
  7. import android.net.Uri;
  8. import android.os.Build;
  9. import android.os.Environment;
  10. import android.provider.MediaStore;
  11. import android.util.Log;
  12. import androidx.annotation.RequiresApi;
  13. import java.io.File;
  14. import java.io.FileOutputStream;
  15. import java.io.IOException;
  16. import java.io.OutputStream;
  17. public class ShareImageUtils {
  18.     // Android Q 以上
  19.     @RequiresApi(api = Build.VERSION_CODES.Q)
  20.     public static String saveQUp(Bitmap image, Context context, String fileName, int quality) {
  21.         // 文件夹路径
  22.         String imageSaveFilePath = Environment.DIRECTORY_DCIM + File.separator;
  23.         MLog.e("TAG""文件夹目录 >>> " + imageSaveFilePath);
  24.         File filePath = new File(imageSaveFilePath);
  25.         if (!filePath.exists()) {
  26.             filePath.mkdirs();
  27.         }
  28.         // 文件名字
  29.         MLog.e("TAG""文件名字 >>> " + fileName);
  30.         ContentValues contentValues = new ContentValues();
  31.         contentValues.put(MediaStore.MediaColumns.TITLE, fileName);
  32.         contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
  33.         contentValues.put(MediaStore.MediaColumns.MIME_TYPE"image/jpeg");
  34.         contentValues.put(MediaStore.MediaColumns.DATE_TAKEN, fileName);
  35.         //该媒体项在存储设备中的相对路径,该媒体项将在其中保留
  36.         contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, imageSaveFilePath);
  37.         Uri uri = null;
  38.         OutputStream outputStream = null;
  39.         ContentResolver localContentResolver = context.getContentResolver();
  40.         try {
  41.             uri = localContentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
  42.             outputStream = localContentResolver.openOutputStream(uri);
  43.             // Bitmap图片保存
  44.             image.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
  45.             outputStream.flush();
  46.             outputStream.close();
  47.             return getRealPathFromURI(uri);
  48.         } catch (Exception e) {
  49.             e.printStackTrace();
  50.             if (uri != null) {
  51.                 localContentResolver.delete(uri, nullnull);
  52.             }
  53.             return "";
  54.         } finally {
  55.             image.recycle();
  56.             try {
  57.                 if (outputStream != null) {
  58.                     outputStream.close();
  59.                 }
  60.             } catch (IOException e) {
  61.                 e.printStackTrace();
  62.             }
  63.         }
  64.     }
  65.     //根据Uri获取路径
  66.     private static String getRealPathFromURI(Uri contentURI) {
  67.         String result;
  68.         Cursor cursor = MyApp.getAppContext().getContentResolver().query(contentURI, nullnullnullnull);
  69.         if (cursor == null) { // Source is Dropbox or other similar local file path
  70.             result = contentURI.getPath();
  71.         } else {
  72.             cursor.moveToFirst();
  73.             int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
  74.             result = cursor.getString(idx);
  75.             cursor.close();
  76.         }
  77.         return result;
  78.     }
  79.     // Android Q 以下
  80.     public static String saveQNext(Bitmap image, Context context, String fileName, int quality) {
  81.         String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
  82.         Log.i("TAG""saveQNext: >>> " + path);
  83.         File filePath = new File(path);
  84.         if (!filePath.exists()) {
  85.             filePath.mkdirs();
  86.         }
  87.         // 文件名称
  88.         Log.i("TAG""saveQNext: " + fileName);
  89.         File file = new File(path, fileName);
  90.         try {
  91.             FileOutputStream fos = new FileOutputStream(file);
  92.             // 通过io流的方式来压缩保存图片
  93.             image.compress(Bitmap.CompressFormat.JPEG, quality, fos);
  94.             fos.flush();
  95.             fos.close();
  96.             // 保存图片后发送广播通知更新数据库,不更新数据库不会立即显示
  97.             Uri uri = Uri.fromFile(file);
  98.             context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
  99.             return getRealPathFromURI(uri);
  100.         } catch (IOException e) {
  101.             e.printStackTrace();
  102.             return "";
  103.         }
  104.     }
  105. }           

如此便将生成的Bitmap保存在本地了。

2.3 调用

  1.             String fileName = System.currentTimeMillis() + ".jpg";
  2.             String path = "";
  3.             //根据版本使用不同的方法
  4.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
  5.                 path = ShareImageUtils.saveQUp(bm, mContext, fileName, 100);
  6.             } else {
  7.                 path = ShareImageUtils.saveQNext(bm, mContext, fileName, 100);
  8.             }
  9.             if (!MStringUtils.isNullOrEmpty(path)) {
  10.                 //保存成功
  11.             } else {
  12.                 //保存失败
  13.             }

三、分享

调用系统图片进行分享

  1.         //由文件得到uri
  2.         Uri imageUri = Uri.fromFile(new File(path));
  3.         MLog.e("share""uri:" + path);
  4.         Intent shareIntent = new Intent();
  5.         shareIntent.setAction(Intent.ACTION_SEND);
  6.         shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
  7.         shareIntent.setType("image/*");
  8.         mContext.startActivity(Intent.createChooser(shareIntent, "Share"));

四、通过测试机型

  • 1.Android 13 三星

  • 2.Android 12 小米 K40

  • 3.Android 7.1 模拟器

  • 4.鸿蒙2.0系统 华为Play

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/262000
推荐阅读
相关标签
  

闽ICP备14008679号