2017-08-22 1 views
0

J'essaie d'enregistrer une capture d'écran de l'ensemble ListView en tant que png dans la mémoire interne et l'envoyer à d'autres applications. Mais si je le refais, la capture d'écran n'est pas à jour. C'est la même capture d'écran, mais j'ai changé les données avant de l'envoyer.Sauvegarder Capture d'écran de ListView, Open Screenshot n'ouvre pas la dernière version

J'utilise le code suivant pour créer la capture d'écran:

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

Ce code enregistre la capture d'écran:

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

Ce code ouvre la capture d'écran et d'utiliser le shareintent pour l'envoyer:

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

Si j'essaie de partager à nouveau la Listview avec des données modifiées, cela envoie toujours une vieille capture d'écran.

Quelqu'un a une idée?

Merci beaucoup

+0

Je pense avoir trouvé la réponse dans les commentaires de https://stackoverflow.com/questions/9049143/android-share-intent-for-a-bitmap-is-it-possible-not-to-save-it -prior-sharing ---> "Le cache n'est pas mis à jour si le nom de fichier reste le même.J'ai résolu cela en supprimant le contenu du répertoire et en définissant le nom du fichier à la date actuelle en millisecondes - Gurupad Mamadapur 12 avr 17: 00 ". Je vais essayer cela et je vous contacterai. – Neo1989

Répondre

0

La solution est

« Le cache est pas mis à jour si le nom de fichier reste la même. Je résolu ce problème en supprimant le contenu du répertoire et le nom du fichier à la mise en . la date en millisecondes - Gurupad Mamadapur 12 avril à 17h00"

Je changé le code de la méthode de sauvegarde à:

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

Il retourne le nom de fichier, maintenant cela fonctionne.