首页 > 解决方案 > android 应用程序关闭后从设备中删除照片

问题描述

编辑: 前一天我问了一个类似的问题,我根据自那个问题以来收集的信息写了这篇文章 - First Cache Question。我知道它们很相似,但这个问题更简洁以避免额外的信息。我也不想删除该帖子,因为它已被回答,即使答案还不够。

我使用 recyclerview 来显示我从google places api. 我知道我不允许在运行时之外合法地缓存照片。直到我随机打开手机的图库看到很多我从谷歌获得的照片的副本时,我才知道发生了这种情况。

我的第一个猜测是我的使用Picasso是问题,所以我添加了代码来修复它, .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) .networkPolicy(NetworkPolicy.NO_CACHE) 找到这些StackOverflow非常简单,但这并没有解决任何问题,只是现在它似乎只下载一次,尤其是当我删除它们时。我相信我消除了可能的问题,并概述了这个问题的最后一个问题。

 private Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

@Override
public void onBindViewHolder(@NonNull VenueViewHolder venueViewHolder, int i) {
    Collections.sort(vIAL, (o1, o2) -> o1.getVenueName().compareToIgnoreCase(o2.getVenueName()));
    VenueItem currentItem = vIAL.get(i);

    Picasso.with(context)
            .load(getImageUri(context, currentItem.getVenueImage()))
            .fit()
            .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
            .networkPolicy(NetworkPolicy.NO_CACHE)
            .into(venueViewHolder.vIV);
    venueViewHolder.vTV.setText(currentItem.getVenueName());
    Log.i(TAG, "The photo should have been on screen");
}

URI方法getImageUri是我发现的另一个问题的答案,我需要一个URI来实现Picasso库,以便我可以在显示照片之前对其进行操作。

我的问题是 - 应用关闭时如何删除照片?

更新: 我改变了我的策略,看看会发生什么并使用Glide

 @Override
public void onBindViewHolder(@NonNull VenueViewHolder venueViewHolder, int i) {
    Collections.sort(vIAL, (o1, o2) -> o1.getVenueName().compareToIgnoreCase(o2.getVenueName()));
    VenueItem currentItem = vIAL.get(i);

     Glide.with(context)
            .load(currentItem.getVenueImage())
            .into(venueViewHolder.vIV);
    venueViewHolder.vTV.setText(currentItem.getVenueName());
}

它给出了一个致命的错误

E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 4344032)

这是其中一个错误,在我第一次运行此新代码时并没有发生,但在我第二次和第三次运行时情况变得更糟。

我根据我早期从@Padmini S 得到的答案更改了我的代码,但是他们在该load部分中使用了一个 url,我传递了一个位图,因为对于我的一生,我无法弄清楚如何从他们那里获取一个URLGoogle Places API不是他们的代码在 Google Place Photos中提供。

我对编码比较陌生,所以这是我试图拼凑我需要学习的更多内容。我只是不知道要搜索什么,所以我在这里问,根据我从答案中收集的新信息,我可以替换

MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);

在我的代码中,以便我的照片不会保存到我手机的照片中?

最终更新 我最终重写了很多与此相关的代码并删除了此代码。我最终创建了一个arraylist类来保存数组列表,runtime它让我删除了我出于无知而编写的大部分额外代码。

标签: javaandroiduripicasso

解决方案


我真的不知道它是否会解决您的问题,但是您将图像存储在设备本地存储中,

private Uri getImageUri(Context inContext, Bitmap inImage) {

    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);

}

我从未使用过 google places api,但通常 apis 会返回一个图像 url,您可以将该 url 存储在 POJO 类中,并直接在 recyclerview 行图像视图中显示它,就像我在下面的代码中所做的那样,

public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
        viewHolder.description.setText(links.get(i).getTitle());
        Glide.with(context).load(links.get(i).getImage_url()).into(viewHolder.image);
}

推荐阅读