2015-06-23 19 views
8

Ho un problema con Picasso cercando di caricare immagini di grandi dimensioni da un Uri locale di formato contenuto: //com.android.providers.media.documents/document/ imageXXYYZZ sia dalla Galleria che dalla Camera Intent.Picasso non riesce a caricare immagini di grandi dimensioni (dalla fotocamera e Uri locali)

sto caricando le immagini con una chiamata standard:

Picasso.load(image_url) 
     .resize(600, 240) 
     .centerCrop() 
     .into(imageTarget); 

ho attaccato qui un Target e quando sto ottenendo l'errore onBitmapFailed(Drawable errorDrawable) innescato. Inoltre, quando accedo Picasso ottengo:

06-23 12:13:54.267 22393-22393/it.b3lab.friendipity D/Picasso﹕ Main  created  [R100] Request{content://com.android.providers.media.documents/document/image%3A13345 resize(600,240) centerCrop} 
06-23 12:13:54.277 22393-23010/it.b3lab.friendipity D/Picasso﹕ Dispatcher enqueued  [R100]+9ms 
06-23 12:13:54.285 22393-23038/it.b3lab.friendipity D/Picasso﹕ Hunter  executing [R100]+15ms 
06-23 12:13:54.813 22393-23010/it.b3lab.friendipity D/Picasso﹕ Dispatcher batched  [R100]+546ms for error 
06-23 12:13:55.014 22393-23010/it.b3lab.friendipity D/Picasso﹕ Dispatcher delivered [R100]+746ms 
06-23 12:13:55.024 22393-22393/it.b3lab.friendipity I/picasso﹕ failed to load bitmap 
06-23 12:13:55.024 22393-22393/it.b3lab.friendipity D/Picasso﹕ Main  errored  [R100]+756ms 

Questo accade solo come ho detto sopra, quando provo a caricare immagini di grandi dimensioni dalla galleria (al di sopra di circa 1 MB) e dalla volontà fotocamera quando si utilizza un hi-res fotocamera smartphone (nel mio caso è un Moto G in esecuzione su Android 5.0.1). Non ricevo questo errore utilizzando Samsung S2 su Android 4.4.

Qualsiasi aiuto sarebbe molto apprezzato! Grazie

risposta

-1

Prova questa:

Uri uri = Uri.parse(imageUri); 
Picasso.with(context) 
    .load(uri) 
    .fit() 
    .resize(600, 240) 
    .skipMemoryCache() 
    .transform(new DocumentExifTransformation(this, uri)) 
    .into(imageView); 

Se io non funziona dare uno sguardo qui https://github.com/square/picasso/issues/539

3

È necessario risolvere l'uri contenuto da un URI assoluto. Ad esempio:

public String getAbsolutePathFromURI(Uri contentUri) { 
    String[] proj = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = activity.getContentResolver().query(contentUri, proj, null, null, null); 
    int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    String path = cursor.getString(columnIndex); 
    cursor.close(); 
    return path; 
} 
+0

Grazie per voi rispondere, ma con questo metodo Picasso non caricare qualsiasi immagine. Immagino che il problema potrebbe essere che 'MediaStore.Images.Media.DATA' dovrebbe essere impostato in base a dove salvare l'immagine giusto? –

+0

corretto. Il nome della colonna potrebbe variare. – Moritz

+0

Quale colonna dovrei esaminare? Sto salvando l'immagine in 'File (Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES)', e il tipo di immagine è 'MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE' –

2

Ho trascorso molto tempo a capire come caricare un'immagine di grandi dimensioni nella vista dell'immagine utilizzando Picasso. Stava lavorando alla genesi ma non stava lavorando alla mia moto x. Così alla fine ho deciso di ridimensionare manualmente l'immagine all'interno di un'attività asincrona e quindi caricarla nella vista immagine senza utilizzare Picasso.

new AsyncTask<String, Void, Void>() { 
       @Override 
       protected Void doInBackground(String... params) { 
        String path = params[0]; 
        final Bitmap resizedBitmap = ImageUtils.getResizedBitmap(200, 200, PATH_TO_IMAGE); 
        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          imageView.setImageBitmap(resizedBitmap); 
         } 
        }); 
        return null; 
       } 
      }.execute(imageLoadPath); 

Potete trovare ImageUtils.getResizedBitmap() metodo here

0

Picasso fallisce ma questo funziona perfettamente

public static void resizeImage(String file, int maxTargetWidth, int maxTargetHeight) { 
    try { 
     InputStream in = new FileInputStream(file); 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(in, null, options); 
     close(in); 

     int inWidth = options.outWidth; 
     int inHeight = options.outHeight; 

     in = new FileInputStream(file); 
     options = new BitmapFactory.Options(); 
     options.inSampleSize = Math.max(inWidth/maxTargetWidth, inHeight/maxTargetHeight); 
     Bitmap roughBitmap = BitmapFactory.decodeStream(in, null, options); 

     Matrix m = new Matrix(); 
     RectF inRect = new RectF(0, 0, roughBitmap.getWidth(), roughBitmap.getHeight()); 
     RectF outRect = new RectF(0, 0, maxTargetWidth, maxTargetHeight); 
     m.setRectToRect(inRect, outRect, CENTER); 
     float[] values = new float[9]; 
     m.getValues(values); 

     Bitmap resizedBitmap = createScaledBitmap(roughBitmap, 
       (int) (roughBitmap.getWidth() * values[0]), (int) (roughBitmap.getHeight() * values[4]), 
       true); 

     resizedBitmap = rotateBitmap(file, resizedBitmap); 
     FileOutputStream out = new FileOutputStream(file); 
     resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out); 
     close(out); 
    } catch (Exception e) { 
     error(e); 
    } 
} 

private static Bitmap rotateBitmap(String src, Bitmap bitmap) { 
    try { 
     int orientation = new ExifInterface(src).getAttributeInt(TAG_ORIENTATION, 1); 
     Matrix matrix = new Matrix(); 
     if (orientation == ORIENTATION_NORMAL) return bitmap; 
     if (orientation == ORIENTATION_FLIP_HORIZONTAL) matrix.setScale(-1, 1); 
     else if (orientation == ORIENTATION_ROTATE_180) matrix.setRotate(180); 
     else if (orientation == ORIENTATION_FLIP_VERTICAL) { 
      matrix.setRotate(180); 
      matrix.postScale(-1, 1); 
     } else if (orientation == ORIENTATION_TRANSPOSE) { 
      matrix.setRotate(90); 
      matrix.postScale(-1, 1); 
     } else if (orientation == ORIENTATION_ROTATE_90) { 
      matrix.setRotate(90); 
     } else if (orientation == ORIENTATION_TRANSVERSE) { 
      matrix.setRotate(-90); 
      matrix.postScale(-1, 1); 
     } else if (orientation == ORIENTATION_ROTATE_270) { 
      matrix.setRotate(-90); 
     } else return bitmap; 
     try { 
      Bitmap oriented = createBitmap(bitmap, 0, 0, 
        bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
      bitmap.recycle(); 
      return oriented; 
     } catch (OutOfMemoryError e) { 
      error(e); 
     } 
    } catch (IOException e) { 
     error(e); 
    } 
    return bitmap; 
}