2012-04-15 16 views
5

Kiedy próbuję umieścić mapę bitową na widget użyłem to:setImageViewBitmap nie pracuje w android widget

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

To działa na moim telefonie, ale nie na moim tablecie Galaxy i Galaxy Note,

jeśli skopiować theBitmap do nowego ARGB_4444 to działa na wszystkich urządzeniach:

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

Może to być to samo, co: http://code.google.com/p/android/issues/detail?id=8489? – Heinrisch

+0

Tak, widziałem to już wcześniej, ale potrzebuję ARGB_8888 ze względu na jakość i przejrzystość. – AVEbrahimi

+0

Najprawdopodobniej konieczne będzie wysłanie mniejszej ilości danych, co oznacza mniejszy lub zmniejszony obraz, lub przekazanie URI do obrazu. – wsanville

Odpowiedz

6

Po pierwsze, w ez swoje obejście, sprawdzić swoją moc logcat dla:

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

Prawdopodobnie uderzenie limit rozmiaru pliku dla transakcji IPC, która posiada swoje zmiany w hierarchii RemoteViews.

Podczas kopiowania bitmapę z Bitmap.Config.ARGB_4444 config, każdy piksel będzie reprezentowany z 2 bajtów, podczas gdy Bitmap.Config.ARGB_8888 (domyślny config na 2,3 i więcej) każdy piksel jest 4 bajty [Source].

Stosując obejście, podajesz połowę mniejszej ilości danych, a tym samym piszczą przez ograniczenie wielkości. This post sugeruje, że limit rozmiaru wynosi 1 MB, ale nie jestem pewien, czy to zależy od wersji systemu operacyjnego lub producenta.

Aktualizacja: Inne podejście do przechodzenia obrazu nie byłoby wysłać samą bitmapę, ale raczej zdać URI do pliku na dysku. Następnie musisz upewnić się, że inne procesy będą miały dostęp do odczytu pliku (na przykład program uruchamiający zostanie uruchomiony w innym procesie). Jeśli piszesz pliki w katalogu /data/data/my.package.name/, możesz to zrobić, podając MODE_WORLD_READABLE na . Na przykład:

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

Ten setUri działa jak urok. – Grimmace

+0

setUri naprawdę mi pomógł. Świetna rada ... dziękuję! – tronious