2012-04-15 28 views
5

Quando provo a mettere una bitmap su un widget che ho usato questo:setImageViewBitmap non funziona in Android

theBitmap = Bitmap.createBitmap(WW, HH, 
      Bitmap.Config.ARGB_8888); 
. 
. 
// draw something using a canvas 
. 
. 
rviews.setImageViewBitmap(R.id.time,theBitmap); 

Questo funziona sul mio cellulare, ma non sul mio Galaxy tablet o Galaxy Note,

se copio theBitmap in un nuovo ARGB_4444 allora funziona su tutti i dispositivi:

Bitmap clone= theBitmap.copy(Bitmap.Config.ARGB_4444, false); // workaround 
rviews.setImageViewBitmap(R.id.time, clone); 
+0

Potrebbe essere lo stesso di: http://code.google.com/p/android/issues/detail?id=8489? – Heinrisch

+0

sì, l'ho visto prima, ma ho bisogno di ARGB_8888 per la qualità e la trasparenza. – AVEbrahimi

+0

Probabilmente dovrai inviare meno dati, ovvero un'immagine più piccola o sottoposta a downsampling oppure passare l'URI all'immagine. – wsanville

risposta

6

in primo luogo, w enza vostra soluzione, controllare l'output logcat per:

ERROR/JavaBinder(20204): !!! FAILED BINDER TRANSACTION !!! 

Probabilmente stai colpendo il limite di dimensione del file per l'operazione IPC che contiene le modifiche alla gerarchia RemoteViews.

Quando si copia il bitmap con il Bitmap.Config.ARGB_4444 configurazione, ogni pixel saranno rappresentati con 2 byte, mentre Bitmap.Config.ARGB_8888 (la configurazione di default su 2.3 in su) ogni pixel è di 4 byte [Source].

Utilizzando la soluzione alternativa, si passa la metà dei dati e, quindi, il cigolio per il limite di dimensioni. This post suggerisce che il limite di dimensione è 1MB, ma non sono sicuro se questo varia a seconda della versione del sistema operativo o del produttore.

Aggiornamento: Un approccio diverso al passaggio di un'immagine sarebbe quello di non inviare la bitmap stessa, ma piuttosto passare un URI al file sul disco. Quindi, è necessario assicurarsi che altri processi abbiano accesso in lettura al file (ad esempio, il programma di avvio verrà eseguito in un processo diverso). Se stai scrivendo file nella tua directory /data/data/my.package.name/, puoi farlo specificando MODE_WORLD_READABLE su Context.openFileOutput(). Ad esempio:

remoteViews.setUri(R.id.time, "setImageURI", Uri.fromFile(file)); 
+1

Quel setUri funziona come un fascino. – Grimmace

+0

setUri mi ha davvero aiutato. Ottimo consiglio ... grazie! – tronious