2012-08-11 14 views
6

Eseguo alcune operazioni (miglioramento della qualità e un po 'di ridimensionamento) su un oggetto Bitmap e quindi lo memorizzo utilizzando la funzione bitmap.compress() dando un nome file "myfile.png".Come caricare un ImageView con un file PNG senza utilizzare "setImageBitmap()"?

newbitmap = processImage(bitmap); 
FileOutputStream fos = context.openFileOutput("myfile.png", Context.MODE_PRIVATE); 
newbitmap.compress(CompressFormat.PNG, 100, fos); 

Ora voglio caricare questa immagine in un ImageView ma non posso usare setImageBitmap() per farlo. C'è qualche alternativa?

Il motivo per cui cant utilizzare setImageBitmap() è che sto usando RemoteViews per un widget, e usando il metodo bitmap porta a Impossibile errore Binder Transaction quando l'immagine è grande.

Ho cercato di impostare l'immagine URI utilizzando il codice qui sotto, ma l'immagine non viene caricata sul ImageView:

RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

File internalFile = context.getFileStreamPath("myfile.png"); 
Uri internal = Uri.fromFile(internalFile); 
rv.setImageViewUri(R.id.widgetImageView, internal); 
updateAppWidget(awID, rv); 

Grazie per il vostro aiuto!

+2

C'è un modo per inviare array di byte? Quindi decodificare la bitmap dall'altra parte. Non ne sono sicuro. – Shaiful

risposta

2

Mentre la memorizzazione di immagini nella memoria interna, è necessario impostare la modalità di MODE_WORLD_READABLE anziché MODE_PRIVATE. Questo perché un widget viene gestito dalla procedura della schermata iniziale e non può accedere ai file se non si imposta correttamente la modalità.

consentendo di sostituire questa linea:

FileOutputStream fos = context.openFileOutput("myfile.png", Context.MODE_PRIVATE); 

con:

FileOutputStream fos = context.openFileOutput("myfile.png", Context.MODE_WORLD_READABLE); 

Inoltre, utilizzare Uri.parse() e getPath() invece di fromFile(). fromFile() funziona solo su Android 2.2 e versioni successive.

Uri internal = Uri.Parse(internalFile.getPath()); 

Spero che questo aiuti!

1

Utilizzare rv.setUri(R.id.widgetImageView, "setImageURI", "file://myfile.png"); anziché rv.setImageViewUri(R.id.widgetImageView, internal); sembra caricare l'immagine correttamente. Potresti voler provare.

Se ciò non funziona, è comunque possibile ridimensionare l'immagine in modo da poter utilizzare il metodo setImageBitmap. Esempio:

public static Bitmap scaleDownBitmap(Bitmap photo, int newHeight, Context context) { 

final float densityMultiplier = context.getResources().getDisplayMetrics().density;   

int h= (int) (newHeight*densityMultiplier); 
int w= (int) (h * photo.getWidth()/((double) photo.getHeight())); 

photo=Bitmap.createScaledBitmap(photo, w, h, true); 

return photo; 
} 
Problemi correlati