2016-12-16 2 views
2

J'essaie de mettre en œuvre une fonctionnalité pour mon application qui permet aux utilisateurs de choisir une image de la galerie pour certaines propositions. J'ai besoin de sauvegarder cette image comme une nouvelle image avant d'appliquer les changements (filtres, recadrage, etc).Android Copier l'image de la galerie dans un nouveau fichier

Jusqu'à présent, je l'ai fait:

private void pickImageFromGallery(){ 
    /*Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("image/*"); 
    startActivityForResult(intent, GALLERY_SELECT_PICTURE);*/ 

    Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    getIntent.setType("image/*"); 

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    pickIntent.setType("image/*"); 

    Intent chooserIntent = Intent.createChooser(getIntent, ""); 
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent}); 

    startActivityForResult(chooserIntent, GALLERY_SELECT_PICTURE); 
} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if(resultCode == RESULT_OK){ 
     if(requestCode == GALLERY_SELECT_PICTURE){ 
      if(data == null){ 
       //TODO SHOW ERROR 
       return; 
      } 
      try { 
       Bitmap temporaryBitmap = MediaStore.Images.Media.getBitmap(myContext.getContentResolver(), data.getData()); 

       //Tried using inputStream and got the same result 
       //InputStream inputStream = myContext.getContentResolver().openInputStream(data.getData()); 
       //Bitmap temporaryBitmap = BitmapFactory.decodeStream(inputStream, null, options); 

       //Just return a file to save the bitmap into (I use the same code in different activities and it works perfectly) 
       capturedImage = FunctionUtil.getOutputMediaFile(ConstUtil.ids.MEDIA_TYPE_IMAGE); 

       FileOutputStream outputStream = new FileOutputStream(capturedImage);; 
       temporaryBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 

       //Just refresh the gallery so my new picture becomes available (I use the same function in different activities and it works fine) 
       FunctionUtil.refreshMediaGallery(capturedImage); 

      //HERE I CHECK THE PATH/GALLERY AND NOTICE THE FILE ISN'T SAVED 

      } catch (Exception e) { 
       e.printStackTrace(); 
       //TODO SHOW ERROR 
      } 

     }else if(requestCode == GALLERY_SELECT_VIDEO){ 

     } 
    } 
} 

Le code pour obtenir un nouveau fichier (FunctionUtil.getOutputMediaFile), le code pour rafraîchir la galerie (FunctionUtil.refreshMediaGallery) et le code pour enregistrer le bitmap (Bitmap.compress) fonctionne bien dans différentes parties de la même activité, mais avec des photos de la galerie Il ne suffit pas de les sauver!

Cela fonctionne parfaitement lorsque je prends une nouvelle image en utilisant l'API de l'appareil photo, puis décoder vers un bitmap mais cela ne fonctionne pas lorsque je choisis l'image de la galerie et décode en bitmap.

Répondre

2

Utilisez ce code

if(requestCode == GALLERY_SELECT_PICTURE){ 
     InputStream inputStream = getContentResolver() 
      .openInputStream(data.getData()); 
     FileOutputStream fileOutputStream = new FileOutputStream(
            outputFile); 
     copyStream(inputStream, fileOutputStream); 
     fileOutputStream.close(); 
     inputStream.close(); 
} 

et

public static void copyStream(InputStream input, OutputStream output) 
      throws IOException { 

     byte[] buffer = new byte[1024]; 
     int bytesRead; 
     while ((bytesRead = input.read(buffer)) != -1) { 
      output.write(buffer, 0, bytesRead); 
     } 
    }