0

I try to save a screenshot of the whole ListView as png in the internal memory and send it to other apps. But if I do it again, the screenshot is not up to date. It's the same screenshot, but I changed the data before sending it.

I use the following code for creating the screenshot:

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

This Code saves the screenshot:

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

This Code opens the screenshot and use the shareintent to send it:

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

If i try to share the Listview again with changed data, it allways sends some old screenshot.

Anybody an idea?

Thanks a lot

Al Lelopath
  • 6,448
  • 13
  • 82
  • 139
Neo1989
  • 21
  • 3
  • I think i found the answer in the comments of https://stackoverflow.com/questions/9049143/android-share-intent-for-a-bitmap-is-it-possible-not-to-save-it-prior-sharing ---> "The cache isn't updated if the filename remains same. I solved this by deleting the contents of the directory and setting the filename to the current date in milliseconds. – Gurupad Mamadapur Apr 12 at 17:00". I will try this out and I'll get in touch. – Neo1989 Aug 23 '17 at 10:41

1 Answers1

0

The Solution is

"The cache isn't updated if the filename remains same. I solved this by deleting the contents of the directory and setting the filename to the current date in milliseconds. – Gurupad Mamadapur Apr 12 at 17:00"

So I changed the code of the save method to:

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

It's return the filename, now it works.

Neo1989
  • 21
  • 3