如何像whatsapp一样将图像缓存到特定文件夹

Posted

技术标签:

【中文标题】如何像whatsapp一样将图像缓存到特定文件夹【英文标题】:How to cache images to specific folder just like whatsapp 【发布时间】:2018-04-19 04:51:05 【问题描述】:

我正在使用 firebase 构建一个聊天应用程序。我正在使用 Glide 显示图像

Glide.with(getApplicationContext())
                        .load(imageUrl)
                        .crossFade()
                        .fitCenter()
                        .placeholder(R.drawable.loading)
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .into(imageView);

我想像 whatsapp 一样将图像保存到内部存储中的特定文件夹,并在保存后从那里加载图像。图像上传到 Firebase 存储,其 URL 保存在 Firebase 数据库中,我将它们加载到使用 Glide 的带有 url 的 imageView

【问题讨论】:

首先你需要下载图片并保存在你的文件夹中,然后像whatsapp一样显示在imageView中。 您想将图像存储在内部存储器或高速缓存中。因为 Whatsapp 将图像存储在内部存储中。 内部存储 看看this 【参考方案1】:
    private static final String IMAGE_DIRECTORY = "/yourfoldername/images";

    //this method return your folder image path
    public String saveImage(Bitmap myBitmap) 
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            File wallpaperDirectory = new File(
                    Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY);
            // have the object build the directory structure, if needed.
            if (!wallpaperDirectory.exists()) 
                wallpaperDirectory.mkdirs();
            
            try 
                File f = new File(wallpaperDirectory, Calendar.getInstance().getTimeInMillis() + ".jpg");
                f.createNewFile();
                FileOutputStream fo = new FileOutputStream(f);
                fo.write(bytes.toByteArray());
                MediaScannerConnection.scanFile(this,
                        new String[]f.getPath(),
                        new String[]"image/jpeg", null);
                fo.close();
                Log.d("TAG", "File Saved::--->" + f.getAbsolutePath());

                return f.getAbsolutePath();
             catch (IOException e1) 
                e1.printStackTrace();
            
            return "";
        


    // glide load image
    Glide.with(this)
        .load(imageUrl)
        .asBitmap()
        .into(new SimpleTarget<Bitmap>() 
            @Override
            public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) 

                String imagepath = saveImage(resource);
// Parse the gallery image url to uri
                Uri savedImageURI = Uri.parse(imagepath);



// Display the saved image to ImageView
            iv_saved.setImageURI(savedImageURI);

            
        );

【讨论】:

这段代码将在哪里加载图像没有提及任何imageView,我想在imageView中加载图像 glide onResourceReady 方法提供 Bitmap 所以,你可以使用这一行 imageview.setImageBitmap(resource); 图片是否会从内部存储中加载,我希望每次用户打开 Activity 时从内部存储中加载图像。 如果我将使用相同的代码,每次用户打开活动时都会下载并保存图像,但我希望它只发生一次,任何解决方案。我是

以上是关于如何像whatsapp一样将图像缓存到特定文件夹的主要内容,如果未能解决你的问题,请参考以下文章

像whatsapp一样修剪视频

像whatsapp一样加载联系人

之后如何在 android 中加载低质量然后高质量的图像(就像 WhatsApp 个人资料图像一样)

如何像 WhatsApp 一样在 PIP 模式下播放 YouTube 视频?

如何像在 whatsapp 中一样在 CollapsingToolbarLayout 中实现字幕

如何像 SwiftUI 中的 WhatsApp 一样在滑动时关闭键盘