📜  如何从 uri 中的 glide 中保存图像 (1)

📅  最后修改于: 2023-12-03 15:23:47.060000             🧑  作者: Mango

如何从 URI 中的 Glide 中保存图像

Glide 是一款强大的图片加载库,不仅可以加载网络上的图片,还支持从 URI 或本地资源中加载图片。在某些情况下,我们可能需要在应用程序中保存这些图片,例如用户需要将图片下载到本地并进行后续处理或分享等操作。

本文将介绍如何从 Glide 中保存 URI 图像并将其保存到本地文件系统中。

步骤说明
  1. 从 Glide 中加载图像

    以下是从 URI 中加载图像的示例代码:

    Glide.with(context)
            .load(uri)
            .into(imageView);
    

    Glide 可以轻松地从 URI 加载图像并将其显示在 ImageView 上。

  2. 将图像保存到本地文件系统中

    为了将图像保存到本地文件系统中,我们需要做以下操作:

    a. 向应用程序请求写入文件的权限。

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    在 AndroidManifest.xml 文件中添加此行,以获得写入文件的权限。

    b. 使用 Glide 的 downloadOnly() 方法将图像下载到本地文件系统中。

    Glide.with(context)
            .load(uri)
            .downloadOnly(new SimpleTarget<File>() {
                @Override
                public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) {
                    // resource 为下载保存的文件对象
                }
            });
    

    downloadOnly() 方法只会将图像下载到本地文件系统中,不会将其显示在 ImageView 上。在下载完成后,可以从 SimpleTargetonResourceReady() 方法中获取文件对象。

    c. 将文件复制到另一个位置以保留文件。

    private void copyFile(File sourceFile, File destFile) throws IOException {
        if (!destFile.exists()) {
            destFile.createNewFile();
        }
    
        FileChannel source = null;
        FileChannel destination = null;
        try {
            source = new FileInputStream(sourceFile).getChannel();
            destination = new FileOutputStream(destFile).getChannel();
            destination.transferFrom(source, 0, source.size());
        } finally {
            if (source != null) {
                source.close();
            }
            if (destination != null) {
                destination.close();
            }
        }
    }
    

    以上代码将给出一个复制文件的方法,以将文件保存到本地文件系统的另一个位置。

  3. 获取文件保存位置的 Uri。

    private Uri getOutputMediaFileUri() {
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), "MyAppName");
    
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                return null;
            }
        }
    
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "IMG_" + timeStamp + ".jpg");
        return Uri.fromFile(mediaFile);
    }
    

    以上代码将返回图像文件的 Uri,以便在其他应用程序中共享图像。

  4. 整合代码

    Glide.with(context)
            .load(uri)
            .downloadOnly(new SimpleTarget<File>() {
                @Override
                public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) {
                    File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyAppName");
                    if (!file.exists()) {
                        file.mkdir();
                    }
                    File newFile = new File(file, "img.jpg");
                    try {
                        if (!newFile.exists()) {
                            newFile.createNewFile();
                            copyFile(resource, newFile);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    Uri uri = Uri.fromFile(newFile);
                    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                    intent.setData(uri);
                    context.sendBroadcast(intent);
                }
            });
    

    此代码将从 Glide 中下载图像,将它复制到本地文件系统中,并使用 MediaScanner 通知图像库更新。

结论

通过使用 Glide 的 downloadOnly() 方法,我们可以轻松地将加载的图像保存到本地文件系统中,并在此处演示了如何将其复制到其他位置以保持图像,并使用 MediaScanner 更新图像库。