java - Android 应用程序关闭后从设备中删除照片

标签 java android uri picasso

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

我使用 recyclerview 来显示从 googleplaces 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());
}

它给出了一个 fatal error

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

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

我根据@Padmini S早期得到的答案改变了我的代码,但他们在load部分使用了一个url,我传递了一个位图,因为我一生都无法弄清楚了解如何从 Google Places API 获取 URL 而不是它们提供的代码 Google Place Photos

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

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

在我的代码中,这样我的照片就不会保存到手机的照片中?

最终更新 我最终重写了很多围绕此的代码并删除了这段代码。我最终创建了一个 arraylist 类来在运行时期间保存数组列表,它让我删除了我出于无知而编写的大部分额外代码。

最佳答案

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

private Uri getImageUri(Context inContext, Bitmap inImage) {

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

}

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

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

关于java - Android 应用程序关闭后从设备中删除照片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57260827/

相关文章:

java - ArrayList和Concurrent HashMap并发修改异常

java - 我应该如何在 Android 中给图像圆角?

android - 在 android 中获取 uri.parse() 的文件路径

wpf - 使用 WPF DataGridHyperLinkColumn 项打开 Windows 资源管理器并打开文件

java - 无法在 Liferay Portlet 中部署具有 Elasticsearch 依赖项的 war

java - 如果所有键都是唯一的, map 的 put 是否需要同步?

java - 使用 mvc 时将在不同类上创建的 jpanel 添加到主视图页面

android - 如何从我的应用程序数据文件夹中获取任何文件的路径

android - 是否可以在不调用notify方法的情况下更新RecyclerView中的View?

php - 不能在写上下文中使用方法返回值