2012-04-15 9 views
5

Wenn ich versuche, ein Bitmap auf einem Widget habe ich benutzen:setImageViewBitmap arbeiten nicht in Android-Widget

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

Dies auf meinem Handy funktioniert, aber nicht auf meinem Galaxy Tablet oder Galaxy Note,

wenn ich kopiere theBitmap in eine neue ARGB_4444 dann funktioniert es auf allen Geräten:

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

Darf das gleich sein wie: http://code.google.com/p/android/issues/detail?id=8489? – Heinrisch

+0

Ja, ich habe das schon gesehen, aber ich brauche ARGB_8888 wegen der Qualität und Transparenz. – AVEbrahimi

+0

Sie müssen wahrscheinlich weniger Daten senden, was ein kleineres oder verkleinertes Bild bedeutet, oder den URI stattdessen an das Bild übergeben. – wsanville

Antwort

6

Zuerst w hne Ihr Problem zu umgehen, überprüfen Sie Ihren logcat Ausgang für:

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

Sie sind wahrscheinlich die Dateigrößenbeschränkung für die IPC-Transaktion schlagen, die Änderungen an die RemoteViews Hierarchie hält.

Wenn Sie die Bitmap mit der Bitmap.Config.ARGB_4444 Config kopieren, wird jedes Pixel mit 2 Bytes dargestellt werden, wohingegen Bitmap.Config.ARGB_8888 (die Standardkonfiguration auf 2.3 oder höher), wobei jedes Pixel 4 Bytes [Source] ist.

Wenn Sie Ihre Problemumgehung verwenden, übergeben Sie die Hälfte der Datenmenge und damit die maximale Größe. This post schlägt vor, dass die Größenbeschränkung 1 MB ist, aber ich bin mir nicht sicher, ob das je nach Betriebssystemversion oder Hersteller variiert.

Update: Ein anderer Ansatz zum Übergeben eines Bildes wäre, das Bitmap selbst nicht zu senden, sondern einen URI an die Datei auf dem Datenträger zu übergeben. Dann müssen Sie sicherstellen, dass andere Prozesse Lesezugriff auf Ihre Datei haben (der Launcher wird beispielsweise in einem anderen Prozess ausgeführt). Wenn Sie Dateien in Ihr Verzeichnis /data/data/my.package.name/ schreiben, können Sie dazu MODE_WORLD_READABLE unter Context.openFileOutput() angeben. Zum Beispiel:

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

Das SetUri funktioniert wie ein Zauber. – Grimmace

+0

setUri hat mir wirklich geholfen. Toller Rat ... Danke! – tronious