从列表视图保存屏幕截图,打开屏幕截图不会打开最新版本



我尝试将整个ListView的屏幕截图保存为png在内部存储器中,并将其发送到其他应用程序。但是如果我再做一次,屏幕截图不是最新的。这是相同的屏幕截图,但我在发送之前更改了数据。

我使用以下代码创建屏幕截图:

public static Bitmap getWholeListViewItemsToBitmap(SearchableAdapter adapter, ListView listview ) {
int itemscount       = adapter.getCount();
int allitemsheight   = 0;
List<Bitmap> bmps    = new ArrayList<>();
for (int i = 0; i < itemscount; i++) {
View childView = adapter.getView(i, null, listview);
childView.measure(View.MeasureSpec.makeMeasureSpec(listview.getWidth(), View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight());
childView.setDrawingCacheEnabled(true);
childView.destroyDrawingCache();
childView.buildDrawingCache();
bmps.add(childView.getDrawingCache());
allitemsheight+=childView.getMeasuredHeight();
}
Bitmap bigbitmap    = Bitmap.createBitmap(listview.getMeasuredWidth(), allitemsheight, Bitmap.Config.ARGB_8888);
Canvas bigcanvas    = new Canvas(bigbitmap);
Paint paint = new Paint();
int iHeight = 0;
for (int i = 0; i < bmps.size(); i++) {
Bitmap bmp = bmps.get(i);
bigcanvas.drawBitmap(bmp, 0, iHeight, paint);
iHeight+=bmp.getHeight();
bmp.recycle();
bmp=null;
}
return bigbitmap;
}

此代码保存屏幕截图:

public static boolean storeScreenshot(Context context, Bitmap screenshot) {
try {
File imagePath = new File(context.getCacheDir(), "images");
if (!imagePath.exists())
imagePath.mkdirs();
File newFile = new File(imagePath, "image.png");
if (newFile.exists()){
newFile.delete();
newFile = new File(imagePath, "image.png");
}
FileOutputStream stream = new FileOutputStream(newFile.getAbsolutePath()); // overwrites this image every time
screenshot.compress(Bitmap.CompressFormat.PNG, 100, stream);
stream.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}

此代码打开屏幕截图并使用共享意图发送它:

try {
Helper.storeScreenshot(getApplicationContext(), Helper.getWholeListViewItemsToBitmap(adapter, listview));
File imagePath = new File(getApplicationContext().getCacheDir(), "images");
File screenshot = new File(imagePath, "image.png");
Uri contentUri = null;
if (screenshot.exists())
contentUri = FileProvider.getUriForFile(getApplicationContext(), "com.myApp.fileprovider", screenshot);
if (contentUri != null) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri));
shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
startActivity(Intent.createChooser(shareIntent, "App auswählen"));
}
}
catch(Exception e){
Toast.makeText(getApplicationContext(),"Fehler beim Erstellen des Screenshots!", Toast.LENGTH_LONG);
}

如果我尝试再次共享具有更改数据的列表视图,它会发送一些旧屏幕截图。

有人有想法吗?

多谢

解决方案是

"如果文件名保持不变,则缓存不会更新。我解决了这个 通过删除目录的内容并将文件名设置为 当前日期(以毫秒为单位(。– 古鲁帕德·马马达普尔 4 月 12 日 17:00">

所以我将保存方法的代码更改为:

public static String storeScreenshot(Context context, Bitmap screenshot) {
try {
File imagePath = new File(context.getCacheDir(), "images");
if (!imagePath.exists())
imagePath.mkdirs();
File[] imagePathDir = imagePath.listFiles();
if(imagePathDir != null){
for (File file : imagePathDir ){
file.delete();
}
}
File screenshotFile = new File(imagePath, System.currentTimeMillis()+".png");
FileOutputStream stream = new FileOutputStream(screenshotFile.getAbsolutePath());
screenshot.compress(Bitmap.CompressFormat.PNG, 100, stream);
stream.close();
return screenshotFile.getName();
} catch (IOException e) {
e.printStackTrace();
return "";
}

它返回文件名,现在它可以工作了。

相关内容

最新更新