android通用无感截图或图片保存到相册 不需要申请权限

描述

saveImageToGallery 方法将 Android 应用中的视图(View)保存为图片文件,并将其存储在设备的图库中。该方法通过将视图绘制到 Bitmap 上,生成图像,然后将其插入到 Android 系统的 MediaStore 中,以便能在图库中显示。(不需要申请动态权限,目前经测试适用android10~16, Android 10(API 29)及以上版本中,新增MediaStore对Scoped Storage的支持 )

方法

    /**
     * 无感保存图片
     * @param context 应用的上下文
     * @param view 要保存为图片的视图(ImageView/TextView/LinearLayout/.....)
     * @param imageName 保存图图的名称
     */
    public void saveImageToGallery(Context context, View view, String imageName) {
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);

        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.DISPLAY_NAME, "" + imageName); // 文件保存的名称
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); // 保存文件的类型
        values.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/MyApp/"); // Pictures/自定义路径 自定义路径可不要

        Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        try (OutputStream outStream = context.getContentResolver().openOutputStream(uri)) {
            if (outStream != null) {
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); // Compress and save
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

使用方式:
saveImageToGallery(context,yourView,"截图")

saveVideoToGallery 方法将 Android 应用中的视频保存到图库

    /**
     * 将视频文件保存到 Android 系统的图库中
     * @param context 应用的上下文
     * @param videoUri 是视频源文件的 URI,系统通过该 URI 读取视频数据
     * @param videoName 保存视频的名称
     */
    public void saveVideoToGallery(Context context, Uri videoUri, String videoName) {
        // 创建ContentValues对象,用于设置视频文件的相关信息
        ContentValues values = new ContentValues();
        values.put(MediaStore.Video.Media.DISPLAY_NAME, videoName + ".mp4"); // 设置视频的文件名
        values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); // 设置视频的MIME类型
        values.put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/MyApp/"); // 保存到指定文件夹

        // 插入到系统的MediaStore中,获取返回的URI
        Uri uri = context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

        try (InputStream inputStream = context.getContentResolver().openInputStream(videoUri);
             OutputStream outStream = context.getContentResolver().openOutputStream(uri)) {

            if (inputStream != null && outStream != null) {
                // 将视频流复制到系统媒体库
                byte[] buffer = new byte[1024];
                int length;
                while ((length = inputStream.read(buffer)) != -1) {
                    outStream.write(buffer, 0, length);
                }
                outStream.flush();  // 确保所有数据都写入输出流
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

使用方式:
Uri videoUri = Uri.parse("file:///path/to/your/video.mp4");  // 传入你的视频文件路径
saveVideoToGallery(context, videoUri, "MyVideoName");  // 保存视频到图库,文件名为"MyVideoName.mp4"

`android 6~9 仍需申请保存权限才可以保存

    /**
     *  Android 6.0 及以上和 10以下版本,需要动态请求权限,但需要确认在运行时的权限检查
     * @param context 应用的上下文
     * @param view 要保存为图片的视图(ImageView/TextView/LinearLayout/.....)
     * @param imageName 保存图图的名称
     */
    private void saveImageToExternalStorage(Context context, View view, String imageName) {
        // 权限管理:检查是否已经授予权限
        if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
            return;  // 如果权限未授予,直接返回
        }

        // 创建一个与 View 大小相同的 Bitmap
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);  // 将视图绘制到 Bitmap 上

        // 获取 Pictures 目录(针对 Android 10 以下)
        File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        if (!directory.exists()) {
            directory.mkdirs();  // 如果文件夹不存在,创建文件夹
        }

        // 创建文件
        File file = new File(directory, imageName + ".jpg");
        Log.d("Gallery", "file dir: " + file.getAbsolutePath());

        // 保存 Bitmap 到文件
        try (FileOutputStream fos = new FileOutputStream(file)) {
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);  // 压缩并保存图片
            fos.flush();

            // 扫描文件,通知系统图库更新
            MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, (path, uri) -> {
                Log.d("Gallery", "File scanned: " + path);
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

使用方式:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            // 在 Android 10 以下,未申请则先申请
            if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
            }else {
                // 已申请得到权限进行保存
                saveImageToExternalStorage(this, main, formattedDate);
            }
        } else {
            // Android 10 及以上处理(不在此示例中)
            saveImageToGallery(this,main,formattedDate);
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容