Android 控件截图保存本地并分享

目录

需求

需求分析

一、截图控件生成图片

二、将图片保存至本地

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();
    }

    @Override
    public 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 path
            result = 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 {
                //保存失败
            }

三、分享

调用系统图片进行分享

        //由文件得到uri
        Uri 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Maui是一种开源的移动应用开发框架,可用于创建跨平台的Android和iOS应用程序。要在Maui Android应用程序中保存Excel文件到本地,可以按照以下步骤进行操作: 1. 首先,确保你的Maui Android项目已经设置好并且可以正常运行。 2. 创建一个Excel文件,可以使用Microsoft Excel或其他应用程序创建一个包含数据的Excel文件。 3. 在Maui Android项目中添加一个用于保存Excel文件的按钮或其他触发保存操作的控件。 4. 在按钮的点击事件处理程序中,执行以下步骤: a. 使用C#代码创建一个新的ExcelPackage实例,该实例将用于保存Excel文件。 ``` using OfficeOpenXml; using System.IO; // 创建一个新的Excel文件 ExcelPackage excelPackage = new ExcelPackage(); ``` b. 向Excel文件添加工作表,并在工作表中填充数据。 ``` // 添加一个新的工作表 ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add("Sheet1"); // 在工作表中填充数据 worksheet.Cells["A1"].Value = "姓名"; worksheet.Cells["B1"].Value = "年龄"; // 填充其他数据,可以使用循环或其他方式 // 保存Excel文件 excelPackage.SaveAs(new FileInfo("路径/文件名.xlsx")); ``` c. 关闭ExcelPackage实例以释放资源。 ``` excelPackage.Dispose(); ``` 上述步骤将创建一个新的Excel文件并将其保存到指定的路径。请注意替换代码中的"路径/文件名.xlsx"为你想要保存的Excel文件的实际路径和文件名。 通过执行上述步骤,你的Maui Android应用程序将能够保存Excel文件到本地。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅次

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值