java - 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,我传递了一个位图,因为对于我的一生,我无法弄清楚如何从他们那里获取一个URL
而Google Places API
不是他们的代码在
Google Place Photos中提供。
我对编码比较陌生,所以这是我试图拼凑我需要学习的更多内容。我只是不知道要搜索什么,所以我在这里问,根据我从答案中收集的新信息,我可以替换
MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
在我的代码中,以便我的照片不会保存到我手机的照片中?
最终更新
我最终重写了很多与此相关的代码并删除了此代码。我最终创建了一个arraylist
类来保存数组列表,runtime
它让我删除了我出于无知而编写的大部分额外代码。
解决方案
我真的不知道它是否会解决您的问题,但是您将图像存储在设备本地存储中,
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);
}
推荐阅读
- angular - “(TS)找不到@angular/core ...”Asp.NET Core Angular项目错误
- reactjs - 单击链接时如何关闭侧边栏?
- javascript - 需要与导入
- r - 如何使用 readLines 和 R 中的循环从多个 (435) 网页获取信息?
- react-native - React Navigation 5.x 中的任务:react-native-screens:javaPreCompileDebug 错误
- python - “如何解决 'HTTP 403: Forbidden' 错误?”
- html - 应用背景滤镜:blur(); 到 SVG 路径
- java - 从头开始赢
- javascript - 将 div 元素的高度锁定为其子元素的大小
- c# - HtmlAgilityPack - 删除所有属性